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