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