系统 DLL 的 IDA Pro 64 位反汇编错误

逆向工程 艾达 拆卸 dll
2021-06-29 11:00:39

我使用 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?

1个回答

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

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

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