查找lua C函数编译后的二进制文件

逆向工程 拆卸 C++ dll注入 游戏黑客 路亚
2021-06-16 21:38:29

所以我试图“破解”一个游戏,但不是为了作弊。我希望通过一个可以查找进程并返回它们的 DLL 来扩展游戏脚本功能。我正在寻找的游戏是 Train Simulator(我知道,不要笑)并且该游戏使用 lua 来编写游戏中所有引擎功能的脚本。所有 3rd 方开发人员只能看到他们编写的 lua 脚本。

在游戏 lua 中有核心功能。主要的:

function Initialise()

end

function Update(time) -- time is the interval since the last update

end

也有这样使用的 C 函数:

Call("SetControlValue", name, index, value)
or
Call("GetIsPlayer")

这些返回不同的值。

到目前为止,我的 DLL 如下:

#include <windows.h>


BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        /* The DLL is being loaded for the first time by a given process.
        Perform per-process initialization here.  If the initialization
        is successful, return TRUE; if unsuccessful, return FALSE. */
        MessageBoxA(0, "TSDll has been attached !", "Train Sim Dll", MB_ICONEXCLAMATION | MB_OK);
        break;
    }
    return TRUE;
}

这有效。在我的火车模拟引擎脚本中,我使用 loadlib 库来加载 DLL。

libinit, err = loadlib("plugins\\TSDll.dll", "libinit")
if _G["libinit"] then 
    Print("TSDll Library Loaded!")
    libinit()
else
    Print("loadlib on TSDll failed: ")
    Print(err)
end

我得到了这个结果: Dll 弹出窗口

所以dll正确初始化。

我面临的问题是 Lua 库直接内置到游戏二进制文件中(据我所知),这意味着我无法为 lua_pushstring 等基本功能引用 lua.dll。这里有谁知道我如何找到这些函数的地址。我知道以前已经制作过这样的 dll,但是制作它的人对于它是如何制作的非常保密。

谢谢,丹

1个回答

正如你所说,Lua引擎是直接嵌入到游戏中的。它在里面plugins/GameManagerVC.dll(或者是 GameManagerVC64.dll,如果是 64 位)。因此,第一步将是找出它是哪个版本的 Lua。所以把这个 DLL 放到 Ghidra 或 IDA Pro 中。找出它使用的 Lua 版本的最简单方法是在字符串列表中搜索“Lua”字符串(如果是 IDA Pro Views > Open Subviews > Strings)。在 Train Simulator 的情况下,我们发现Lua 5.0.2. 然后我们应该下载Lua 5.0.2源代码,这样我们就可以搜索函数了。搜索函数的最简单方法是选择一些函数,其中包含一些字符串,然后在反汇编文件中搜索这些字符串。然后重命名它们,查找引用等。这样,您应该能够找到您正在寻找的所有函数。