3環進0環需要換 cs eip ss esp
在中斷方式時,cs和eip在中斷門描述符裡面,ss和esp在tss裡面
通過msr暫存器獲得cs esp eip 的值,(cpu計算這個值)ss的值等於cs+8 ,所以cs=0x8 時,ss=0x10
中斷方式路線:通過_kuser_shared_data +0x300 ->kiintsystemcall ->int 2e 通過中斷門找到中斷處理程式位址->kisystemservice
快速呼叫方式路線:通過_kuser_shared_data +0x300 ->kifastsystemcall ->sysenter(在msr裡面找cs ss esp eip)->kifastcallentry
1:自己實現通過中斷門直接呼叫核心函式。
2:通過ida找到kisystemservice和kifastcallentry函式並分析
1)進0環後,原來的暫存器存在**?
儲存在trap_frame裡面
2)如何根據系統呼叫號(eax中儲存)找到要執行的核心函式?
3)呼叫時引數是儲存到3環的堆疊,如何傳遞給核心函式?add edi,
[esi+_kthread.servicetable]
; edi=服務表 ssdt 或者shadow ssdt
mov ebx,
[edi+eax*
4]
把引數複製到0環
4)2中呼叫方式是如何返回到3環的?mov ebx,
[edi+eax*4]
; ebx=要呼叫的函式位址
sub esp, ecx ; 提公升棧頂 用來複製引數
shr ecx,
2; cl/
4 才是真正的引數個數
mov edi, esp
rep movsd ; 由esi複製到edi 次數為 ecx
02 API呼叫過程(3環進0環上)
1 kuser shared data 1 在user和kernel層分別定義了乙個 kuser shared data結構區域,用於user層和kernel層共享某些資料。2 它們使用固定的位址對映,kuser shared data在user層和kernel層的位址分別為 user層位址為 0x...
03 API呼叫過程(3環進0環下)
1 int 0x2e進0環 步驟一 在idt中找到0x2e的門描述符 在windbug中用指令檢視idtr暫存器的值 r idtr 步驟二 分析cs ss esp eip的 這裡我們再來回顧一下中斷門描述符結構如下 cs和eip在中斷門描述符中 cs 0x0008 eip 0x804df631 我們...
API函式的呼叫過程(三環進0環)
kernel32.dll readprocessmemory 只是簡單呼叫了 ntdll.dll ntreadprocessmemory text 7c92d9e0 public zwreadvirtualmemory text 7c92d9e0 zwreadvirtualmemory proc n...