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).
【簡而言之就是一個很輕量級的庫(就兩個文件),可以動態(tài)的去修改macho可執(zhí)行文件的屬性】
項目地址:FishHook

案例一【HOOK 系統(tǒng)函數(shù)】

  • 直接把FishHook的兩個文件直接拖進項目,并引入頭文件
image.png
  • 申明一個函數(shù)指針用于保存原NSLog的真實函數(shù)地址
    static void(*origNSLog)(NSString *format, ...);
  • 自定義一個新的函數(shù)用于取代NSLog
void newNSLog(NSString *format, ...){
    //再調(diào)用系統(tǒng)的nslog
    origNSLog(@"就不打印");
}
  • 調(diào)用fishhook的rebind_symbols實現(xiàn)hook
struct rebinding bind;
bind.name = "NSLog";//要HOOK系統(tǒng)函數(shù)的函數(shù)名稱
bind.replacement = newNSLog;//新的函數(shù)去替換系統(tǒng)的NSLog
bind.replaced = (void *)&origNSLog;//把真正的NSLog地址保存到origNSLog
struct rebinding rebs[] = {bind};
rebind_symbols(rebs, 1);

上面這種事傳統(tǒng)的寫法,我們也可以簡寫成
rebind_symbols((struct rebinding [1]){{"NSLog",newNSLog,(void*)&origNSLog}}, 1);

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

HOOK成功~~~~~~~~~

案例二【HOOK 自定義函數(shù)】

  • 在案例一的基礎(chǔ)上繼續(xù)加,首先聲明一個自定義函數(shù)func
void func(){
    NSLog(@"123");
}
  • 申明一個函數(shù)指針用于保存原func的真實函數(shù)地址
    static void(*origFunc)();
  • 自定義一個新的函數(shù)用于取代func
void newFunc(){
    NSLog(@"456");
}
  • 調(diào)用fishhook的rebind_symbols實現(xiàn)hook
    rebind_symbols((struct rebinding [1]){{"func",newFunc,(void*)&origFunc}}, 1);
  • 查看hook結(jié)果
image.png

不難看出hook失敗了,hook成功的話,應該打印456才對

FishHook的原理

通過以上兩個案例為何FishHook能hook系統(tǒng)函數(shù),卻hook不了我們自己的函數(shù),接下來我們對其原理進行分析

科普一下

ASLR技術(shù):是一種針對緩沖區(qū)溢出的安全保護技術(shù),通過對堆、棧、共享庫映射等線性區(qū)布局的隨機化,通過增加攻擊者預測目的地址的難度。對于我們APP而言,它保證每次MachO文件加載的時候是隨機地址【這個我們可以通過LLDB指令的image list去查看】


image.png

根據(jù)蘋果pic技術(shù)【位置代碼獨立】,當我們Macho需要調(diào)用系統(tǒng)庫函數(shù)的時候,會在_DATA段中建立一個指針。DYLD【動態(tài)庫加載】會進行動態(tài)的綁定,會將這個指針指向外部函數(shù)

回過頭我們在分析我們之前的兩個案例

根據(jù)PIC技術(shù),我們在調(diào)用NSLog的時候,系統(tǒng)會現(xiàn)在_Data段建立一個指針,這個指針在DYLD動態(tài)加載Foundation框架時,把這個指針指向NSLog的的真實地址。
fishhook他實際就是在改這個指針,讓這個指針向我們本地函數(shù)的地址。
所以fishhook的函數(shù)名字就叫rebind_symbols(重新綁定這個符號【指針】),很貼切。而我們本身自己的函數(shù),不存在這個DYLD動態(tài)加載的過程,自然無法HOOK的了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容