iOS逆向之旅(進階篇) — HOOK(FishHook)

官方簡介

fishhook is a very simple library that enables dynamically rebinding symbols in Mach-O binaries running on iOS in the simulator and on device. This provides functionality that is similar to using DYLD_INTERPOSE on OS X. At Facebook, we've found it useful as a way to hook calls in libSystem for debugging/tracing purposes (for example, auditing for double-close issues with file descriptors).
【簡而言之就是一個很輕量級的庫(就兩個文件),能夠動態的去修改macho可執行文件的屬性】 項目地址:FishHook 。git

案例一【HOOK 系統函數】

  • 直接把FishHook的兩個文件直接拖進項目,並引入頭文件

image.png

  • 申明一個函數指針用於保存原NSLog的真實函數地址 static void(*origNSLog)(NSString *format, ...);
  • 自定義一個新的函數用於取代NSLog
void newNSLog(NSString *format, ...){
    //再調用系統的nslog
    origNSLog(@"就不打印");
}
複製代碼
  • 調用fishhook的rebind_symbols實現hook
struct rebinding bind;
bind.name = "NSLog";//要HOOK系統函數的函數名稱
bind.replacement = newNSLog;//新的函數去替換系統的NSLog
bind.replaced = (void *)&origNSLog;//把真正的NSLog地址保存到origNSLog
struct rebinding rebs[] = {bind};
rebind_symbols(rebs, 1);
複製代碼

上面這種事傳統的寫法,咱們也能夠簡寫成
rebind_symbols((struct rebinding [1]){{"NSLog",newNSLog,(void*)&origNSLog}}, 1);github

  • 這樣就hook成功了,直接看效果

image.png
HOOK成功~~~~~~~~~

案例二【HOOK 自定義函數】

  • 在案例一的基礎上繼續加,首先聲明一個自定義函數func
void func(){
    NSLog(@"123");
}
複製代碼
  • 申明一個函數指針用於保存原func的真實函數地址 static void(*origFunc)();
  • 自定義一個新的函數用於取代func
void newFunc(){
    NSLog(@"456");
}
複製代碼
  • 調用fishhook的rebind_symbols實現hook rebind_symbols((struct rebinding [1]){{"func",newFunc,(void*)&origFunc}}, 1);
  • 查看hook結果

image.png
不難看出hook失敗了,hook成功的話,應該打印456纔對

FishHook的原理

經過以上兩個案例爲什麼FishHook能hook系統函數,卻hook不了咱們本身的函數,接下來咱們對其原理進行分析安全

科普一下

ASLR技術:是一種針對緩衝區溢出的安全保護技術,經過對堆、棧、共享庫映射等線性區佈局的隨機化,經過增長攻擊者預測目的地址的難度。對於咱們APP而言,它保證每次MachO文件加載的時候是隨機地址【這個咱們能夠經過LLDB指令的image list去查看】 bash

image.png

根據蘋果pic技術【位置代碼獨立】,當咱們Macho須要調用系統庫函數的時候,會在_DATA段中創建一個指針。DYLD【動態庫加載】會進行動態的綁定,會將這個指針指向外部函數app

回過頭咱們在分析咱們以前的兩個案例

根據PIC技術,咱們在調用NSLog的時候,系統會如今_Data段創建一個指針,這個指針在DYLD動態加載Foundation框架時,把這個指針指向NSLog的的真實地址。
fishhook他實際就是在改這個指針,讓這個指針向咱們本地函數的地址。
因此fishhook的函數名字就叫rebind_symbols(從新綁定這個符號【指針】),很貼切。而咱們自己本身的函數,不存在這個DYLD動態加載的過程,天然沒法HOOK的了。框架

相關文章
相關標籤/搜索