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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

(48)逆向分析 KiFastCallEntry 函数填充 _KTRAP_FRAME 部分

發(fā)布時間:2025/3/21 编程问答 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (48)逆向分析 KiFastCallEntry 函数填充 _KTRAP_FRAME 部分 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、回顧

上一篇博客我逆向了 KiSystemService 函數(shù)填充 _KTRAP_FRAME 部分。

逆向分析 KiSystemService 函數(shù)填充 _KTRAP_FRAME 部分

里面涉及了6個結(jié)構(gòu)體,分別是 _KTRAP_FRAME,_ETHREAD,_KTHREAD,_KPCR,_NT_TIB 和 _KPRCB。這些結(jié)構(gòu)體待會逆向 _KiFastCallEntry 時也要用到,我在本文就不貼出來了,有需要可以去上篇博客查看或者在windbg里 dt 查看。

這里貼一張 _KTRAP_FRAME 的示意圖:

KiSystemService 通過中斷門進0環(huán),進0環(huán)后,3環(huán)的 esp,ss,eip,cs,eflags 都保存到0環(huán)棧里了,進0環(huán)后應(yīng)該先把當前的寄存器的值按照_KTRAP_FRAME的約定壓到棧里。

KiFastCallEntry 做的事情是類似的,下面我貼出我逆向的結(jié)果。

二、逆向分析 KiFastCallEntry 函數(shù)

.text:00466540 _KiFastCallEntry: ; DATA XREF: KiLoadFastSyscallMachineSpecificRegisters(x)+24o .text:00466540 ; _KiTrap01+72o .text:00466540 mov ecx, 23h .text:00466545 push 30h .text:00466547 pop fs ; fs = 0x30, ffc093df`f0000001, 0環(huán)數(shù)據(jù)段 .text:00466549 mov ds, ecx ; ds = 0x23, 00cff300`0000ffff, 3環(huán)數(shù)據(jù)段 .text:0046654B mov es, ecx ; es = 0x23 .text:0046654D mov ecx, ds:0FFDFF040h .text:00466553 mov esp, [ecx+4] ; esp = _KPCR.TSS.Esp0,切換到0環(huán)堆棧 .text:00466556 push 23h ; _KTRAP_FRAME.HardwareSegSs = 0x23 .text:00466558 push edx ; _KTRAP_FRAME.HardwareEsp = edx, edx是3環(huán)棧頂. .text:00466559 pushf ; _KTRAP_FRAME.EFlags = EFlags .text:0046655A .text:0046655A loc_46655A: ; CODE XREF: _KiSystemService+96j .text:0046655A push 2 .text:0046655C add edx, 8 ; edx 指向3環(huán)API參數(shù) .text:0046655F popf ; EFlags = 0x02,即清空0環(huán)所有標志位 .text:0046655F ; 此時 esp 指向 EFlags .text:00466560 or [esp+0A4h+var_A3], 2 ; _KTRAP_FRAME.EFlags 即3環(huán) EFlags 的 IF = 1 .text:00466565 push 1Bh ; _KTRAP_FRAME.SegCs = 0x1B, 3環(huán)代碼段 .text:00466567 push dword ptr ds:0FFDF0304h ; _KTRAP_FRAME.Eip = _KUSER_SHARED_DATA.SystemCallReturn .text:0046656D push 0 ; _KTRAP_FRAME.ErrCode = 0 .text:0046656F push ebp ; _KTRAP_FRAME.Ebp = ebp .text:00466570 push ebx ; _KTRAP_FRAME.Ebx = ebx .text:00466571 push esi ; _KTRAP_FRAME.Esi = esi .text:00466572 push edi ; _KTRAP_FRAME.Edi = edi .text:00466573 mov ebx, ds:0FFDFF01Ch ; ebx = _KPCR.SelfPcr,即 ebx 指向 _KPCR .text:00466579 push 3Bh ; _KTRAP_FRAME.SegFs = 0x3B .text:0046657B mov esi, [ebx+124h] ; esi = _KPCR._KPRCB.CurrentThread .text:00466581 push dword ptr [ebx] ; _KTRAP_FRAME.ExceptionList = _KPCR.NtTib.ExceptionList .text:00466583 mov dword ptr [ebx], 0FFFFFFFFh ; _KPCR.NtTib.ExceptionList = -1 .text:00466589 mov ebp, [esi+18h] ; ebp = _KPCR._KPRCB.CurrentThread.InitialStack .text:0046658C push 1 ; _KTRAP_FRAME.PreviousPreviousMode = 1,表示從3環(huán)來 .text:0046658E sub esp, 48h ; esp 指向 _KTRAP_FRAME .text:00466591 sub ebp, 29Ch .text:00466597 mov byte ptr [esi+140h], 1 ; CurrentThread.PreviousMode = 1,表示從3環(huán)調(diào)用來 .text:0046659E cmp ebp, esp .text:004665A0 jnz short loc_46653C ; 如果 ebp != esp,跳轉(zhuǎn)到異常處理 .text:004665A0 ; 正常情況下,esp,ebp 均指向 _KTRAP_FRAME .text:004665A2 and dword ptr [ebp+2Ch], 0 ; _KTRAP_FRAME.Dr7 = 0 .text:004665A6 test byte ptr [esi+2Ch], 0FFh .text:004665AA mov [esi+134h], ebp ; CurrentThread.TrapFrame = ebp,即指向當前 _KTRAP_FRAME .text:004665B0 jnz Dr_FastCallDrSave ; 如果DebugActive == 1(被調(diào)試),那么跳轉(zhuǎn)到 Dr_FastCallDrSave .text:004665B0 ; Dr_FastCallDrSave 的功能是保存調(diào)試寄存器 .text:004665B6 .text:004665B6 loc_4665B6: ; CODE XREF: Dr_FastCallDrSave+10j .text:004665B6 ; Dr_FastCallDrSave+7Cj .text:004665B6 mov ebx, [ebp+60h] .text:004665B9 mov edi, [ebp+68h] .text:004665BC mov [ebp+0Ch], edx ; _KTRAP_FRAME.DbgArgPointer = edx, 保存3環(huán)參數(shù)指針 .text:004665BF mov dword ptr [ebp+8], 0BADB0D00h .text:004665C6 mov [ebp+0], ebx ; _KTRAP_FRAME.DbgEbp = _KTRAP_FRAME.Ebp .text:004665C9 mov [ebp+4], edi ; _KTRAP_FRAME.DbgEip = _KTRAP_FRAME.Eip .text:004665CC sti

三、總結(jié)

和 KiSystemService 大同小異,主要的區(qū)別是 sysenter 只改了eip,cs,ss,雖然esp也改了,但是windows不使用,而是從TSS里取esp0;另外sysenter并沒有像中斷門那樣壓棧,所以3環(huán)的 ss, esp, eflags, cs,eip都要在函數(shù)里依次保存到 _KTRAP_FRAME 。

接下來就是按照 _KTRAP_FRAME 的約定一個一個填值而已。但是有一行我看不懂:

.text:00466560 or [esp+0A4h+var_A3], 2

這行實際上是:

.text:00466560 or [esp+1], 2

分析后可以發(fā)現(xiàn),這行指令的作用是將3環(huán)的EFlags的IF位置1,即啟用中斷。

附 eflags 寄存器

總結(jié)

以上是生活随笔為你收集整理的(48)逆向分析 KiFastCallEntry 函数填充 _KTRAP_FRAME 部分的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。