Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lua 为什么L->;l_G->_defaultmeta.value.gc是否始终为空?_Lua_Garbage Collection - Fatal编程技术网

Lua 为什么L->;l_G->_defaultmeta.value.gc是否始终为空?

Lua 为什么L->;l_G->_defaultmeta.value.gc是否始终为空?,lua,garbage-collection,Lua,Garbage Collection,我目前正在尝试破解一个游戏的Lua实现,以扩展游戏修改器的内置方法 为了做到这一点,我尝试劫持一个指向有效lua_Statestruct的指针,并向它注册新的库 我现在已经尝试了目标游戏的几个地方/阶段来拦截程序并从中窃取lua_State。我的第一次尝试是在base\u open()。这是我第一次遇到空指针异常: Exception thrown: read access violation. L->l_G->_defaultmeta.value.gc was nullptr.

我目前正在尝试破解一个游戏的Lua实现,以扩展游戏修改器的内置方法

为了做到这一点,我尝试劫持一个指向有效
lua_State
struct的指针,并向它注册新的库

我现在已经尝试了目标游戏的几个地方/阶段来拦截程序并从中窃取
lua_State
。我的第一次尝试是在
base\u open()。这是我第一次遇到空指针异常:

Exception thrown: read access violation.

L->l_G->_defaultmeta.value.gc was nullptr.
从您可以看到的评论中,这向我建议将我的hack的入口点移动到一个用户级函数中。因为我知道,第一个被调用的函数是
dofile()
,所以我从那里偷了
lua\u State
结构,并将它传递给了我的DLL

您在这里看到的是我在
base\u open()
dofile()
末尾尝试执行的注入DLL中的实际代码(用户级):

EXTERN\u DLL\u导出无效初始化(lua\u状态*L)
{
如果(已初始化==true){
返回;
}
初始化=真;
lua_pushvalue(L,lua_GLOBALSINDEX);//有效
luaL_openlib(L,“ext”,extension_funcs,0);//因“L->L_G->_defaultmeta.value.gc为null ptr”而崩溃
}
下面您可以找到调试会话的屏幕截图以及引发异常的位置。
lua_State
对象是我偷的并被传递到的对象,例如
dofile
。在这个时间点,
L->L\u G->\u defaultmeta.value.gc
怎么会是
NULL
?我能在这里做些什么,或者对此有什么解释吗

我知道我在这里尝试破解的游戏使用了“”,但可能是它们改变了垃圾收集的工作方式还是什么?因为有


还有一件事需要记住:


游戏中有Lua编译。我创建的DLL有自己的LUA5.0.1编译。当然,有一个机会,当时的游戏开发者决定不只是“轻微地”改变Lua,而是改变它很多。我总是假设开发人员所做的只是删除一些默认库,并添加一些其他内置函数,如
LOG()
WARN()
,如果他们改变了Lua的核心代码,那将是很奇怪的,但是我告诉你,只有一个有关于Lua的想法的人会认为这是我在这里得到的例外的解释。

< P>如果你只想添加一些全局函数,只需设置一个名为
myfuncs
的合适的
luaL_reg
结构,然后调用

lua\u pushvalue(L,lua\u GLOBALSINDEX);
luaL_openlib(L,NULL,myfuncs,0);/*将lib打开到全局表中*/
在您自己的C代码中执行此操作。
无需更改
lbaselib.c

的源代码。看起来您的lua\u TObject大小与游戏的lua使用的不匹配。这种情况不同的一个常见原因是使用浮点数(或整数)作为数字,而不是默认的双精度。我个人还没有在Lua5.0中做过这样的更改,但看起来可以通过将Lua_数定义为float(或int)来完成。对于int/float,大小应该是8,但是对于double,它是16(不是12,因为double需要对齐)

lua_TObject由一个类型标记(tt)和一个值联合组成。这个联合体中最大的东西通常是8字节双精度(如果是64位,则是8字节指针,但这是32位)。其他内容通常为4字节。手表窗口中的大部分内容看起来都很有效,但lua_对象看起来很粗略。而且defaultmeta直接位于另一个lua_TObject之后,因此如果lua_TObject的大小不同,您的代码和游戏代码将不同意此成员的位置。默认meta的tt应该是5(LUA_TTABLE),但您的看起来可能是一个指针。此外,top、base和_注册表的tt字段表示其他类型的指针类型值,但gc字段表示代码看到的是小整数而不是指针。这些可能是相邻lua_对象的tt字段。最重要的是,top和base没有相同的16字节对齐方式,它们应该是指向同一lua_TObject数组的指针

如果您继续遇到问题,请尝试在修改之前检查您从游戏中获得的lua_状态对象,并将其与您在自己创建的干净初始化lua_状态中看到的lua_状态进行比较。显然,指针地址可能不同,游戏可能会设置一些您没有设置的内容,但一些不一致的内容可能仍然会跳出

如果您可以访问游戏使用的已编译Lua块,还可以查看这些块的标题信息。这将包含一些有助于匹配Lua配置的信息,包括sizeof(Lua_编号)

(但我认为,将双打改为浮动可能就足够了。)

它还可以帮助您将调试检查添加到您自己的Lua构建中,以便在出现任何有趣的业务时(至少在开始时)能够更快地向您发出警告。看起来Lua5.0允许Lua_断言和api_检查被定义用于这样的目的


祝你好运

嗨!问题是,我正在修改一个可执行文件,而我的hack的入口点当前位于
lbaselib.c
base\u open
中。我在上面展示的代码将只与我试图实现的C代码等价。所以,我唯一需要改变的就是调用
lua\u pushvalue
?你能解释一下这是怎么回事,为什么我要打电话给他吗?这是否与我遇到的空指针问题有关?我只是想了解到底是什么在这里失败,为什么失败DI添加了
lua\u pushvalue(L,lua\u GLOBALSINDEX)
但是程序崩溃了