Получение адреса указателя состояния Lua для получения результата во внешней программе

Я хотел бы знать, как можно получить адрес Lua_State из программы, которая использует Lua. Я не очень разбираюсь в Ассемблере, но хорошо знаю 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, но не знал, как его найти.
В МАР это выглядит так

   .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

0

Решение

Если вы дважды щелкнете или наведите курсор мыши на ?L@@3PAUlua_State@@AВы должны получить адрес L, Вы знаете, что это место в памяти L так как ?L@@3PAUlua_State@@A это искаженное имя за struct lua_State * L,

В приведенном выше примере легко найти L таким образом, потому что у вас есть символы. Если бы вы анализировали двоичный файл, для которого у вас нет символов, вам пришлось бы полагаться на контекст. В общем, это требует большего понимания сборки, поскольку вам, возможно, понадобится уметь выполнять такие вещи, как отслеживание использования аргументов функции и определить структуры. имеющий Флирт подписи Lua значительно упростит этот процесс, если вы сможете найти или создать их.

0

Другие решения

Других решений пока нет …