我在摆弄一款旧游戏,并试图了解它的工作原理。我目前的实验包括尝试代理一个游戏的DLL。
因此,我将原始的DLL.dll
重命名为trueDLL.dll
,用dumpbin
转储DLL的导出,并创建#pragma
s(现在很好,稍后我将查看.def文件(以生成";"空";代理这起到了预期的作用。
现在,我想将一些函数重定向到我的反向工程实现中,以测试它们是否有效。这就是我被卡住的地方。下面是一个示例:LogDebug
函数。";"空";,代理DLL中的工作杂注如下所示:
#pragma comment(linker, "/export:?LogDebug@@YAXPBDZZ=trueDLL.?LogDebug@@YAXPBDZZ,@504")
我想我可以这样更改pragma,将调用重定向到我的实现:
#pragma comment(linker, "/export:?LogDebug@@YAXPBDZZ=LogInfo,@504")
运行该程序时,由于找不到?LogDebug@@YAXPBDZZ
而无法启动。一些研究表明,@@YAXPBDZZ
部分没有在我的DLL中导出。这似乎是某种信息在这个被篡改的名字中表现出来,但我不知道它到底意味着什么。Ghidra和这个demangler也于事无补,唯一的搜索结果是俄语。
使用VS 2019,不会更改任何项目设置。
这里的问题是什么?我该怎么做?或者有没有一种更容易/更好的方法来实现这一点?我现在想避免挂接程序exe中的调用,但如果必须的话,我会这么做。
EDIT-Mangling方案和编译器
我不知道创建DLL.dll
到底用了什么,但根据Ghidra的说法,它是visualstudio:unknown
。我会将其解释为1998年(游戏文件日期(版本的MSVC。我使用的是当前的MSVC编译器(CL
版本19(。
对于当前的CL
来说,使用C++方案是有意义的。查看此页面,并将其与导出进行比较,DLL.dll
似乎也在使用C++方案,但我可能错了。我该如何确定?
#pragma
,因为它实际上覆盖了所需的行为。如果我像undname.exe
所说的那样定义我的函数,并在前面添加一个__declspec(dllexport)
,那么一切都会很好地就位。