我使用 IDA Pro 6.8.150428 (idaq64.exe) 在 Windows 10 64 位中反汇编系统 dll(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
上述运行时地址(7ffda61c12e0)对应的ntdll.dll二进制文件中的静态地址为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?