0

我想知道如何从使用 Lua 的程序中获取 Lua_State 的地址。我对汇编程序并不是很熟悉,但我对 C++ 非常了解。

这就是源代码的样子:

#pragma comment(lib, "lua51.lib")
#pragma comment(lib, "lua5.1.lib")

extern "C" {
#include <lua.h>
#include <lauxlib.h>
}

lua_State* L; // I want to get address of it but I haven't got source for remote program.
              // So I could use this state in my DLL injected to remote program.

int main()
{
     L = lua_open();
     //////loops here and functions registers.

     lua_close(L);
     return 1;
}

我在 IDA 中自己尝试过,但并不知道如何找到它。在 IDA 中它看起来像这样

   .text:00401000 ; =============== S U B R O U T I N E =======================================
.text:00401000
.text:00401000
.text:00401000 ; int __cdecl main(int argc, const char **argv, const char **envp)
.text:00401000 _main           proc near               ; CODE XREF: __tmainCRTStartup+10Ap
.text:00401000
.text:00401000 argc            = dword ptr  4
.text:00401000 argv            = dword ptr  8
.text:00401000 envp            = dword ptr  0Ch
.text:00401000
.text:00401000                 push    esi
.text:00401001                 call    _luaL_newstate
.text:00401006                 mov     esi, ds:__imp__Sleep@4 ; Sleep(x)
.text:0040100C                 mov     ?L@@3PAUlua_State@@A, eax ; lua_State * L
.text:00401011
.text:00401011 loc_401011:                             ; CODE XREF: _main+15j
.text:00401011                 push    64h             ; dwMilliseconds
.text:00401013                 call    esi ; Sleep(x)  ; Sleep(x)
.text:00401015                 jmp     short loc_401011
.text:00401015 _main           endp
.text:00401015
.text:00401015 ; ---------------------------------------------------------------------------
.text:00401017                 align 4


.text:00401018 ; =============== S U B R O U T I N E =======================================
.text:00401018
.text:00401018 ; Attributes: thunk
.text:00401018
.text:00401018 _luaL_newstate  proc near               ; CODE XREF: _main+1p
.text:00401018                 jmp     ds:__imp__luaL_newstate
.text:00401018 _luaL_newstate  endp
.text:00401018
.text:0040101E
4

1 回答 1

0

如果您双击或将鼠标悬停在 上?L@@3PAUlua_State@@A,您应该会得到 的地址L。你知道这个内存位置是L因为.?L@@3PAUlua_State@@Astruct lua_State * L

在上面的示例中,由于您有符号,因此很容易以L这种方式找到。如果要分析没有符号的二进制文件,则必须依赖上下文。一般来说,这需要对汇编有更多的了解,因为您可能需要能够执行诸如跟踪函数参数的使用和识别结构之类的事情。假设您可以找到或创建 Lua 的FLIRT签名,将大大简化此过程。

于 2013-05-08T22:38:57.947 回答