Почему 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, может рассматривать это как объяснение исключения, которое я получаю здесь.

Ответы на вопрос(2)

Ваш ответ на вопрос