У меня есть несколько строк взлома, которые я написал:
Вот определение макро luaL_openlib
который на самом деле является указателем на функцию 0x0090DE00
:
/*
Type definitions for function signatures
*/
typedef int (luaL__openlib) (lua_State *L, const char *libname, const luaL_reg *l, int nup);/*
Intercepting macros for function calls.
*/
#define luaL_openlib(L, libname, l, nup) ((luaL__openlib*) 0x0090DE00)(L, libname, l, nup)
Вот как я это называю:
static int luaAi_helloworld(lua_State *L)
{
MessageBox(NULL, L"Hello World", L"", MB_OK);
return 1;
}
static const luaL_reg ai_funcs[] = {
{ "helloworld", luaAi_helloworld },
{ NULL, NULL }
};
void open_ailib(lua_State *L)
{
luaL_openlib(L, "ai", ai_funcs, 0);
}
Приведенный выше код компилируется в DLL. DLL загружается моим целевым процессом, который .exe-файл я немного взломал, чтобы сделать это.
Тем не мение: Это работает!
В результате я могу позвонить ai.helloworld()
в сценарии компьютерной игры, чтобы показать окно сообщения «Hello World».
Теперь код выглядит немного сложнее, но он делает то же самое:
static int scse_helloworld (lua_State *L)
{
MessageBox(NULL, L"Hello World", L"", MB_OK);
return 1;
}
static luaL_reg scselib[] = {
{"helloworld", scse_helloworld},
{NULL, NULL}
};
/*
Type definitions for function signatures
*/
typedef int (luaL__openlib)(lua_State *L, const char *libname, const luaL_reg *l, int nup);
/*
Intercepting macros for function calls.
*/
#define luaL_openlib2(L, libname, l, nup) ((luaL__openlib*) 0x0090de00)(L, libname, l, nup)
SCSE_API int luaopen_scse(lua_State *L)
{
SIZE_T numBytes;
const int num_bytes = 16;
unsigned char hook[num_bytes];
HANDLE process = GetCurrentProcess();
ReadProcessMemory(process, (LPVOID)(0x0090de00), &hook, sizeof(hook), &numBytes);
LOGGER.LogMessage("Memory at 0x0090de00 is:\n\n");
for (int i = 0; i < num_bytes; i++) {
LOGGER.LogMessage("%2X ", hook[i]);
}
// Link lua linker functions with Supreme Commander lua functions
if(LuaLinker::Link())
{
LOGGER.LogMessage("Lua linker functions successefully linked with Supreme Commander Lua functions.\n");
LOGGER.LogMessage("luaL_openlib2()");
luaL_openlib2(L, "scse", scselib, 0);
// Spoiler: This is never reached
LOGGER.LogMessage("SCSE library successefully opened.\n");
}
else {
LOGGER.LogMessage("ERROR: Couldn't link lua linker functions with Supreme Commander Lua functions!\n");
}
return 1;
}
Кроме того, я зачитываю память на 0x0090de00
, Я могу дать вам результат заранее:
Memory at 0x0090de00 is:
53 8B 5C 24 14 55 56 8B 74 24 10 57 8B 7C 24 18
это правильно, как мы можем видеть с OllyDbg — хотя я уже знал, что:
Итак, почему ты здесь?
Проблема в том, что любой, может быть, вы видели комментарий спойлера выше, что сообщение журнала после luaL_openlib2
никогда не печатается. В моем лог-файле все, что я вижу, это:
Lua linker functions successefully linked with Supreme Commander Lua functions.
luaL_openlib2()
Игра загружает стартовый экран, но перестает функционировать. Кнопки не отображаются и т. Д. Не вылетает, но в основном мертв. Когда я закрываю его, все, что я получаю, — это последний призыв о помощи:
Я ищу объяснение — я не понимаю, почему это не работает. Все, что у меня есть, это предположение:
Я загружаю DLL не загружен мной. На самом деле он загружается скриптовым движком игры. На самом деле, не должно быть возможности загрузить DLL из игры. Тем не менее, поскольку приведенный выше код выполняется, DLL является загружен. Так что, если DLL загружена, может быть, память испортилась? Нет, по крайней мере, не первые 16 байтов функции, на которую я нацеливаюсь, так что я предполагаю, что с остальным тоже все будет хорошо, кроме того, что на самом деле должно это изменить — ничего не может.
Я не уверен, что кто-нибудь может помочь мне здесь, но это кажется сложным вопросом для меня.
Кто-нибудь?
Кстати: извините за название — не стесняйтесь вносить предложения, и если вы не пытались Верховный главнокомандующий все же, просто получите это!
Если игровое приложение загрузило DLL, она запускается в отдельном процессе. Ваше приложение работает в другом процессе. В первом случае DLL и ваше приложение работали в одном и том же процессе.
Других решений пока нет …