(48)逆向分析 KiFastCallEntry 函式填充 _KTRAP_FRAME 部分
一、回顧
上一篇部落格我逆向了 KiSystemService 函式填充 _KTRAP_FRAME 部分。
逆向分析 KiSystemService 函式填充 _KTRAP_FRAME 部分
裡面涉及了6個結構體,分別是 _KTRAP_FRAME,_ETHREAD,_KTHREAD,_KPCR,_NT_TIB 和 _KPRCB。這些結構體待會逆向 _KiFastCallEntry 時也要用到,我在本文就不貼出來了,有需要可以去上篇部落格檢視或者在windbg裡 dt 檢視。
這裡貼一張 _KTRAP_FRAME 的示意圖:
KiSystemService 通過中斷門進0環,進0環後,3環的 esp,ss,eip,cs,eflags 都儲存到0環棧裡了,進0環後應該先把當前的暫存器的值按照_KTRAP_FRAME的約定壓到棧裡。
KiFastCallEntry 做的事情是類似的,下面我貼出我逆向的結果。
二、逆向分析 KiFastCallEntry 函式
.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環資料段
.text:00466549 mov ds, ecx ; ds = 0x23, 00cff300`0000ffff, 3環資料段
.text:0046654B mov es, ecx ; es = 0x23
.text:0046654D mov ecx, ds:0FFDFF040h
.text:00466553 mov esp, [ecx+4] ; esp = _KPCR.TSS.Esp0,切換到0環堆疊
.text:00466556 push 23h ; _KTRAP_FRAME.HardwareSegSs = 0x23
.text:00466558 push edx ; _KTRAP_FRAME.HardwareEsp = edx, edx是3環棧頂.
.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環API引數
.text:0046655F popf ; EFlags = 0x02,即清空0環所有標誌位
.text:0046655F ; 此時 esp 指向 EFlags
.text:00466560 or [esp+0A4h+var_A3], 2 ; _KTRAP_FRAME.EFlags 即3環 EFlags 的 IF = 1
.text:00466565 push 1Bh ; _KTRAP_FRAME.SegCs = 0x1B, 3環程式碼段
.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環來
.text:0046658E sub esp, 48h ; esp 指向 _KTRAP_FRAME
三、總結
和 KiSystemService 大同小異,按照 _KTRAP_FRAME 的約定一個一個填值而已。但是有一行我看不懂:
.text:00466560 or [esp+0A4h+var_A3], 2
這行實際上是:
.text:00466560 or [esp+1], 2
分析後可以發現,這行指令的作用是將3環的EFlags的IF位置1,即啟用中斷。
附 eflags 暫存器
相關文章
- C++ 逆向之 move 函式C++函式
- 一個 Pillow 實現的影像填充函式函式
- 一個 Pillow 實現的影象填充函式函式
- python的部分內建函式Python函式
- C++ 逆向之 main 函式的查詢C++AI函式
- Oracle分析函式與視窗函式Oracle函式
- PHP程式碼簡潔之道——函式部分PHP函式
- 曹廣福實變函式論與泛函分析部分習題解答 習題二 三 四函式泛函分析
- [手遊逆向]如何不完美呼叫void函式函式
- canvas填充樣式Canvas
- Hive之分析函式Hive函式
- ORALCE函式:LAG()和LEAD() 分析函式詳解函式
- iOS逆向(6)-從fishhook看Runtime,Hook系統函式iOSHook函式
- CTF逆向:將陣列作為函式程式碼執行陣列函式
- 病毒逆向分析
- Oracle分析函式之開窗函式over()詳解Oracle函式
- MySQL分析函式實現MySql函式
- Linux中select()函式分析Linux函式
- count 函式原始碼分析函式原始碼
- 程式碼保護軟體VMP逆向分析虛擬機器指令:指令中包含了函式呼叫虛擬機函式
- 【JS逆向百例】cebupacificair 航空逆向分析JSAI
- (未完成)APC函式的執行,分析 KiDeliverApc 函式函式IDE
- CreateProcess逆向分析-3環使用者層逆向分析(一)
- Android逆向分析概述Android
- ORACLE分析函式手冊(轉)Oracle函式
- openGauss 高階分析函式支援函式
- oracle資料庫常用分析函式與聚合函式的用法Oracle資料庫函式
- PostgreSQL 原始碼解讀(48)- 查詢語句#33(query_planner函式#9)SQL原始碼函式
- iOS逆向之旅(基礎篇) — 彙編(四) — 彙編下的函式iOS函式
- switch語句逆向分析
- CPython逆向實戰分析Python
- ELF檔案逆向分析
- 【使用者行為規則】部分能否加入【函式】呢?函式
- 第六部分函式、資料結構函式資料結構
- Data Lake Analytics的Geospatial分析函式函式
- 常用分析函式開窗講解函式
- [20190728]分析函式LAST_VALUE.txt函式AST
- 分析函式改寫自關聯函式