iT邦幫忙

2022 iThome 鐵人賽

DAY 24
0

前言

我發現前天不是因為吃到壞東西而過敏,而是因為環境灰塵太多 : (

今天要講到的是 API Hook,用到了很多我們在之前學習到的技術。這個技術我覺得算是對之前的技術大集合。

甚麼是 API Hook?

我們在寫程式時或使用任何資源、程序時,都會使用到 windows 提供的 API。

像是當你想要在檔案總管上打開 ThreeSleepCat.png 這張圖時, explorer.exe 就會使用讀取檔案的API,執行這個 API 時引發一系列的調用,最終發出 system call。系統會進入核心模式( kernel mode )來做出處理,此時 OS 會進行檔案輸出等特權指令。當完成後又會回到用戶模式 ( user mode ) 繼續讓你做下一個任務。

示意圖 :

https://ithelp.ithome.com.tw/upload/images/20221008/20135675tlPFI4VCyL.jpg

阿不是,是這張 :

https://ithelp.ithome.com.tw/upload/images/20221008/201356750aIEfDL9QT.png

我們可以把它簡化成 :

https://ithelp.ithome.com.tw/upload/images/20221008/20135675pV43ANyq6y.png

當我們使用 API Hook 的時候,就要劫持請求與回應的這個時機,有點類似於網路滲透技術的中間人攻擊( MITM )。技術上主要是把 hack.dll 或攔截方法注入到目標程序,然後用一些辦法將 hack.dll 的 CreateFile() 取代kernel32CreateFile()。當程序調用 CreateFile() 時,就會使用到我們寫的程序而不是系統本來的程序

https://ithelp.ithome.com.tw/upload/images/20221008/20135675QAyrqhUHv4.png

而使用這項操作理論上常常使用一系列的技術來執行 :

修改位置

  • IAT ( Impotr Address Table )
    把原本要導入的 DLL 檔案替換成要注入的 DLL 檔案位置,使程序引入時會直接引入到我們的 DLL檔案。簡單,但無法勾取原本不在 IAT 的 API
  • 代碼
    透過程序映射時到記憶體時直接修改 API 的位置,常常會有幾種方式 :
    • jmp 指令
    • 複寫函式
    • 更改局部函式
  • EAT ( Export Address Table )
    把引用 DLL 中的 EAT 導出位置改成我們的函數位置,但由於太麻煩而且效果也沒那麼好,所以這方法不常用。

設置函式方法

這是要在程序的記憶體上設置 Hook 函式的方法,主要分為除錯法與注入法,而注入法又分為代碼注入DLL 注入

  • 除錯法
    透過 Debug API 附加到目標程序上面( 以C++來說就是 “debugapi.h” ),取得所有權限就可以暫停目標程序以進行各種操作,運行時就可以執行我們修改過後的東西。就像使用 x64dbg 時暫停程序來修改指令那樣。
  • 注入法
    注入法是把要使用的東西注入到目標程序的記憶體,以此來方便 Hook 程序執行。
    • DLL 注入
      把 DLL 檔案注入到目標記憶體,要在 allMain 上設置啟動程序與相應的 Hook 程序,注入時就可以執行 Hooking。
    • 代碼注入
      就是昨天寫的代碼注入。它會對所要的是執行代碼在被資料注入時( 所需函數 ),直接獲取自身所需要的 API 位置來進行調用。

以上是 API Hook 的介紹,明天來研究如何進行 API Hook。


上一篇
Dx23 - 直接代碼注入
下一篇
Dx25 - 寫一個 API Hook 程式
系列文
我逆向你逆向我的逆向工程膩31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言