我正在尝试使用 ghidra 来反转使用的 32 位专有应用程序,mfc42.dll
并且我在导入函数方面获得了混合结果。
令我惊讶的是,DLL
s 不使用名称来导出ELF
格式等函数,而是使用所谓的序数,并且您需要另一个文件(相应的.lib
)将它们与实际名称链接起来。
在二进制中有一个特定的函数,它似乎分别调用对应于CString::Left(int)
和 的序数 4129 和序数 5710 CString::Right(int)
(ghidra 内部使用 XML 来跟踪对应函数 <-> 序数)。
但是,如果我检查这个函数的实际组装,似乎这些函数需要一个进一步的参数(这可以从堆栈深度值中推导出来,您可以在使用 ghidra 进行反汇编时启用该值)。显然,我正在考虑这样一个事实,即类实例是通过ecx
寄存器传递的,但这与讨论无关,我对使用 stack 传递的参数感兴趣。
试图反转 dll 本身,确实 ghidra 发现签名有两个参数,但很糟糕,它无法说出这些函数的实际名称是什么。
由于mfc42.dll
(我认为)是一个非常标准的库,谁能向我解释发生了什么?
要添加信息,应用程序似乎使用Visual Studio编译VC6,这可以从签名推断FuncInfo
是结构0x19930520
。