能否在 Lua 中跳转到实际的虚拟地址?

假设我知道 DLL 文件中函数的地址:

0x7A0BA032: hello_world() { printf("Hello World!"); }

有可能从 Lua 字节码中调用这个函数吗?

预编译的 Lua 文件:hello_world.lua

JMP 0x7A0BA032

然后像这样调用:

dofile "hello_world.lua"

这样做有成功的机会吗?

假设我不能使用 loadlib() 或任何加载 DLL 并调用其方法的东西。

点赞
用户734069
用户734069

这会有可能工作吗?

这是完全不可能的。无论是在 Lua 还是 LuaJIT,甚至在 C 中都不行。现代操作系统往往随机化代码加载的内存地址,就是为了防止外部代码静态地了解特定函数的地址。至少,您需要在运行时查询该函数的地址。但常规的 Lua 并不提供这个功能。Lua 模块可以提供加载 DLL 和从 Lua 进行调用的能力。LuaJIT 有一个类似的 FFI。但是所有这些都依赖于对函数地址的运行时查询。因此,它们永远无法编入编译的 Lua 脚本中。

2016-05-09 20:00:13