從刮痕開始的惡意程式開發 - Part 4: Hooking techniques

鉤子技術

Posted by XD3an on September 29, 2024

去馬戲團的路上,要小心魔鉤喔!

meme1

What is Hook?


Hook 是一種機制,用於在程式執行時,對其進行攔截、監視或修改行為,通常用於截取或修改系統或應用程式的行為,以實現一些額外的功能或監視系統活動。例如 Sandbox 。

主要的功能:
  • 攔截(Intercept):攔截系統或應用程式特定操作。
  • 監視(Monitor):用於監視系統或應用程式的活動。
  • 修改行為(Modify Behavior):修改程式或系統調用的行為。
主要的應用場景:
  • 安全研究與防禦:資安相關工具(例如:防毒軟體、EDR)經常會使用 Hook 技術監控系統調用,以檢測潛在的惡意行為。
  • 逆向工程:在逆向工程的過程中,Hook 可以有效幫助開發者或研究人員追蹤某個程式的執行路徑、監控 API 調用,以幫助分析其內部邏輯。
  • 沙箱(Sandbox):在沙箱環境中,Hook 機制可以用於監視並限制目標程式的行為,以防止對主機系統造成傷害。
  • 軟體功能增強:若想要對現有程式添加新功能,並且不修改原始碼,也可以透過 Hook 的方式輔助。
常見的 Hook 技術:
  • API Hooking:透過 Hook 系統 API,以監控或修改應用程式與作業系統互動的行為。
  • Inline Hooking:透過 Hook 修改目標函數的程式碼/指令,插入自定義程式碼/指令,使得當函數被調用時,會先依據自定義邏輯執行 Hook 的行為,再執行目標函數程式碼。
  • IAT/EAT Hooking:透過 Hook 修改 IAT / EAT 中的函數指標,指向自定義的函數,以攔截其調用。
  • Kernel Hooking:透過 Hook 內核(Kernel)函數以監控或修改 Kernel Mode 操作。此類技術用於作業系統級別的操作,需要謹慎小心,否則可能導致系統崩潰或其他安全風險。
    • SSDT Hooking(System Service Dispatch Table Hooking):Windows 的內核透過 SSDT 將系統調用調度到內核中的相對應函數。因此透過 Hook 修改 SSDT,可以實現攔截系統調用,實現內核級別的 Hook。
    • IDT Hooking(Interrupt Descriptor Table Hooking):IDT 是用於處理中斷(Interrupt)的機制,修改 IDT 可以實現攔截硬體或軟體中斷,進而控制中斷處理流程。
常見的 Hook 工具:
  • Microsoft Detours由 Microsoft 開發的一套 Hook 框架,支援 Windows 作業系統,可以用於攔截系統 API 調用,並修改其行為。
  • EasyHook一套開源的 Hook 框架,支援 Windows 作業系統,可以用於攔截應用程式的函數調用,並修改其行為。
meme2

惡意程式使用 Hook 技術可以實現包括隱藏自身、監控系統、竊取資料、修改系統行為等的惡意行為。由於 Hook 技術在合法和惡意場景中都有廣泛應用,使得惡意程式可以輕鬆利用它來實現各種攻擊手段。

How Hooks work


Hook 的方法有很多種,但最終目的都是修改某一位址內容,從而做到控制執行流程。從流程上來看,只是將直接調用的過程修改掉,經過自訂的特殊處理,再執行原先的調用,最終才達到真正的目標函數位址,此一過程也稱作Detour (中文:繞道、迂迴等),插入的這個與原函數接口完全相同(參數、類型、調用約定)的函數,稱為 Detour 函數

一般情況下,Hook 的實現過程如下:
  1. 找到目標函數
  2. 修改執行路徑
  3. 執行自定義程式碼/指令
  4. 返回原目標函數

Type of Hook

個人認為 Hook 的方法大致可以分為兩種,一種是通過修改資料(例如:引用的函數位址)進行 Hook;另一種,則是直接修改函數內部指令進行 Hook。

  • Address Hook:修改函數指標(資料)。
    • IAT Hook
    • EAT Hook
    • SSDT Hook
    • IDT Hook
    • ...
  • Inline Hook:修改函數內容(指令)。

Hook location selection

