我使用IDA Pro 6.8.150428(idaq64.exe)来分解系统dll(64位),例如Windows 10 64位元中的ntdll.dll,kernel32.dll等。我发现idaq64.exe正确反汇编了64位示例应用程序(.exe),但生成了错误的dll反汇编,例如显示32位寄存器操作数,等等。我用WinDbg(运行时)和Intel XED(静态)输出检查了IDA Pro反汇编输出。尽管Windbg和XED输出彼此一致,但它们与IDA Pro的输出完全不同。

WinDbg中的运行时反汇编@ 00007ffda61c12e0

00007ffda61c12db      call    ntdll!NtQueryPerformanceCounter (00007ffda6213b30)
00007ffda61c12e0      mov     eax,dword ptr [rsp+30h]
00007ffda61c12e4      mov     rsi,qword ptr [rsp+40h]
00007ffda61c12e9      shl     rax,20h
00007ffda61c12ed      xor     rax,qword ptr [rsp+30h]
00007ffda61c12f2      xor     rax,rbx
00007ffda61c12f5      mov     rbx,qword ptr [rsp+38h]
00007ffda61c12fa      xor     rax,rdi
00007ffda61c12fd      add     rsp,20h
00007ffda61c1301      pop     rdi
00007ffda61c1302      ret


ntdll.dll二进制文件中与上述运行时地址(7ffda61c12e0)相对应的静态地址为4b2c12e0。我什至没有在IDA Pro中反汇编ntdll.dll中的地址。它显示:

.text:4B2C12DF                 test    eax, eax
.text:4B2C12E1                 js      loc_4B30C906
.text:4B2C12E7                 mov     [esp+278h+var_255], 1
.text:4B2C12EC
.text:4B2C12EC loc_4B2C12EC:                           ; CODE XREF: LdrpPreprocessDllName(x,x,x,x)+4B66Bj
.text:4B2C12EC                 mov     ecx, [esp+278h+var_254]
.text:4B2C12F0                 xor     ebx, ebx
.text:4B2C12F2                 xor     dl, dl
.text:4B2C12F4                 mov     [esp+278h+var_264], ebx
.text:4B2C12F8                 mov     [esp+278h+var_25D], dl
.text:4B2C12FC                 test    byte ptr [ecx], 8
.text:4B2C12FF                 jnz     loc_4B2C160B
.text:4B2C1305                 mov     edi, [esp+278h+var_25C]
.text:4B2C1309                 xor     al, al
.text:4B2C130B                 mov     ecx, large fs:30h
 .text:4B2C1312                 mov     [esp+278h+var_244], edi


显然,IDA Pro错误地分解了dll。如何使IDA Pro正确反汇编64位dll?

评论

那是什么翻译?为什么不尝试搜索函数ntquery并查看对其的外部参照,而不是将任何内容翻译为任何内容

抱歉,如果我的问题仍然不清楚:(。问题是IDA Pro 64位错误地反汇编了64位ntdll.dll(和其他dll)。它显示所有32位寄存器,而WinDbg显示64位寄存器。如果我可以使IDA Pro在64位dll上正常工作,这将大有帮助。

您是直接从system32将它们加载到IDA吗?

#1 楼

在64位Windows上,任何尝试访问C:\Windows\system32的32位进程都透明地重定向到C:\Windows\SysWOW64

由于IDA(idaq.exeidaq64.exe都是32位进程),因此您实际上是在打开C:\Windows\SysWOW64\ntdll.dll(这是一个32位文件)而不是C:\Windows\system32\ntdll.dll

要打开正确的文件,将其从C:\Windows\system32复制到另一个目录,然后从那里打开。

评论


谢谢,这是救命的。是的,我将dll从system32文件夹加载到IDA中。

–苏丹娜
16 Mar 10 '16 at 8:19

您能否接受答案,以便其他人知道问题已得到回答?

–TMR232
16 Mar 10 '16 at 11:29