API函式呼叫過程(3環進0環)

2021-09-21 13:35:53 字數 1609 閱讀 8106

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中儲存)找到要執行的核心函式?

add      edi,

[esi+_kthread.servicetable]

; edi=服務表 ssdt 或者shadow ssdt

mov ebx,

[edi+eax*

4]

3)呼叫時引數是儲存到3環的堆疊,如何傳遞給核心函式?

把引數複製到0環

mov     ebx,

[edi+eax*4]

; ebx=要呼叫的函式位址

sub esp, ecx ; 提公升棧頂 用來複製引數

shr ecx,

2; cl/

4 才是真正的引數個數

mov edi, esp

rep movsd ; 由esi複製到edi 次數為 ecx

4)2中呼叫方式是如何返回到3環的?

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...