1. 什么是 Hook?
Hook 英文翻譯過來就是「鉤子」的意思,那我們在什么時候使用這個「鉤子」呢?在 Android 操作系統中系統維護著自己的一套事件分發機制。應用程序,包括應用觸發事件和后臺邏輯處理,也是根據事件流程一步步地向下執行。而「鉤子」的意思,就是在事件傳送到終點前截獲并監控事件的傳輸,像個鉤子鉤上事件一樣,并且能夠在鉤上事件時,處理一些自己特定的事件。
Hook 原理圖
Hook 的這個本領,使它能夠將自身的代碼「融入」被勾住(Hook)的程序的進程中,成為目標進程的一個部分。API Hook 技術是一種用于改變 API 執行結果的技術,能夠將系統的 API 函數執行重定向。在 Android 系統中使用了沙箱機制,普通用戶程序的進程空間都是獨立的,程序的運行互不干擾。這就使我們希望通過一個程序改變其他程序的某些行為的想法不能直接實現,但是 Hook 的出現給我們開拓了解決此類問題的道路。當然,根據 Hook 對象與 Hook 后處理的事件方式不同,Hook 還分為不同的種類,比如消息 Hook、API Hook 等
2. 常用的 Hook 框架
關于 Android 中的 Hook 機制,大致有兩個方式:
要 root 權限,直接 Hook 系統,可以干掉所有的 App。
免 root 權限,但是只能 Hook 自身,對系統其它 App 無能為力。
3. 使用 Java 反射實現 API Hook
通過對 Android 平臺的虛擬機注入與 Java 反射的方式,來改變 Android 虛擬機調用函數的方式(ClassLoader),從而達到 Java 函數重定向的目的,這里我們將此類操作稱為 Java API Hook。
4.Hook 的選擇點:靜態變量和單例,因為一旦創建對象,它們不容易變化,非常容易定位。
Hook 過程:
尋找 Hook 點,原則是靜態變量或者單例對象,盡量 Hook public 的對象和方法。
選擇合適的代理方式,如果是接口可以用動態代理。
偷梁換柱——用代理對象替換原始對象。