通过DLL代理重定向损坏的函数



我在摆弄一款旧游戏,并试图了解它的工作原理。我目前的实验包括尝试代理一个游戏的DLL。

因此,我将原始的DLL.dll重命名为trueDLL.dll,用dumpbin转储DLL的导出,并创建#pragmas(现在很好,稍后我将查看.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++方案,但我可能错了。我该如何确定?

事实证明,DLL中的方法不需要#pragma,因为它实际上覆盖了所需的行为。如果我像undname.exe所说的那样定义我的函数,并在前面添加一个__declspec(dllexport),那么一切都会很好地就位。

最新更新