Я хотел бы знать, как можно получить адрес 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
Если вы дважды щелкнете или наведите курсор мыши на ?L@@3PAUlua_State@@A
Вы должны получить адрес L
, Вы знаете, что это место в памяти L
так как ?L@@3PAUlua_State@@A
это искаженное имя за struct lua_State * L
,
В приведенном выше примере легко найти L
таким образом, потому что у вас есть символы. Если бы вы анализировали двоичный файл, для которого у вас нет символов, вам пришлось бы полагаться на контекст. В общем, это требует большего понимания сборки, поскольку вам, возможно, понадобится уметь выполнять такие вещи, как отслеживание использования аргументов функции и определить структуры. имеющий Флирт подписи Lua значительно упростит этот процесс, если вы сможете найти или создать их.
Других решений пока нет …