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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

(49)逆向分析KiSystemService/KiFastCallEntry调用内核函数部分(SST,SSDT,SSPT)

發布時間:2025/3/21 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (49)逆向分析KiSystemService/KiFastCallEntry调用内核函数部分(SST,SSDT,SSPT) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、回顧

前兩篇博客,我逆向分析了 KiSystemService 和 KiFastCallEntry 填充_KTRAP_FRAME 結構體的代碼,二者大同小異,主要的區別是 sysenter 只改了eip,cs,ss,雖然esp也改了,但是windows不使用,而是從TSS里取esp0;另外sysenter并沒有像中斷門那樣壓棧,所以3環的 ss, esp, eflags, cs,eip都要在函數里依次保存到 _KTRAP_FRAME 。

這次課后作業是逆向 KiSystemService / KiFastCallEntry 調用內核函數部分,放在一塊講是因為這兩個函數雖然入口不同,但是填充完 _KTRAP_FRAME 后,就會執行相同的代碼。他們兩個函數就像兩頭蛇一樣,有兩個入口,初始化的工作有區別,但是往后就共用一個函數體。

在逆向之前,先介紹所需的前置知識。同時,思考兩個問題:

  • 如何根據系統服務號(eax中存儲)找到要執行的內核函數?
  • 調用時參數是存儲到3環的堆棧,如何傳遞給內核函數?

二、SystemServiceTable 系統服務表SST

SST:系統服務表
SSDT:系統服務調度表
SSPT:系統服務參數表
關系:

首先強調,SystemServiceTable 系統服務表不是SSDT。

看示意圖:

通過此圖,我們可以得知以下信息:

  • 通過 _KTHREAD 可以找到系統服務表
  • 系統服務表又指向了函數地址表和函數參數表
  • 有兩張系統服務表,第一張是用來找內核函數的,第二張是找Win32k.sys驅動函數的。

通過逆向,我們還可以判定,其實兩張系統服務表是線性地址連續的,每張16字節。

說明一下表的4個屬性:
ServiceTable 指向函數地址表,Count沒有用,ArgmentTable 指向函數參數表,ServiceLimit 是這兩張表的長度。

要注意函數參數表每項存儲的是對應函數參數占的字節數,每項只有1字節。 這個在逆向中也可以驗證。

最后補充一點,我們之前逆向API三環部分時,它進0環之前,無論是中斷門還是快速調用,都會在 eax 里存一個值,我們稱之為系統調用號或者服務號,這個東西的低12位就是函數參數表和函數地址表的下標,而第13位(下標12)如果是0,表示找第一張系統服務表(綠色的表),如果是1,那么找第二張表(黃色的表)。這點可以先記住,待會逆向的時候可以印證這個結論。

三、逆向分析 KiSystemService / KiFastCallEntry 調用內核函數部分

從Kernel32.dll中的某個函數開始分析其執行流程(怎么找到對應的內核函數 怎么找到參數 如何將參數傳遞到0環)

這是作業要求,我這里就只貼了0環逆向部分,至于3環那些,我在之前的博客已經詳細分析了,有需要可以查看前面的博客。

直接貼結果了,比較簡單,看注釋就能看懂了。

.text:004665CD loc_4665CD: ; CODE XREF: _KiBBTUnexpectedRange+18j .text:004665CD ; _KiSystemService+6Fj .text:004665CD mov edi, eax ; 這里是 KiSystemService 和 KiFastCallEntry 的匯合處 .text:004665CD ; edi = eax = 系統調用號 .text:004665CF shr edi, 8 .text:004665D2 and edi, 30h ; 檢測系統調用號12位 .text:004665D2 ; 如果等于1,那么 edi == 0x10 .text:004665D2 ; 如果等于0,那么 edi == 0x00 .text:004665D5 mov ecx, edi .text:004665D7 add edi, [esi+0E0h] ; edi += CurrentThread.ServiceTable .text:004665D7 ; 此時 edi 指向了API對應的系統服務表 .text:004665D7 ; .text:004665D7 ; 他這個設計 0x10 剛好是系統服務表的大小 .text:004665D7 ; 系統服務表有 ServiceTable, Count, ServiceLimit 和 ArgmentTable .text:004665D7 ; 4項共0x10字節,所以通過這里的代碼也可以推斷,內核和win32k.sys的系統服務表是連續的 .text:004665D7 ; 第一張是內核的,第二張是win32k.sys的 .text:004665DD mov ebx, eax ; ebx = 系統調用號 .text:004665DF and eax, 0FFFh ; eax = 系統服務表下標 .text:004665E4 cmp eax, [edi+8] .text:004665E7 jnb _KiBBTUnexpectedRange ; 檢查系統調用號是否超過系統服務表的范圍,超過就跳到異常處理 .text:004665ED cmp ecx, 10h .text:004665F0 jnz short loc_46660C ; 跳轉條件:系統服務(ntdll.dll 的API) .text:004665F0 ; 不跳轉條件:圖形及用戶界面(gdi.dll 的API) .text:004665F2 mov ecx, ds:0FFDFF018h ; ecx 指向 _KPCR .text:004665F8 xor ebx, ebx .text:004665FA .text:004665FA loc_4665FA: ; DATA XREF: _KiTrap0E+113o .text:004665FA or ebx, [ecx+0F70h] .text:00466600 jz short loc_46660C .text:00466602 push edx .text:00466603 push eax .text:00466604 call ds:_KeGdiFlushUserBatch .text:0046660A pop eax .text:0046660B pop edx .text:0046660C .text:0046660C loc_46660C: ; CODE XREF: _KiSystemService+16Fj .text:0046660C ; _KiSystemService+17Fj .text:0046660C inc dword ptr ds:0FFDFF638h ; _KCPR.KPRCB.KeSystemCalls += 1, 系統調用計數加1 .text:00466612 mov esi, edx ; esi = edx = 3環參數指針 .text:00466614 mov ebx, [edi+0Ch] ; edi 指向系統服務表 .text:00466614 ; ebx 指向函數參數表 .text:00466614 ; eax 是系統服務表下標 .text:00466617 xor ecx, ecx .text:00466619 mov cl, [eax+ebx] ; cl = 參數字節數 .text:0046661C mov edi, [edi] ; edi 指向函數地址表 .text:0046661E mov ebx, [edi+eax*4] ; ebx 指向函數 .text:00466621 sub esp, ecx ; 從這句開始,到call為止,完成了復制3環參數的工作 .text:00466621 ; 這句是模擬壓棧操作 .text:00466623 shr ecx, 2 ; 參數字節數 / 4,得到參數個數 .text:00466626 mov edi, esp .text:00466628 cmp esi, ds:_MmUserProbeAddress ; 越界檢查 .text:00466628 ; 如果 esi(3環參數指針)大于等于 0x7fff0000,則返回 c0000005 異常 .text:0046662E jnb loc_4667DC .text:00466634 .text:00466634 loc_466634: ; CODE XREF: _KiSystemService+35Fj .text:00466634 ; DATA XREF: _KiTrap0E+109o .text:00466634 rep movsd ; 復制參數:復制 esi 到 edi,每次復制4字節,次數由 ecx 決定 .text:00466634 ; 方向由DF決定,DF=0,故每次復制后,edi 和 esi 都加4 .text:00466636 call ebx ; 調用內核函數

至此,系統調用過程,除了0環返回3環(涉及APC知識),我們都已經分析完成了。

總結

以上是生活随笔為你收集整理的(49)逆向分析KiSystemService/KiFastCallEntry调用内核函数部分(SST,SSDT,SSPT)的全部內容,希望文章能夠幫你解決所遇到的問題。

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