使用IDA Pro反汇编一个MFC 8.0程序,发现程序中通过JMP指令间接调用的函数都可以正确命名,而那些直接通过指针(地址)调用的函数却不能正确命名。如OnCancel,Imports表中是这样的:
extrn __imp_MFC80_4213:dword
; DATA XREF: CPropertyPage::OnCancel(void)
跳转表中是这样的:
public: virtual void __thiscall CPropertyPage::OnCancel(void) proc near
jmp ds:__imp_MFC80_4213
public: virtual void __thiscall CPropertyPage::OnCancel(void) endp
程序中是这样的:
mov byte ptr [ecx+7F8h], 1
call CPropertyPage::OnCancel(void)
而对于序号为2321的函数,其原型实际上是
public: void __cdecl ATL::CStringT::Format(unsigned int,...)
在Imports表中是这样的:
extrn MFC80_2321:dword
它没有对应的跳转表项,所以在程序中是这样的:
.text:0048C4AF push 3E6h
.text:0048C4B4 lea eax, [esp-0F0h+arg_108]
.text:0048C4B8 push 0DB8h
.text:0048C4BD push eax
.text:0048C4BE mov [esp-0E8h+arg_118], 0
.text:0048C4C6 call ds:MFC80_2321
可对于ADVAPI32.dll的任何函数都不存在这个问题。本来想着手动命名一下,可对于那些多态函数会出现重名的现象;命名析构函数时又不允许函数名中出现波折线符号(~),很是不爽。请教各位大虾如何解决?
[招生]系统0day安全班,企业级设备固件漏洞挖掘,Linux平台漏洞挖掘!