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

2021-09-27 09:32:56 字數 1864 閱讀 3410

kernel32.dll(readprocessmemory)只是簡單呼叫了

ntdll.dll(ntreadprocessmemory)

.text:7c92d9e0                 public zwreadvirtualmemory

.text:7c92d9e0 zwreadvirtualmemory proc near           ; code xref: ldrfindcreateprocessmanifest+1ccp

.text:7c92d9e0                                         ; ldrcreateoutofprocessimage+7cp ...

.text:7c92d9e0                 mov     eax, 0bah       ; ntreadvirtualmemory

.text:7c92d9e5                 mov     edx, 7ffe0300h

.text:7c92d9ea                 call    dword ptr [edx]

.text:7c92d9ec                 retn    14h

.text:7c92d9ec zwreadvirtualmemory endp

可以發現.text:7c92d9ea                 call    dword ptr [edx]這個[edx]實際上是有特殊的含義的

我們先了解乙個結構體

1、_kuser_sjared_data

1)在user層和kerner層分別定義了乙個_kuser_shared_data

用於user層和kerner層共享某些資料

特別說明

雖然指向的是同乙個物理頁,但在user層是唯讀的,在kerner層是可寫的

在0x300位置有乙個systemcall

0x7ffe03000到底儲存什麼

支援sysenter/sy***it 指令 支援:ntdll.dll!kifastsystemcall()

不支援sysenter/sy***it 指令:ntdll.dll!kiintsystemcall()

如何判斷cpu是否支援sysenter/sy***it 指令

當通過eax=1來執行cpuid時,處理器的特徵資訊放在了ecx和edx暫存器中,其中edx包含了乙個sep位(11位),

該位指明了當預處理器是否支援sysenter/sy***it(1支援0不支援)

3.進0環需要更改哪些暫存器?

1)cs的許可權由3變0,意味著新的cs

2)ss與cs許可權永遠一致,需要新的ss

3)許可權發生切換,堆疊也要發生切換,需要新的esp

4)進0環後的**的位置,需要eip

ntdll.dll!kifastsystemcall()

ntdll.dll!kiintsystemcall()

他倆無區別,這兩種提供

這四個值怎麼找的方法,方法不同而已

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

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

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