【发布时间】:2017-01-11 15:47:26
【问题描述】:
我正在研究 NtDll 如何在 x86 进程中工作,并使用 IDA PRO 调试了函数 NtCreateFile。它的代码如下:
mov eax, 55h ; NtCreateFile
mov edx, offset _Wow64SystemServiceCall@0 ;
call edx ; Wow64SystemServiceCall() ;
retn 2Ch
还有Wow64SystemServiceCall():
mov edx, large fs:30h
mov edx, [edx+464h]
test edx, 2
jz short loc_7738B5C8
int 2Eh ; DOS 2+ internal - EXECUTE COMMAND
; DS:SI -> counted CR-terminated command string
retn
loc_7738B5C8: ; CODE XREF:
jmp far ptr byte_7738B8FF
我查找了jmp far ptr byte_7738B8FF 的命令代码
它是 EA CF B5 38 77 33 00 跳转到另一个段 0x33 jmp 0x33:0x7738b5cf 。所以从我在互联网上读到的内容来看,这是 64 位系统上进程的 x64 段基础,对吗?不幸的是,我无法进一步调试,因为 ida 不跟随跳转。但我做了另一个为 x64 编译的简单 C 应用程序,并调用 CreateFile,附加 x64 IDA PRO Remote 调试器,并查找反汇编,NtCreateFile 看起来像这样:
x64_NtCreateFile proc near
mov r10, rcx
mov eax, 55h
test byte ptr ds:7FFE0308h, 1
jnz short loc_7FFED6695B85
syscall
retn
loc_7FFED6695B85:
int 2Eh ; DOS 2+ internal - EXECUTE COMMAND
; DS:SI -> counted CR-terminated command string
retn
所以我有几个问题,从附加的 ntdll 远跳转 jmp 0x33:0x7738b5cf 跳转到 x86 进程如何跳转到 x64_NtCreateFile 第一条指令?在这种情况下,从 x86 到 x64 的切换究竟是如何发生的?基本上我可以制作 x86 应用程序,并通过跳转切换段,然后执行其中的 x64 代码,我可以通过像 db (0x00) ; x64 machine code commands 这样的操作来创建,对吗?
【问题讨论】:
-
在这里阅读有关操作系统引导方式的信息可能对您有所帮助。首先是 16 位 -> 32 位转换,然后是 32 --> 64 位切换。
-
Unfortunately i cannot debug further, because, ida doesnt follow the jump因为 ida 是错误的调试器。使用windbg - 它允许你进入跳转 -
@RbMm 感谢您的建议。我试过了,它不太舒服,但在拆卸方面更好
标签: windows assembly reverse-engineering x86-64 ntdll