部分函式呼叫之核心細究

2021-08-10 16:18:18 字數 1551 閱讀 8841

其實在大部分的函式都會遵循我下面要說的這個過程,因為我們所熟知的大部分函式都是在kernel32.dll、user32.dll、gdi32.dll等系統模組裡,所以基本上都會符合我說的這個過程。首先我們來舉個例子來說明一下,比如我們的程式中呼叫的createfile這個函式。

int _tmain(int argc, _tchar* argv)

當我們在呼叫 這個函式的時候,你以為到了這些個系統模組中就完成了函式的呼叫,實則你錯了,這些函式的呼叫全部來自系統核心的呼叫,ring3和ring0之間會有一扇門,通過了這個門你就可以到達ring0,然後可以為所欲為,核心空間是所有程序共用的,所以沒有屬於誰的說法。然而我們我們一般的偵錯程式都是跑在ring3,你會發現有時你想跟乙個函式,一直跟下去,但是卻不能跟到頭,因為在某處,程式本身已經進核心執行完都回來了,然後eax都有值了你都不知道發生了什麼。下面我們來看下這個createfile函式,試著跟下它……抓緊它的手,不放開(捂臉笑)

這裡就是main函式裡的createfile函式了,然後我們就一步一步跟進去

這裡需要說幾句,下圖中會發現彙編**都比較像,是因為這裡集合windows各個模組的函式,每個呼叫號代表了乙個函式,當前我們選中的這一行就是createfile函式。

這裡我們通過ark工具pchunter來檢視下系統中對應的函式序號以及函式名稱是否一樣。

其實這裡就是真正進入ring0的入口了,但是od卻解析成了遠跳指令,這裡如果使用windbg分析的話,指令就是sysenter了,在這裡cpu會將msr暫存器中的值直接寫入相關暫存器,這種呼叫方式叫做快速呼叫。msr 176號的位置儲存的就是ring0的函式位址,過去之後會根據之前eax儲存的呼叫號來當下標索引對照著ssdt表(系統描述符表)找到函式位址,然後進行呼叫。

好了,到這裡就分析結束了,小夥伴們自己也可以試著跟著我寫的步驟進入od嘗試跟下你想跟的函式,ring3能看到的就只有這些了,進入ring0之後可以使用微軟提供的偵錯程式windbg跟著分析。

c 函式呼叫之函式定義

例如 includevoid 首先定義乙個 函式 int main 再定義乙個main 函式 void 緊接著執行這個函式,輸出內容見下 解釋以上程式 在每乙個函式的定義中,都使用了using namespace std 編譯指令。1 為什麼要使用函式原型 函式 編譯器,這裡有函式,你快把它編譯把,...

python函式呼叫之自我呼叫與C 比較

c 下的函式自我自我呼叫 第一種方法 1 include 2 using namespace std 34 intrel do 13else if a 2 17 第二種方法 兩種方法比較可以發現,rel do 方法中,呼叫rel do方法前加不加return都可以正常執行。而在python中必須使用...

ARM核心函式呼叫原理

1 將返回點的位址壓棧 2 修改pc指標,跳轉到目標位址只執行 3 返回時,直接將返回位址從棧中彈出到pc指標,實現函式的返回 對於m3 m4核心,引入了乙個鏈結暫存器lr link register 專門用來儲存函式返回位址。lr本子上相當於乙個深度為1的硬體棧,支援且僅1級函式呼叫。借助lr,核...