我正在摆弄一个旧游戏,试图了解它是如何工作的。我目前的实验包括尝试代理游戏的一个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方案,但我可能错了。我如何确定这一点?
事实证明,我DLL中的方法不需要#pragma
,因为它实际上覆盖了所需的行为。如果我像undname. exe
所说的那样定义我的函数,然后在前面添加一个__declspec(dllexport)
,一切都很好。