我一直在阅读有关在Windows中调用系统调用的方式。
我阅读的所有文章中的总主题是:
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上运行某个x8664程序时,可能会发生此类转换,以使该应用程序可以进行本机系统调用。

第二个问题的答案已经在这里。 />

评论


说得通。非常感谢。

– Alal Benben
20-04-19在14:23

#2 楼

我会在第一个答案中添加信息。

模式从Wow64切换到64bit(又名“天堂之门”)在wow64cpu.dll中。 offset j_Wow64Transitionwow64cpu.dll的一部分。

这些幻灯片可帮助您了解从Wow64进程执行64位syscall的过程,并以汇编代码为例。

评论


我在第一个答案中也没有提到“天堂之门”。大概是因为这不是Microsoft的术语,而是由Microsoft Press出版的。

– 0xC0000022L♦
20-4-20在21:03