4.API的调用过程(系统服务表)
生活随笔
收集整理的這篇文章主要介紹了
4.API的调用过程(系统服务表)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
SystemServiceTable(系統服務表)
函數參數表里的是以字節為單位的,SystemServiceTable只有兩張。
函數地址表里的函數都是內核導出函數,里面只是Ntoskrl.exe其中的一部分函數并不是所有函數。(3環常用的api基本都在里面了)
函數地址表與函數參數表是一一相對的,比如函數地址表第一個成員那么它的參數個數就是參數表的第一個成員。
畫程序界面、gdi之類的都在Win32k.sys中。
SystemServiceTable就在_KTHREAD+0xE0處,當程序執行后CUP只要得到當前程序的線程就能找的系統訪問表。
- 在3環調用api進入0環需要提供一個操作碼,這操作碼將決定我要調用的函數在哪。
- 這個操作碼雖然它只有32位但它只使用了低13位。
- 如果它的第13位為0那么他在Ntoskrl.exe,1在win32k.sys
- 它的低12位就是對應的函數地址表的索引
_KiFastCallEntry 的過程
mov edi, eax ; 取出操作碼shr edi, 8 ; 操作碼右移8位and edi, 30h ; 再將它&30h 結果只有兩種0和10h; (也就是下標12的位置為0 或者1)mov ecx, ediadd edi, [esi+0E0h] ; _KTHREAD->ServiceTable(0xE0)mov ebx, eaxand eax, 0FFFh ; 取操作碼的后12位(索引)cmp eax, [edi+8] ; typedef struct _SYSTEM_SERVICE_TABLE; {; ; PVOID ServiceTableBase; //這個指向系統服務函數地址表; PULONG ServiceCounterTableBase;//系統這個服務表調用了幾次; ULONG NumberOfService; //服務函數的個數; ULONG ParamTableBase;//參數表; ; }SYSTEM_SERVICE_TABLE,*PSYSTEM_SERVICE_TABLE;; +8 = NumberOfService; 這里判斷要找的函數有沒有超出范圍jnb _KiBBTUnexpectedRangecmp ecx, 10h ; 與0x10比較 如果是0x10查第二張系統服務表; 如果為0,jnz 到 第一張系統服務表jnz short loc_4077C0 ; KPRCD->0x518 KeSystemCalls 增加1mov ecx, ds:0FFDFF018hxor ebx, ebxloc_4077AE: ; DATA XREF: _KiTrap0E+110oor ebx, [ecx+0F70h] ; 這一塊只有調用第二張系統服務表才會執行jz short loc_4077C0 ; GUI之類的東西不是一次性加載的push edx ; 要用的時候動態加載的push eaxcall ds:_KeGdiFlushUserBatchpop eaxpop edxloc_4077C0: ; CODE XREF: _KiFastCallEntry+B4j; _KiFastCallEntry+C4jinc dword ptr ds:0FFDFF638h ; KPRCD->0x518 KeSystemCalls 增加1mov esi, edx ; edx存著3環傳入的參數指針mov ebx, [edi+0Ch] ; ParamTableBase;//參數表xor ecx, ecxmov cl, [eax+ebx] ; eax=索引 +參數表= 得到的調用號得到的參數個數mov edi, [edi] ; [ServiceTableBase]; 得到函數地址表mov ebx, [edi+eax*4] ; 0環函數的地址sub esp, ecx ; 提升堆棧為clshr ecx, 2 ; 右移2位 = 參數總長度/4 == 參數個數; 因為rep指令一次復制4字節,所以除4mov edi, esp ; 設置要拷貝到的地址cmp esi, ds:_MmUserProbeAddress ; 判斷3環參數是否越界jnb loc_407990loc_4077E8: ; CODE XREF: _KiFastCallEntry+2A4j; DATA XREF: _KiTrap0E+106orep movsd ; 開始拷貝參數 ecx幾就拷貝幾次call ebx ; 調用函數總結
以上是生活随笔為你收集整理的4.API的调用过程(系统服务表)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 3.API的调用过程(保存现场)
- 下一篇: 1.进程结构体