Почему L-> l_G -> _ defaultmeta.value.gc всегда NULL?
В настоящее время я пытаюсь взломать Lua-реализацию игры, чтобы расширить встроенные методы для игровых моддеров.
Для этого я пытаюсь перехватить указатель на действительныйlua_State
структурировать и регистрировать новые библиотеки вместе с ним.
Сейчас я перепробовал несколько мест / этапов целевой игры, чтобы перехватить программу и украстьlua_State
от него. Моей первой попыткой был заход вluaL_openlib()
в самом концеbase_open()
, Это был первый раз, когда я получил это исключение нулевого указателя:
Exception thrown: read access violation.
L->l_G->_defaultmeta.value.gc was nullptr.
Из комментариев видно, чтоЕгор Сктиптунов предложил мне перенести точку входа моего хака в функцию уровня пользователя. Поскольку я знаю, что одна из первых вызываемых функцийdofile()
Я укралlua_State
оттуда и передал его в мою DLL.
То, что вы видите здесь, это фактический код из моей внедренной DLL, который я пытался выполнить в концеbase_open()
а такжеdofile()
(На уровне пользователя):
EXTERN_DLL_EXPORT void initialize(lua_State *L)
{
if (initialized == true) {
return;
}
initialized = true;
lua_pushvalue(L, LUA_GLOBALSINDEX); // Works
luaL_openlib(L, "ext", extension_funcs, 0); // Crashes with "L->l_G->_defaultmeta.value.gc was nullptr"
}
Ниже вы можете найти скриншот сеанса отладки и место, где генерируется исключение.lua_State
объект тот, который я украл и был передан, например,dofile
, Как это может бытьL->l_G->_defaultmeta.value.gc
являетсяNULL
на данный момент? Могу ли я здесь что-нибудь сделать или есть какое-то объяснение этому?
Я знаю, что игра, которую я пытаюсь взломать, используетнемного другая версия Lua 5.0", но может ли быть так, что они изменили способ работы сборщика мусора или что-то? Потому что есть ..
Еще одна вещь, которую нужно иметь в виду:
В игру добавлен Lua. DLL, которую я создал, имеетсвой собственный сборник Lua 5.0.1, Есть конечно шанс, что разработчики игр тогда решили не простоsligtly"изменить Луа, но вместо этого изменитьмного, Я всегда просто предполагал, что все, что разработчики сделали, это удалили некоторые библиотеки по умолчанию и добавили некоторые другие встроенные функции, такие какLOG()
, WARN()
и т. д. Было бы странно, если бы они изменили код в ядре Lua - но я говорю вам, что кто-то, кто имеет представление о Lua, может рассматривать это как объяснение исключения, которое я получаю здесь.