windows 核心函式字首解析
《Windows核心情景分析–採用開原始碼ReactOS(上、下冊)》本書通過分析ReactOS的原始碼介紹了Windows核心各個方面的結構、功能、演算法與具體實現。本小節為大家介紹Windows核心函式的命名。
1.5 Windows核心函式的命名
Windows的核心函式在命名上有個很好的特色,就是函式名都按其所在的層次或模組加上了特定的字首。瞭解了這些字首,看到一個函式名就可以大致知道這個函式所屬的層次和模組,主要的字首有:
Ex:管理層,Ex是Executive的開頭兩個字母。
Ke:核心層,Ke是Kernel的開頭兩個字母。
Hal:硬體抽象層,Hal是Hardware Abstraction Layer的縮寫。
Ob:物件管理,Ob是Object的開頭兩個字母。
Mm:記憶體管理,Mm是Memory Manager的縮寫。
Ps:程序(執行緒)管理,Ps表示Process。
Se:安全管理,Se是Security的開頭兩個字母。
Io:I/O管理。
Fs:檔案系統,Fs是File System的縮寫。
Cc:檔案快取管理,Cc表示Cache。
Cm:系統配置管理,Cm是Configuration Manager的縮寫。
Pp:"即插即用"管理,Pp表示PnP。
Rtl:執行時程式庫,Rtl是Runtime Library的縮寫。
不過並非所有的函式名都帶有這樣的字首,對字首的使用也並非十分嚴格。例如,核心層函式名的字首本應是Ke,但是實際上有不少核心層函式名的字首是Ki,這些函式大都是與中斷有關的比較底層的函式。
有時候還在函式名的字首後面加上小寫字母f,表示這個函式是快速呼叫函式。例如:
NTKERNELAPI LONG_PTR FASTCALL ObfDereferenceObject(IN PVOID Object);
這裡的型別說明FASTCALL向編譯工具表明這是個快速呼叫函式,函式名字首後面加上f則使人一看見函式名就知道這是個快速呼叫函式。一般的函式呼叫是通過堆疊傳遞引數的,而快速呼叫函式則通過ECX等暫存器傳遞引數,因為避免了幾個堆疊操作而使效率有所提高。當然,這裡的說明FASTCALL是必需的,否則編譯工具不知道應該通過暫存器傳遞引數,而在函式名中加上f則只是為了增加程式的可讀性。
上面所說的是C語言程式中的函式名,如果是在組合語言中,則需要在函式名前面再加上字首"_",並加上表示引數個數的字尾。例如,函式名RtlZeroMemory()出現在彙編程式中就是_RtlZero
如果是快速呼叫函式,則又與普通的函式名有所不同。例如KfLowerIrql()是個快速呼叫函式,這個函式名出現在彙編程式中時則變成@[email protected]。這裡的字首@表示這是快速呼叫函式,字尾的@4則表示這個函式帶有4個位元組的引數,即一個引數。當然,這是通過暫存器(因為只有一個引數,所以是ECX)傳遞的引數,而不是通過堆疊傳遞的引數。
按理說,KfLowerIrql()是核心層的函式,又是快速呼叫,因而其函式名的字首應該是Kef,但是實際用的卻是Kf,所以這些字首的使用並不嚴格。讀者也許懷疑,是否ReactOS的人不守規矩?其實不然,因為在別的資料中也看到過這個函式名。
1.對於ring3 api主要由 kernel32.dll,user32.dll等dll匯出函式,
2.對於核心函式,由ntoskrnl.exe匯出。可以直接用IDA載入,在export欄中察看(可使用搜索欄搜尋函式)
注意:文件化:在export顯示的函式,說明函式已匯出,在WDK文件中,可查詢到的函式(聯網+本地),為文件化,可直接呼叫。
未文件化:若匯出了,未文件化,則要宣告此核心函式。
主要的字首有:
Zw:Zw 和同名的 Nt 函式具有相同的功能,中間是從 Zw 到 Nt 函式的簡單跳轉。本系列核心函式用於檔案和登錄檔方面的操作,比如檔案操作、登錄檔操作、訪問程序、事件操作、令牌操作、程序操作和埠操作等。
Ex:管理層,Ex 是 Executive 的開頭兩個字母。 Ke:核心層,Ke 是 Kernel 的開頭兩個字母。 Hal:硬體抽象層,Hal 是 Hardware Abstranction Layer 的縮寫。 Ob:物件管理,Ob 是 Object 的開頭兩個字母。 Mm:記憶體管理,Mm 是 Memory Manager 的縮寫。 Ps:程序(執行緒)管理,Ps 表示Process。 Se:安全管理,Se 是 Security 的開頭兩個字母。 Io:I/O管理。 Fs:檔案系統,Fs 是 File System 的縮寫。 Cc:檔案快取管理,Cc 表示 Cache。 Cm:系統配置管理,Cm 是 Configuration Manager 的縮寫。 Pp:“即插即用”管理,Pp 表示 PnP。 Rtl:執行時程式庫,Rtl 是 Runtime Library 的縮寫。本系列核心函式用於執行時庫,以Rtl為字首的函式可以完成多種操作,例如字串、執行緒、資源、臨界區、安全物件的初始化和使用,記憶體、程序異常和資料型別的處理,還用於完成定時器、堆、IPv4和IPv6方面的操作,以及壓縮和解壓縮等。
Ndis:與NDIS網路驅動開發相關的函式。 Wdf:開發WDF驅動相關的函式都是以 Wdf 開頭。 KiEtw:本系列核心函式用於系統核心,這些函式只能從核心的內部進行呼叫,常用的有:KiUserCallbackDispatcher、KiRaiseUserExceptionDispatcher、KiUserApcDispatcher、KiUserExceptionDispatcher等。
Csr系列:此係列函式用於客戶機和伺服器執行時,如果您想攔截客戶機/伺服器方面的操作,那麼就需要對Csr系列核心函式做進一步的瞭解。常見的有:CsrClientCallServer、CsrCaptureMessageBuffer、CsrConnectClientToServer和CrsNewThread等。
Ldr系列:本系列核心函式用於載入程式管理器,如果你打算攔截載入程式的話,那麼請進一步考察這組以Ldr為字首的函式,常用的有:LdrInitializeThunk、LdrLockLoaderLock、LdrUnlockLoaderLock、LdrGetDllHandle、LdrGetProcedureAddress等。
Dbg系列:本系列核心函式用於除錯管理,如果打算攔截除錯操作的話,那麼請進一步考察這組以Dbg為字首的函式,常用的函式包括:、DbgBreakPoint、DbgUserBreakPoint、DbgPrint和DbgUiConnectToDbg等。
Etw系列:本系列核心函式用於追蹤視窗事件,如果你打算攔截追蹤之類的操作的話,那麼請進一步考察這組以Etw為字首的函式。常用的函式包括:EtwTraceEvent、EtwEnableTrace、EtwGetTraceEnableLevel和EtwGetTraceEnableFlags等。
Pfx系列:本系列核心函式用於ANSI字串操作,如果你打算攔截ASNI串表方面的操作的話,就需要進一步瞭解這些函式。常用的包括:PfxInitialize、PfxRemovePrefix、PfxInsertPrefix、PfxFindPrefix等。
不過並非所有函式名都帶有這樣的字首,對字首的使用也並非非常嚴格。 例如:核心層函式名的字首本應該是Ke,但實際上有不少核心層函式名的字首是 Ki,這些函式大都是與中斷有關的比較底層的函式。
有時候還在函式名的字首後面加上小寫字母 f,表示這個函式是快速呼叫函式。 例如:NTKERNELAPI LONG_PTR FASTCALL ObfDereferenceObject(IN PVOID Object); 這裡的型別說明 FASTCALL 向編譯工具表明這是個快速呼叫函式,函式名字首加 f 則使人一看見函式名就知道這個函式是個快速呼叫函式,一般的函式呼叫是通過堆疊傳遞引數的,而快速呼叫函式則通過 ECX 等暫存器傳遞引數,因為避免了幾個堆疊操作而使效率有所提高。 這裡的 FASTCALL 是必須的,否則編譯工具不知道應該通過暫存器傳遞引數,而在函式名中加 f 則只是為了增加程式的可讀性。