提问者:小点点

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


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

所以我将原来的DLL. dll重命名为trueDLL.dll,用转储箱转储DLL的导出,并创建#pragma(现在很好,稍后我会查看.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中的调用,但如果必须这样做,我会这样做。

我不知道到底是用什么来创建DLL. dll的,但根据Ghidra的说法,它是Visual Studio:未知。我会把它解释为MSVC的1998年(游戏文件日期)版本。我正在使用当前的MSVC编译器(CL版本。19)。

当前的CL使用C方案是有意义的。查看此页面并将其与导出进行比较,DLL. dll似乎也在使用C方案,但我可能错了。我如何确定这一点?


共1个答案

匿名用户

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