## 追蹤一次API函數調用筆記

0x00前言

本人大一小菜雞一枚,想把平時玩的東西記錄一下,第一次寫博客,有不對的地方望各位大牛斧正(輕點噴,輕點噴)。

0x01 三環部分

  1. 幾個重要的 API
    Kernel32.dll:最核心的功能模塊,比如管理內存、進程和線程相關的函數等.
    User32.dll:是 Windows 用戶界面相關應用程序接口,如創建窗口和發送消息等.
    GDI32.dll:全稱是 Graphical Device Interface(圖形設備接口),包含用於畫圖和顯示文本的函 數.比如要顯示一個程序窗口,就調用了其中的函數來畫這個窗口.
    Ntdll.dll:大多數 API 都會通過這個 DLL 進入內核(0 環).

  2. 分析 ReadProcessMemory 用 IDA 載入 Kernel32.dll
    在這裏插入圖片描述

爲 NtReadVirtualMemory 傳參(在 ntdll 裏) 如果返回值小於 0,調用失敗,返回 0; 如果返回值不小於 0,調用成功,返回 1; (其實沒幹什麼).

接下來看看 NtReadVirtualMemory,載入 ntdll
在這裏插入圖片描述

這個 0Bah 是一個系統服務表的編號 這個函數同樣沒做什麼,把編號傳到了 eax 裏 然後調用 7ffe0300 指向的函數

0x02 三環進 0 環

1._KUSER_SHARED_DATA

  1. 在 User 層和 Kernel 層分別定義了一個 _KUSER_SHARED_DATA 結構區域,用於 User 層和 Kernel 層共享某些數據 .

  2. 它們使用固定的地址值映射,_KUSER_SHARED_DATA 結構區域在 User 和 Kernel 層地 址分別爲:
    User 層地址爲:0x7ffe0000
    Kernnel 層地址爲:0xffdf0000

注意:雖然指向的是同一個物理頁,但在 User 層是隻讀的,在 Kernnel 層是可寫的

所以說 NtReadVirtualMemory 裏 7ffe0300 地址就是_KUSER_SHARED_DATA+0x300 的 地方用
windbg 查一下
kd> dt _KUSER_SHARED_DATA
在這裏插入圖片描述

0x7FFE0300 的 systemcall 有兩種:一種是快速調用,另一種通過中斷門
那麼問題來了

怎麼判斷是否支持快速調用?

當通過 eax=1 來執行 cpuid 指令時,處理器的特徵信息被放在 ecx 和 edx 寄存器 中,其中 edx 包含了一個 SEP 位(11 位),該位指明瞭當前處理器知否支持 sysenter/sysexit 指令

如果支持: ntdll.dll!KiFastSystemCall()
如果不支持:ntdll.dll!KiIntSystemCall()

這兩個函數都是 ntdll 裏的函數 需要用 x32dbg 測試一下 隨便託個 exe 進去
1)把 eax 改成 1,edx 和 ecx 改成 0
在這裏插入圖片描述
2)修改彙編:改爲 cupid,執行看結果
在這裏插入圖片描述

1010 1111 1111
SEP 位(11)爲 1,所以說我的 cpu 支持快速調用, 是 ntdll.dll!KiFastSystemCall()
雖然是快速調用但爲了學習還是主要說ntdll.dll!KiIntSystemCall()
(掐會兒腰,可把我閒壞了)

ntdll.dll!KiIntSystemCall(不支持快速調用)
依然在 ntdll 裏

在這裏插入圖片描述

其中系統編號存在 eax 裏(見上部分) edx 裏存的是剛剛傳入的參數在哪裏
Int 2Eh //通過編號爲 2E 的中斷門調用

從中斷門進 0 環需要查 IDT 來確定 cs 和 eip,還要查內存通過 TSS 來找 ss 和 esp, 所以說相對於快速調用會比較慢

接下來 windbg 找 IDT,確定中斷門
在這裏插入圖片描述

Cs 是 0008,偏移是 8040f631,通過 cs 找到的基地址是 0000 0000,所以就是 8040f631在這裏插入圖片描述
通過地址找到 nt!KiSystemService
在這裏插入圖片描述
*ps:因爲當時對應的符號文件沒有導入IDA裏,所以我接下來就用windbg看了。
*
在分析代碼之前需要先了解幾個結構體

1. _Ktrap_frame

在這裏插入圖片描述
(這個圖我是嫖的(手動滑稽))
簡而言之,這個結構體就是保存3環到0環時3環的環境

2. _ETHREAD 結構體
各位看官用windbg看一下吧,簡而言之,是儲存線程信息的

3. KPCR 結構體
還是,用windbg看一下,簡而言之,是儲存CPU信息的,
我們需要用到最後一個成員中的 CurrentThread 來獲取當前線程的_KTHREAD 結構體。

0x03 0環

正式開始分析 nt!KiSystemService(有點小激動)
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
Okk,總得來說就是把Ktrap_frame結構體的信息填好,然後將[KTHREAD+0x128]處舊的TRAPFRAME切換爲這個新的KTRAPFRAME然後調用內核函數。如果是快速調用最後也會跳到nt!KiFastCallEntry+0x8d(804df781) 這個地址
接下來需要系統服務表的知識
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
原理如下圖所示:(沒錯,下面這個圖我也是嫖的,實在不知道從哪來的了)

在這裏插入圖片描述

0x04 總結

第一次寫博客,着實不太會用(是我菜了),雖然寫的都是很老的東西,但對與我這樣的小白還是想總結總結。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章