Nt Zw 和Rtl 開頭的函式介紹

2021-05-05 03:13:52 字數 2214 閱讀 3574

首先他們都是微軟未公開的函式,之所以未公開主要是因為這些函式大部分功能太強大了,把他們公開會讓一些別有用心的人利用。9x下的我不知道,nt(含2000/xp)下你可以參考《windows nt native api》,他們中的大部分函式幾乎就從來沒有變過。而幾乎所有從kenerl.dll中引出的win32api,都是通過呼叫的native api(ntdll.dll中匯出)實現系統呼叫的。舉乙個例子:ntquerysysteminformation 這個函式就強大到可以查詢所有的系統資訊,使用時需要使用者擁有相當高的訪問許可權。

in ring3:

lkd> ? ntdll!zwopenprocess

evaluate e­xpression_r: 2089999739 = 7c92dd7b

lkd> ? ntdll!ntopenprocess

evaluate e­xpression_r: 2089999739 = 7c92dd7b

用dependency也可看到。

可以看到,在ntdll中,zwopenprocess和ntopenprocess其實是同乙個函式,只不過擁有兩個名稱而已。

也就是說,在ring3環境中,zw***系列函式和nt***系列函式無區別。

in ring0:

lkd> u nt!zwopenprocess

nt!zwopenprocess:

804de044 b87a000000    mov     eax,7ah

804de049 8d542404       lea     edx,[esp+4]

804de04d 9c             pushfd

804de04e 6a08          push 8

804de050 e8dc150000    call nt!kisystemservice (804df631)

804de055 c21000        ret     10h

lkd> u nt!ntopenprocess

nt!ntopenprocess:

80573d06 68c4000000    push 0c4h

80573d0b 6810b44e80    push offset nt!obwatchhandles+0x25c (804eb410)

80573d10 e826f7f6ff    call nt!_seh_prolog (804e343b)

80573d15 33f6          xor     esi,esi

80573d17 8975d4         mov     dword ptr [ebp-2ch],esi

80573d1a 33c0          xor     eax,eax

80573d1c 8d7dd8        lea     edi,[ebp-28h]

80573d1f ab             stos dword ptr es:[edi]

可以看得出,zwopenprocess函式很短,首先把0x7a(ntopenprocess的服務號)存入eax,然後做一些儲存現場的工作即kisystemservice——這個函式根據eax中的service id在ssdt中查詢相應的系統服務,然後呼叫之。

而ntopenprocess函式很長(反彙編結果只是一部分),事實上,ntopenprocess便是真正執行開啟程序操作的函式(在r0中通常稱為服務,或例程),所以,若在驅動中直接呼叫nt系列函式,是不會經過ssdt的,也就不會被ssdt hook所攔截。

簡單總結如下:

r3下無論如何呼叫,均無法繞過ssdt hook,r0下呼叫nt*可以繞過ssdt hook。rtl** 函式是windows ddk提供的編寫驅動的函式。

我的總結:

由以上反彙編zw***可知,zw*****內部是通過ssdt中的對應nt***索引號查詢到真正nt***執行**的入口位址。

大多數win32的api函式都是包裝了這些zw*** api和nt*** api實現的。  

在使用者模式下,這兩種形式的本機api是相同的,只是ntdll.dll中相同入口點的兩個不同符號。   

在核心模式下,**依靠ntoskrnl.exe來連線,不再是ntdll.dll。這是,zw***的函式入口點含有來自於ntdll.dll的乙份拷貝。nt***的函式入口點則含有系統服務的實際實現。

引自:  http://youstar.398.cn/article.asp?id=232

E開頭的函式

函式名 ecvt 功 能 把乙個浮點數轉換為字串 用 法 char ecvt double value,int ndigit,int decpt,int sign 程式例 include include include int main void 函式名 ellipse 功 能 畫一橢圓 用 法 v...

C和指標開頭的程式

include include include define max cols 20 最大的列數 define max input 1000 輸入最大長度 int read column numbers int columns,int max void rearrange char output,c...

wait和waitpid函式的介紹

2 waitpid 的作用和wait 一樣,但它並不一定要等待第乙個終止的子程序 它可以指定需要等待終止的子程序 它還有若干選項,如可提供乙個非阻塞版本的 wait 功能,也能支援作業控制。實際上,wait 函式只是 waitpid 函式的乙個特例,在linux 內部實現 wait 函式時直接呼叫的...