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.