即使對同一函數進行 Hook,其大多可以同時進行 Address Hook 與 Inline Hook。對應用程式來說,為了實現某種功能,通常都會需要調用系統 API,而系統 API 是通過一系列底層調用實現的,在這一連串的調用過程中都是可以進行 Hook 的,我們應該如何挑選 Hook 的位置呢?

  1. 首先需要對 Hook 目標位置的攔截範圍與攔截內容清楚認識
  2. Hook 的位置越上層,就可以越早得到控制權
  3. Hook 的位置越下層,影響可能就越大
meme3


Common Hooking Techniques



Address Hook

是指透過修改函數指標(資料)進行 Hook 的方法,而其中所說的 “資料” 實際上是指函數位址(或是偏移量),其通常儲存在各類表或結構中、某個指定位址處,或是特殊的暫存器中,共同的特點是在執行前都會被存放在 EIP/RIP 暫存器中,只要將這些位址替換成 Detour 函數位址,就可以達到 Hook 的目標了。適合較高層的 API 調用。
  • IAT Hook
  • EAT Hook
  • SSDT Hook
  • IDT Hook
  • ...

大致步驟如下:
  1. 需要定義一個與被 Hook 函數型態一樣的函數指標,使其指向原始函數。
  2. 查表(或遍歷搜尋)找出目標含數位址,並進行替換(須關閉寫保護權限)及寫入 Detour 函數位址。
IAT Hook - MessageBoxA
攀爬 Import Directory 將指定的 MessageBoxA 的函數位址更改為自訂的函數位址(Hook function)。


iat_hook_demo

從結果中,我們可以發現兩次雖然都呼叫同一個函數 MessageBoxA,但卻不是屬於同一個函數位址,這就是因為 Hook 的過程中,我們透過攀爬 Import Directory 找出對應的模組中相同名稱的函數,並將其函數位址進行更改,如此一來,當之後需要呼叫該函數時,就會執行更改過後的 Hook 函數。

meme4

Inline Hook

是指修改函數內容(指令),其中修改的關鍵指令一般為 jmp、call、retn 等。適合較底層的系統函數。
這邊要介紹一個新的名詞 Trampoline 函數,是指原先調用目標函數的入口點,該函數中執行目標函數中被替換的前幾個指令,以便在執行原始函數的同時,可以插入自定義行為,其通常會在原始函數的開頭部分進行設置,然後調用實際的目標函數。

具體實現步驟如下:
  1. 確定 Hook 方式及需要在 Trampoline 中執行的指令。
  2. 準備 Detour 函數。
  3. 準備欲修改指令並寫入。

Inline Hook (x86) - MessageBoxA
  • 環境:Windows x86


  • inline_hook_demo

    透過將原始函數的前幾個指令替換為跳轉到自定義的 Detour 函數,使程式能夠在調用目標函數時,可以執行自定義操作。

    執行 MessageBoxA → 跳轉到 Detour 函數 → 執行 Detour 函數 → 跳到 Trampoline 後返回原始函數 MessageBoxA。


    Inline Hook with DLL Injection (x86) - MessageBoxW
  • 環境:Windows x86

  • 這裡使用 JMP 指令改寫,將目標函數位址跳至 HOOK 函數。

    需要計算 JMP 的位址機器碼指令(offset),計算公式如下:
    offset = Hook函數位址 - (目標函數位址 + 5)

    下圖舉例

    calculate_address

    根據以上,我們可以建立一個 DLL 用於 Hook 目標函數,再透過 DLL Injection,載入時,則執行 Hook 的初始化,這樣就可以實現 Hook 的目標了。

    以下是 hookdll.h

    以下是 hookdll.cpp


    再通過前面介紹的 DLL Injection 技術就可以實現將 DLL 載入至目標函數的同時,對目標函數進行 Hook 操作。

    inline_hook_dlli_demo

    Hook Tools


    Windows Hook API
    Windows 提供一套允許應用程式攔截或處理系統的消息與事件的 API,可以用於鍵盤、滑鼠、窗口和系統事件等。

    Microsoft Detours
    Microsoft Detours 是一個開源工具,用於動態重定位 Windows 應用程序中的函數。

    EasyHook
    是一個開源的 .NET Hook 解決方案,允許在 .NET 應用程序中輕鬆實現 Hook。

    Conclusion


    本篇探討了 Hook 的相關技術,並嘗試實現了簡易版的 IAT Hook、Inline Hook,甚至是將 DLL Injection 技術納入其中來幫助我們實現目標。最後也簡單列出幾個可以參考的 Hook 開發工具。
    Hook 技術經常被應用於許多地方,不論是惡意程式或資安軟體都有其技術的蹤影。

    meme5

    References