Zw函式與Nt函式的分別與聯絡

2021-05-22 00:38:55 字數 1775 閱讀 5041

ring3中的native api,和ring0的系統呼叫,都有同名的zw和nt系列函式,一度讓初學者感到迷糊。n久前的我,也是相當的迷糊。現在就以zwopenprocess和ntopenprocess函式為例,詳細闡述下他們的分別和聯絡。

ntdll.dll匯出了ntopenprocess和zwopenprocess兩個函式,我們記為ntdll!ntopenprocess和ntdll!zwopenprocess。仔細看一下,會發現他們的入口點實際上都是一樣的,這就是說,ntdll!zwopenprocess僅僅是ntdll!ntopenprocess函式的別名而已,實現如下:

zwopenprocess  

.text:7c92d5fe                 mov     eax, 7ah         ; ntopenprocess

.text:7c92d603                 mov     edx, 7ffe0300h

.text:7c92d608                 call     dword ptr [edx]

.text:7c92d60a                 retn     10h

7ffe0300h處是ntdll!kifastsystemcall的入口,ntdll!kifastsystemcall會儲存起當前的棧指標,然後通過引發0x2e中斷,陷入核心。

當觸發0x2e中斷後,cpu將執行環境切換到ring0狀態,然後去呼叫核心模組的0x2e處理例程nt!kisystemservice。nt!kisystemservice會在引數檢查、棧拷貝等操作之後,根據ring3**傳遞過來的呼叫號0x7a,在ssdt中查詢相應的函式位址,然後呼叫找到的函式。對於我們的例子來說,這個函式就是核心模組的匯出函式nt!ntopenprocess。nt!ntopenprocess才是真正的開啟程序實現函式。但是核心模組也匯出了nt!zwopenprocess,這個nt!zwopenprocess,有什麼用處呢?會不會像ntdll!zwopenprocess一樣,也僅僅是ntdll!ntopenprocess的乙個別名?實際上,nt!zwopenprocess並不僅僅是nt!ntopenprocess乙個別名,我們可以看一下nt!zwopenprocess的實現:

kd> u nt!zwopenprocess

nt!zwopenprocess:

804fede8   mov     eax,7ah

804feded   lea       edx,[esp+4]

804fedf1   pushfd

804fedf2   push     8

804fedf4   call       nt!kisystemservice (8053d891)

804fedf9   ret       10h

與ntdll.zwopenprocess是不是很接近?nt!zwopenprocess也只是讓nt!kisystemservice呼叫ssdt中的第0x7a號函式,他自己本身沒有進行任何開啟程序的實現。

到這兒,就可以總結一下了:使用者空間中的zw***和nt***的實現都是一樣的,比如ntdll!zwopenprocess和ntdll!ntopenprocess的入口都是0x7c92d5fe,ntdll!zwopenfile和ntdll!ntopenfile的入口都是0f7c92d59e。核心空間中的zw函式,是nt函式的乙個stup,只是mov系統呼叫號到eax中,轉而直接呼叫(注意,沒有像ntdll!zwopenprocess)nt!kisystemservice去從ssdt中找到相應號碼的函式再呼叫之,真正的實現都在nt***函式中。

Zw 與Nt 的區別

某些zw和nt函式既在ntdll.dll中匯出又在ntoskrnl.exe中匯出,他們有什麼區別呢?我們分三部分比較 step 1 ntdll.dll中的zw和nt有什麼區別?step 2 ntoskrnl.exe中的zw和nt有什麼區別?step 3 ntdll.dll中的zw與ntoskrnl....

Zw 與Nt 的區別

某些zw 和nt 函式既在ntdll.dll中匯出又在ntoskrnl.exe中匯出,他們有什麼區別呢?我們分三部分比較 step 1 ntdll.dll中的zw 和nt 有什麼區別?step 2 ntoskrnl.exe中的zw 和nt 有什麼區別?step 3 ntdll.dll中的zw 與nt...

zw函式和nt函式的區別

核心解惑 zw函式和nt函式的區別 lkd u zwopenprocess nt zwopenprocess 804de044 b87a000000 mov eax,7ah 804de049 8d542404 lea edx,esp 4 804de04d 9c pushfd 804de04e 6a0...