Frida官方手冊 - 函式Hook

freakish發表於2017-10-19

函式Hook

  • 這一篇我們看下如何在目標程式中對程式中的函式進行呼叫監視、引數修改、以及函式的主動呼叫

準備環境

  • 建立檔案 hello.c,內容如下:
  • 使用如下命令進行編譯:
  • 啟動程式,然後記下函式 f() 的地址(在這個例子中,值是0x400544):

函式Hook

  • 下面這個指令碼中,對目標程式的函式 f() 進行了Hook,並把攔截到的函式的引數彙報出來,建立檔案 hook.py 包含如下內容:
  • 使用上面記錄下的函式地址 0x400544 啟動指令碼,命令如下:
  • 正常情況,每隔1秒鐘應該能看到一行輸出,大致內容如下:

修改函式引數

  • 這一次,我們還是利用上面的層序,但是這次我們是要修改函式呼叫的引數了,建立檔案 modify.py,大致內容如下:
  • 使用如下命令執行這個指令碼:
  • 這次執行下來,在控制檯裡面可以看到控制檯就一直輸出 1337,直到你按 Ctrl+D 停止程式執行,結果大致如下(譯者注:官方文件的這個顯示結果有點蛋疼):

函式呼叫

  • 我們可以使用Frida在目標程式空間內進行函式呼叫,建立檔案 call.py,大致內容如下:
  • 使用如下命令列執行:
  • 注意觀察輸出結果,然後結合測試程式的邏輯,輸出結果可以看出函式呼叫成功了:

第二個實驗:注入字串並且執行函式呼叫

  • 利用Frida你可以在目標程式中注入整形、字串、甚至是任何你需要的型別。為了實驗需要,建立如下檔案 hi.c,內容如下:
  • 和上面的實驗相似,接著建立一個指令碼檔案 stringhook.py ,使用Frida把字串注入記憶體,然後呼叫函式 f(),大致內容如下:
  • 注意觀察程式 hi 的輸出結果,應該能看到大致如下的輸出結果:
  • 使用類似的方法,比如 Memory.alloc()Memory.protect()很容就能操作目標程式的記憶體,可以建立Python的 ctypes 和其他記憶體結構比如 structs,然後以位元組陣列的方式傳遞給目標函式。

注入指定格式的記憶體物件 - 例子:sockaddr_in結構

  • 有過網路程式設計經驗的人應該都熟悉這個最常見的C結構。下面給出一個示例程式,程式中建立了一個socket,然後通過5000埠連線上伺服器,然後通過這條連線傳送了一個字串 “Hello there!”,程式碼如下:
  • 這基本上是一個比較標準的網路程式,使用第一個引數作為目標IP地址進行連線。開啟一個命令,執行 nc -l 5000 這條命令,然後再開啟另外一個命令列,執行如下命令:./client 127.0.0.1,這個時候你應該就能看到執行nc命令的那個視窗開始顯示訊息了,你也可以在nc視窗裡面傳送字串到client程式去。
  • 現在我們來玩點好玩的吧,根據前面的描述,我們可以往目標程式中注入字串以及記憶體指標,我們也可以用同樣的方式來操作 sockaddr_in 來達到我們的目的,現在我們來執行程式,看到如下輸出:
  • 如果你還不熟悉 sockaddr_in 這個結構,可以到網上去查詢相關的資料,相關資料還是很多的。這裡我們重點關注 0x1388,也就是10進位制的5000,這個就是我們的埠號,如果我們把這個資料改成 0x1389,我們就能把客戶端的連線重定向到另外一個埠去了,如果我們把接下來的4位元組資料也修改的話,那就能把客戶端重定向到另外一個IP去了!
  • 下面我們來看這個指令碼,這個指令碼注入了一個指定格式的記憶體結構,然後劫持了libc.so中的 connect() 函式,在劫持的函式中用我們構造的結構體,替換 connect() 函式的第一個引數。建立檔案 struct_mod.py,內容如下:
  • 這個指令碼里同時還提到,我們可以使用 Module.findExportByName() 這個API來在目標程式中的指定模組中查詢指定的匯出函式,尤其是在比較大的可執行檔案裡面,但是在我們的這裡例子中,這不是重點。
  • 現在使用命令 ./client 127.0.0.1 把程式執行起來,然後在另外一個命令列中執行 nc -l 5001,在第三個命令列中執行 ./struct_mod.py,一旦我們的指令碼執行起來,在 client 的那個命令列視窗裡面和 nc 命令列視窗裡面就能看到字串訊息了。
  • 通過上面這個實驗,我們成功的劫持了網路應用程式,並且通過Frida修改了程式的原始行為達到了我們不可告人的目的。
  • 這個實驗證明了Frida的真正強大之處,那就是:
    1. 無程式碼修改
    2. 不需要複雜的逆向
    3. 不需要花大量的時間去反彙編(譯者注:感覺跟第2點是同一個東西呢
  • 這裡再給出一個關於這篇文章內容的視訊演示地址:

相關文章