gpt4 book ai didi

lua - 为什么 L->l_G->_defaultmeta.value.gc 总是 NULL?

转载 作者:行者123 更新时间:2023-12-01 23:16:35 24 4
gpt4 key购买 nike

我目前正在尝试破解游戏的 Lua 实现,以便扩展游戏模组制作者的内置方法。

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

我现在已经尝试了目标游戏的多个位置/阶段来拦截程序并从中窃取lua_State。我的第一次尝试是在 base_open() 的最后调用 luaL_openlib() 。这是我第一次遇到这个空指针异常:

Exception thrown: read access violation.

L->l_G->_defaultmeta.value.gc was nullptr.

从评论中可以看到,Egor Sktiptunoff建议我将 hack 的入口点移至用户级函数中。因为我知道,第一个被调用的函数是 dofile(),所以我从那里窃取了 lua_State 结构并将其传递给我的 DLL。

您在这里看到的是我注入(inject)的 DLL 中的实际代码,我尝试在 base_open()dofile() (用户级)末尾执行该代码:

EXTERN_DLL_EXPORT void initialize(lua_State *L)
{
if (initialized == true) {
return;
}

initialized = true;

lua_pushvalue(L, LUA_GLOBALSINDEX); // Works
luaL_openlib(L, "ext", extension_funcs, 0); // Crashes with "L->l_G->_defaultmeta.value.gc was nullptr"
}

下面您可以找到调试 session 的屏幕截图以及引发异常的位置。 lua_State 对象是我偷来的并被传递给例如dofileL->l_G->_defaultmeta.value.gc 此时怎么会是 NULL 呢?我可以在这里做些什么或者对此有什么解释吗?

enter image description here

我知道我在这里尝试破解的游戏使用“ slightly different version of Lua 5.0 ”,但他们是否改变了垃圾收集的工作方式或某物?因为有..

<小时/>

还有一点要记住:

游戏已编译Lua。我创建的 DLL 有它自己的 Lua 5.0.1 编译。当然有可能,当时的游戏开发者决定不只是“稍微”改变Lua,而是大量改变它。我总是假设所有开发人员所做的只是删除一些默认库并添加一些其他内置函数,例如 LOG()WARN() 等。如果他们更改了 Lua 核心中的代码,那会很奇怪 - 但我告诉你,这样对 Lua 有了解的人可能会认为这是对我在这里遇到的异常的解释。

最佳答案

看起来你的 sizeof(lua_TObject) 确实与游戏的 Lua 使用的不匹配。造成这种情况不同的一个常见原因是使用 float (或整数)作为数字而不是默认的 double 。我个人没有在 Lua 5.0 中进行此更改,但看起来可以通过将 LUA_NUMBER 定义为 float(或 int)来完成。对于 int/float ,大小应为 8,但对于 double 则为 16(不是 12,因为 double 需要对齐)。

lua_TObject 由类型标记 (tt) 和值联合组成。该联合中最大的部分通常是 8 字节 double (如果是 64 位,则为 8 字节指针,但这是 32 位)。其他所有内容通常都是 4 个字节。监 window 口中的大部分内容看起来都非常有效,但 lua_Objects 看起来很粗略。并且 _defaultmeta 直接位于另一个 lua_TObject 之后,因此如果 lua_TObject 的大小不同,您的代码和游戏代码将对该成员的位置产生分歧。 _defaultmeta 的 tt 应该是 5 (LUA_TTABLE),但你的看起来可能是一个指针。此外,top、base 和 _registry 的 tt 字段指示将具有指针类型值的其他类型,但 gc 字段指示您的代码看到的是小整数而不是指针。这些可能是相邻 lua_TObject 的 tt 字段。最重要的是,top 和 base 没有相同的 16 字节对齐方式,并且它们应该是指向相同 lua_TObject 数组的指针。

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

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

(但我认为将 double 更改为 float 可能就足够了。)

它还可以帮助您在自己的 Lua 构建中添加调试检查,这样可以在出现任何有趣的情况时更快地向您发出警告,至少在开始时是这样。看起来 Lua 5.0 允许为此类目的 #define lua_assert 和 api_check。

祝你好运!

关于lua - 为什么 L->l_G->_defaultmeta.value.gc 总是 NULL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41080633/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com