Por que L-> l_G -> _ defaultmeta.value.gc sempre é NULL?

Atualmente, estou tentando hackear a implementação de Lua de um jogo para estender os métodos internos para modders de jogos.

Para fazer isso, tento seqüestrar um ponteiro para um válidolua_State estruturar e registrar novas bibliotecas com ele.

Eu já tentei vários lugares / estágios do jogo alvo para interceptar o programa e roubarlua_State a partir dele. Minha primeira tentativa foi entrarluaL_openlib() no final debase_open(). Esta foi a primeira vez que recebi essa exceção de ponteiro nulo:

Exception thrown: read access violation.

L->l_G->_defaultmeta.value.gc was nullptr.

Dos comentários que você pode ver, queEgor Sktiptunoff sugeriu que eu movesse o ponto de entrada do meu hack para uma função no nível do usuário. Como eu sei, uma das primeiras funções a ser chamada édofile()Eu roubei olua_State struct a partir daí e passou para a minha DLL.

O que você vê aqui é o código real da minha DLL injetada que tentei executar no final debase_open() edofile() (nível de usuário):

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"
}

Abaixo, você encontra a captura de tela de uma sessão de depuração e o local onde a exceção é lançada. olua_State objeto que roubei e que foi passado para, por exemplodofile. Como pode ser issoL->l_G->_defaultmeta.value.gc éNULL neste momento? Existe algo que eu possa fazer aqui ou há alguma explicação para isso?

Eu sei que o jogo que eu tento invadir aqui usa um "versão ligeiramente diferente do Lua 5.0", mas será que eles mudaram a maneira como a coleta de lixo funciona ou algo assim? Porque existe ..

Mais uma coisa a ter em mente:

Lua compilou o jogo. A DLL que eu criei temsua própria compilação do Lua 5.0.1. É claro que há uma chance de que os desenvolvedores de jogos na época decidissem não apenas "sligtly"mude Lua, mas mudemuito. Sempre suponho que todos os desenvolvedores fizeram a remoção de algumas bibliotecas padrão e adicionaram outras funções internas, comoLOG(), WARN(), etc. Seria estranho se eles mudassem o código no núcleo de Lua - mas eu lhe digo que apenas alguém que tenha uma idéia sobre Lua pode considerar isso como uma explicação para a exceção que estou recebendo aqui.

questionAnswers(2)

yourAnswerToTheQuestion