我试图通过引入新的内置方法和功能来破解游戏(虽然不是为了作弊),以便使用套接字与游戏进行通信。这是我想要完成的一个小的“伪代码”示例:
在 Lua 代码中,我正在调用my_hack()并传递当前的游戏状态:
GameState = {}
-- Game state object to be passed on
function GameState:new()
-- Data
end
local gameState = GameState:new()
-- Collect game state data and pass it to 'my_hack' ..
my_hack(gameState)
并且在my_hack对象内部被送走:
int my_hack(lua_State * l)
{
void* gameState= lua_topointer(l, 1);
// Send the game state:
socket->send_data(gameState);
return 0;
}
现在,最大的问题是如何引入my_hack()游戏?
我假设,所有内置函数都必须保存在某种查找表中。由于所有 Lua 代码都被解释,诸如此类的函数import必须是静态可用的,对吗?如果这是正确的,那么找出此代码所在的位置应该“足够” ,以便将我的代码走私到允许我调用my_hack()Lua 脚本的游戏中。
应该有两个选择:第一个是构建的 Lua 嵌入在可执行文件中并且是完全静态的,第二个是所有 Lua 代码都是从 DLL 动态加载的。
这个问题适用于任何对我应该在哪里以及如何继续寻找内置函数有一点线索的人。我已经用 Cheat Engine 尝试了一些东西,但我并不太成功。我可以作弊一下^^ 但这不是我想要的。
这就是我目前的“进度”:
我在可执行文件的数据部分中发现了一些我想要寻找的提示。例如 IDA 给了我
.rdata:00D44210 dd offset aLoadfile ; "loadfile"
.rdata:00D44214 dd offset sub_90ECE0
.rdata:00D44218 dd offset aDofile ; "dofile"
.rdata:00D4421C dd offset sub_90ED20
.rdata:00D44220 dd offset aLoadstring ; "loadstring"
.rdata:00D44224 dd offset sub_90EC80
现在,我知道这里的这些字符串(loadfile、dofile 等)实际上是模组制作者可以在 Lua 中使用的内置函数的名称——Lua 是一种脚本语言,用于更改游戏中的内容。
我试图找出这个地址是在什么时候被访问以进行读取的。为此,我正在使用 Cheat Engine,在这一点上我想强调,我不是要在这里作弊,而是要引入新的内置功能,以便在修改时具有更大的灵活性。
但是,我在 IDA 中看到的地址似乎不是实际的虚拟地址。如果我用 Cheat Engine 查看这个地址,它只是读取内存,我什么也得不到。
所以问题是我是否能够找到正确的虚拟地址,例如dofile,以便从我的 RAM 中读出它。
我希望最终看到的是从哪里访问这些方法,并在以后的步骤中找出实际代码dofile所在的位置。最后,我想将我的代码走私到正确的位置并引入一个新功能my_hack以控制程序。