将Lua表的地址转换为Lua表。

假设我有一个表的地址 - 我应该如何将表变量“转换”为它? 我不关心“不良实践”或崩溃,因为这只是一个个人问题。

我想做这样的事情 lua_table tab = *(lua_table*)0xaddr ... 但是在 Lua 全局环境内。

我知道这有多糟糕,但我真的需要知道这是否可能。 这可能不是我尝试做的事情的最佳方法,但我非常确定它是最容易的方法,并且如果这是可能的话,它将起作用。 我正在使用 Lua 5.1.4。

点赞
用户734069
用户734069

为了实现你想要的功能,你必须要:

  1. 获取 Lua 表格数据结构的指针。我相信你已经通过某种方式获得了这个指针,但 Lua 并没有任何保证你获得的指针是真正指向表格数据结构的。它可能指向其他东西。因此,你需要深入 Lua 的内部来确保你获取的指针确实指向实际对象的指针。

  2. 找到正确的类型,该类型在 Lua 的内部声明。Lua 使用一种 C 类型来表示主表格数据结构(Lua 是用 C 而不是 C++ 编写的)。你需要找到这个结构体定义并使用它。

    对 Lua 库的简要检查表明,主表格数据结构在 lobject.h 文件中定义,名称为 Table

  3. 找到 Lua 内部 API 以正确地“操作”这个表格。它显然是一种哈希表,但你需要使用 Lua 的函数来实际做一些事情。

    对 Lua 内部的简要检查表明,这些代码可能在 ltable.h 文件中找到。但是,可能有更多的 API。此外,请注意,许多 API 需要一个 lua_State,因此它们可能会对堆栈进行一些处理。

    你还需要查阅 Lua 的 API,以便学习如何使用它们而不“破坏”表格。Lua 可能对某些函数何时调用,它们之间的顺序或其他一些事情有特定的期望。如果违反这些期望,则可能会遇到某些危险。

即使这样做:

Table tab = *(Table*)0xaddr

也永远不会起作用。或者至少不会像你期望的那样。Lua 是用 C 编写的。这意味着 Table 不会像 C++ 值类型一样工作。复制它只会进行位拷贝。因此修改 tab 只会修改你本地副本的这些值。如果这些值是指向其他数据结构的指针,那么可能没有问题,因为你的指针和原始指针指向相同的数据结构。但是如果你执行一些操作,例如更改表格中的 Table::flags 字段,那么存储在 Lua 中的表格不会受到影响,只有你本地的 tab 副本会受到影响。

你必须将对象作为指针而不是原始副本来操作它。

Table *tab = reinterpret_cast<Table*>(0xaddr);
2016-01-04 19:21:12
用户646619
用户646619

Lua 没有暴露出任何用于实现此功能的 API。

修改您的设计比尝试强行实现此功能要简单得多,且更加健壮。

2016-01-04 19:21:14