02 API呼叫過程(3環進0環上)

2021-09-10 18:57:33 字數 3307 閱讀 9489

1、_kuser_shared_data

<1>在user和kernel層分別定義了乙個_kuser_shared_data結構區域,用於user層和kernel層共享某些資料。

<2>它們使用固定的位址對映,_kuser_shared_data在user層和kernel層的位址分別為:

user層位址為:0x7ffe0000

kernel層位址為:0xffdf0000

雖然指向的是同一物理頁,但在user層是唯讀的,在kernel層是可寫的

用wndbug檢視兩處的值是相同的:

在前一篇我們跟readprocessmemory函式的時候跟到乙個位址0x7ffe0300

.text:7c92d9fe mov eax, 0bah ; ntreadvirtualmemory 0bah-->對應的是作業系統中某個核心函式的編號

.text:7c92da03 mov edx, 7ffe0300h ; 這個記憶體位址存放的是乙個位址,這個位址決定我們要以什麼方式進0環

.text:7c92da08 call dword ptr [edx]

.text:7c92da0a retn 14h

.text:7c92da0a _ntreadvirtualmemory@20 endp

2、0x7ffe0300這個位置到底儲存的是什麼函式

快速呼叫:中斷門進0環需要的cs和eip在idt中,需要查記憶體(ss與esp由tss提供),而cpu如果支援sysenter指令時,作業系統會提前將cs/ss/esp/eip儲存在msr暫存器中,sysenter指令執行時,cpu會將msr中的值直接寫入相應的暫存器中,沒有讀記憶體的過程,所以叫做快速呼叫。

當cpu支援快速呼叫時:

ntdll.dll!kifastsystemcall()

不支援時:

ntdll.dll!kiintsystemcall()

將eax設定為1,執行cpuid,處理器的特徵被存放在ecx和edx中,其中edx包含了乙個sep位(11位),該位指明當預處理器是否支援sysenter/sy***it指令

我們用od來看一下自己的處理器是否支援,首先將eax置1並寫入cpuid彙編**,如圖:

f8執行觀察結果:

拆分edx得到第11位,可知本人的還是支援的。

3、進0環需要修改哪些暫存器

<1>cs的許可權由3變成0,意味著需要新的cs

<2>ss與cs的許可權一致,所以需要新的ss

<3>許可權發生切換,堆疊也一定要切換,所以需要新的esp

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

ntdll.dll!kifastsystemcall() ntdll.dll!kiintsystemcall() 這兩函式提供了查詢這些值的功能,只是找的方式不一樣

4、中斷門進0環

cpu不支援快速呼叫時kiintsystemcall()

; _dword __stdcall kiintsystemcall()

.text:7c92e520 public _kiintsystemcall@0

.text:7c92e520 _kiintsystemcall@0 proc near ; data xref: .text:off_7c923428↑o

.text:7c92e520

.text:7c92e520 arg_4 = byte ptr 8

.text:7c92e520

.text:7c92e520 lea edx, [esp+arg_4] ; 系統呼叫號在eax中,將引數指標放在edx中

.text:7c92e524 int 2eh ; dos 2+ internal - execute command

.text:7c92e524 ; ds:si -> counted cr-terminated command string

.text:7c92e524 ; 通過中斷門的形式進入核心

.text:7c92e526 retn

.text:7c92e526 _kiintsystemcall@0 endp

5、快速呼叫進0環

kifastsystemcall() 函式

.text:7c92e510 ; _dword __stdcall kifastsystemcall()

.text:7c92e510 public _kifastsystemcall@0

.text:7c92e510 _kifastsystemcall@0 proc near ; data xref: .text:off_7c923428↑o

.text:7c92e510 mov edx, esp ; 三環棧頂放入edx中,系統呼叫號在eax中

.text:7c92e512 sysenter ; 暫存器資料傳遞

.text:7c92e512 _kifastsystemcall@0 endp

Hbase學習02 API操作

重要的部分 1.建立hbase連線以及admin管理物件 要操作hbase也需要建立hbase的連線,此處我們仍然使用testng來進行測試,使用 beforetest初始化hbase的連線,然後建立admin的物件,aftertest來關閉連線 實現步驟 1.1使用hbaseconfigurati...

node學習筆記 02 API詳解

一.知識點 url.parse方法 方法說明 講乙個url字串轉換成物件並返回。語法 url.parse urlstr,parsequerystring slashesdenotehost 接收引數 urlstr url字串 parsequerystring 為true時將使用查詢模組分析查詢字串,...

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