- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在尝试破解游戏的 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
对象是我偷来的并被传递给例如dofile
。 L->l_G->_defaultmeta.value.gc
此时怎么会是 NULL
呢?我可以在这里做些什么或者对此有什么解释吗?
我知道我在这里尝试破解的游戏使用“ 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/
最近开始学习oracle和sql。 在学习的过程中,我遇到了几个问题,我的 friend 在接受采访时被问到这些问题。 SELECT * FROM Employees WHERE NULL IS N
这个问题在这里已经有了答案: Can we subtract NULL pointers? (4 个回答) 关闭 2 个月前。 是否定义了NULL - NULL? (char *)NULL - (ch
是否有推荐的方法(根据 .net Framework 指南)检查 null,例如: if (value == null) {//code1} else {//code2} 或 if (value !=
我正在尝试将值插入数据库,但出现这样的错误任何人都可以告诉我为什么该值为空,如下所示: An exception occurred while executing 'INSERT INTO perso
这个问题在这里已经有了答案: String concatenation with a null seems to nullify the entire string - is that desire
您好,我正在 Android 联系人搜索模块中工作。我正在查询下方运行。 cur = context.getContentResolver().query(ContactsContract.Data.
下面的 SQL 表定义说明了从我的 MYSQL 数据库创建表的语句之一,该数据库是由我公司的前开发人员开发的。 DROP TABLE IF EXISTS `classifieds`.`category
我主要有应用程序开发背景。在编程语言中 variable == null或 variable != null有效。 当涉及到 SQL 时,以下查询不会给出任何语法错误,但也不会返回正确的结果。 sel
我在尝试检查某些元素是否为 NULL 时遇到段错误或不。任何人都可以帮忙吗? void addEdge(int i, int j) { if (i >= 0 && j > 0)
在 SQL 服务器中考虑到以下事实:Col1 和 Col2 包含数值和 NULL 值 SELECT COALESCE(Col1,Col2) 返回一个错误:“COALESCE 的至少一个参数必须是一个不
在 SQL 服务器中考虑到以下事实:Col1 和 Col2 包含数值和 NULL 值 SELECT COALESCE(Col1,Col2) 返回一个错误:“COALESCE 的至少一个参数必须是一个不
下面查询的关系代数表达式是什么?我找不到“Is Null”的表达式。 SELECT reader.name FROM reader LEFT JOIN book_borrow ON reader.ca
我正在尝试使用三元运算符来检查值是否为 null 并返回一个表达式或另一个。将此合并到 LINQ 表达式时,我遇到的是 LINQ 表达式的 Transact-SQL 转换试图执行“column = n
我在给定的代码中看到了以下行: select(0, (fd_set *) NULL, (fd_set *) NULL, (fd_set *) NULL, &timeout); http://linux
var re = /null/g; re.test('null null'); //> true re.test('null null'); //> true re.test('null null')
这个问题在这里已经有了答案: 关闭 13 年前。 我今天避开了一场关于数据库中空值的激烈辩论。 我的观点是 null 是未指定值的极好指示符。团队中有意见的其他每个人都认为零和空字符串是可行的方法。
由于此错误,我无法在模拟器中运行我的应用: Error:null value in entry: streamOutputFolder=null 或 gradle - Error:null value
我正在尝试在 Android 应用程序中创建电影数据库,但它返回错误。知道这意味着什么吗? public Cursor returnData() { return db.query(TABLE
我一直在检查浏览器中的日期函数以及运行时间 new Date (null, null, null); 在开发工具控制台中,它给出了有效的日期 Chrome v 61 回归 Sun Dec 31 189
为什么 NA==NULL 会导致 logical (0) 而不是 FALSE? 为什么 NULL==NULL 会导致 logical(0) 而不是 TRUE? 最佳答案 NULL 是一个“零长度”对象
我是一名优秀的程序员,十分优秀!