Hook技術入門


1. 什么是Hook?

用自己的話說一下自己的理解(不一定對,等之后有了更深的理解之后再做更新)

Hook鈎子,和動態插樁以及蹦床機制差不多,主要是為了能在執行目標函數或指令之前,攔截數據或者執行邏輯,先執行自己插入的一段代碼,然后再執行原本的目標函數。完成這個任務的方法有很多,比如可以將要調用的函數地址替換為自己的函數地址,或者在指令流中插入跳轉指令使執行邏輯跳轉到自己插入的代碼塊上,等等。不過在修改了原本的數據或指令后,還需要還原以執行原本正常的功能,也就是說在hook時還需要保存原本的現場數據以及指令信息等。

實際上就是在原本的程序執行邏輯中,hook函數獲得控制權,並執行我們自定義的功能,然后再將控制權返回原本的邏輯繼續執行。形象化可以理解為一條直線在向前走,結果走到了岔路上,走了一會兒又回到了原本的直線方向繼續向前。

2. Hook的應用場景。

Hook的應用非常廣泛,不僅開發人員會用到,攻擊者也會用到。

開發有:對程序的執行記錄日志、防止應用重復啟動等。

攻擊有:使用hook攔截用戶輸入信息,獲取鍵盤數據等。

3. Hook的技術方式或框架。

  • inline hook方式:目標函數執行指令中插入Jump跳轉指令實現重定向

  • 動態代理方式:思路應該是類似於設計模式中的代理模式,代理原本的函數的執行

  • Method Swizzle方式:動態改變SEL(方法編號)與IMP(方法實現)的對應關系

  • Cydia Substrate方式:適用於iOS和andriod,定義了一系列的函數和宏,底層調用了objc的runtime和fishHook來替代目標函數或者系統方法

  • fishHook方式:是Facebook提供一種動態修改鏈接Mach-O文件的工具。此利用Mach-O文件加載原理,通過修改非懶加載和懶加載兩個表的指針達到C函數的Hook的目的

  • Xposed框架:目標函數為native,利用JNI hook重定向表中的函數指針

  • Legend框架:Android 免 Root 環境下的一個 Apk Hook 框架,該框架代碼設計簡潔,通用性高,適合逆向工程時一些 Hook 場景。大部分的功能都放到了 Java 層,兼容性非常好。原理是直接構造出新舊方法對應的虛擬機數據結構,然后替換信息寫到內存中即可

4. Hook的一般步驟和技巧。

  • 尋找 Hook 點。原則是盡可能是靜態變量或者單例對象,因為它們容易定位,其次是盡量 Hook public 的對象和方法。

  • 選擇適當的hook方式或框架。

  • 將hook代碼注入到目標程序的運行內存中。

以上這個過程很類似於靜態插樁,選擇插樁點,准備要插樁的代碼,然后將插樁點的代碼以一定的方式寫到插樁點位置,這樣在執行時,執行到插樁點就可以運行我們插入的代碼。Hook也是一樣,當執行到Hook點時,會先執行鈎子函數以及我們寫入的函數邏輯,再執行正常邏輯。

5. 什么地方都可以Hook。

這里有一篇博客,在AddressHook、InlineHook、VEH_HOOK、SSDT_HOOK、IRP_Hook、Object Hook、sysenterHook這幾個方面進行了舉例說明。因為剛開始看還沒有消化那么多的東西,所以這里先記錄一下。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM