日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

4.API的调用过程(系统服务表)

發布時間:2025/3/20 windows 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 4.API的调用过程(系统服务表) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

SystemServiceTable(系統服務表)

typedef struct _KSYSTEM_SERVICE_TABLE {PULONG ServiceTableBase; //這個指向系統服務函數地址表PULONG ServiceCounterTableBase; //系統這個服務表調用了幾次ULONG NumberOfService; //服務函數的個數PULONG ParamTableBase; //參數表 }KSYSTEM_SERVICE_TABLE, *PKSYSTEM_SERVICE_TABLE;

函數參數表里的是以字節為單位的,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 結果只有兩種010h; (也就是下標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的调用过程(系统服务表)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。