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...