我阅读的所有文章中的总主题是:
64bit-在ntdll中调用
32bit-从ntdll跳转到KiFastSystemcall
但是当我用64位和32位的ntdll打开IDA验证这些文章时,这就是我看到的内容:
(32位)
NtCreateFile proc near
mov eax, 55h ; syscall num
mov edx, offset j_Wow64Transition
call edx ; weird stub is called instead of KiFastSystemcall.
; I couldn't find anything about it.perhaps a wrapper around KiFastSystemcall?
retn 2Ch
NtCreateFile endp
(64位)
NtCreateFile proc near
mov r10, rcx ; NtCreateFile
mov eax, 55h
test byte ptr ds:7FFE0308h, 1 ; some test to decide wether to use int 0x2E or syscall?
; I don't know why int 0x2E be used. I thought it causes overhead?
jnz short loc_18009CB15
syscall
retn
loc_18009CB15:
int 2Eh
retn
NtCreateFile endp
如果有人知道为什么这样调用系统调用,我很想知道。
总结:
(32位)为什么要用j_Wow64Transition而不是KiFastSystemcall?
(64位)正在比较什么,为什么?
。
#1 楼
在引用之后,回答您的第一个问题来自Windows Internals Sixth Edition第1部分,第225页:Wow64(64位Windows上的Win32仿真)是指允许执行的软件。在64位Windows上的32位x86应用程序。它被实现为一组用户模式DLL,内核提供了一些支持,以创建通常仅是64位的数据结构的32位版本。
/>
Wow64钩挂所有代码路径,在32位代码将过渡到本机64位系统时,或当本机系统需要调用32位用户模式代码时,Wow64都将挂接。
Wow64过渡到本机64位模式,捕获与系统调用关联的参数(将32位
指针转换为64位指针),并发出相应的本机64-位系统调用。当native
系统调用返回时,Wow64会在必要时将所有输出参数从64位格式转换为32位格式
,然后再返回32位模式。
因此,当在
32
位Windows上运行某个x86
位64
程序时,可能会发生此类转换,以使该应用程序可以进行本机系统调用。第二个问题的答案已经在这里。 />
#2 楼
我会在第一个答案中添加信息。模式从Wow64切换到64bit(又名“天堂之门”)在
wow64cpu.dll
中。 offset j_Wow64Transition
是wow64cpu.dll
的一部分。这些幻灯片可帮助您了解从Wow64进程执行64位syscall的过程,并以汇编代码为例。
评论
我在第一个答案中也没有提到“天堂之门”。大概是因为这不是Microsoft的术语,而是由Microsoft Press出版的。
– 0xC0000022L♦
20-4-20在21:03
评论
说得通。非常感谢。
– Alal Benben
20-04-19在14:23