文章目錄
- 1 Hook概述
- 2 Hook技術分類
- 3 Hook技術原理
-
- 3.1 Hook技術實作途徑
- 3.2 Hook技術之免注冊式跳轉
- 3.3 Java層hook如何尋找hook點
1 Hook概述
說到 Hook 技術得先提到逆向工程,逆向工程源于商業及軍事領域中的硬體分析,其
主要目的是在不能輕易獲得必要的生産資訊的情況下,直接從成品分析,推導出産品的設計原理。逆向分析分為靜态分析和動态分析,其中靜态分析指的是一種在不執行程式的情況下對程式行為進行分析的技術;動态分析是指在程式運作時對程式進行調試的技術。Hook 技術就屬于動态分析,它不僅在 Android 平台中被應用,早在 Windows 平台中就已經被應用了。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLyAjNwQDOxATM0EDOwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
圖:Hook 的調用和回調
Hook 可以是一個方也或者一個對象,它像一個鈎子一樣挂在對象 A 和對象 B 之間,當對象 A 調用對象 B 之前做一些處理(比如修改方陸的參數和傳回值),起到了“欺上瞞下”的作用,與其說 Hook 是鈎子,不如說是劫持來的更貼切些。我們知道應用程式程序之間是彼此獨立的,應用程式程序和系統程序之間也是如此 ,想要在應用程式程序更改系統程序的某些行為很難直接實作,有了 Hook 技術,我們就可以在程序間進行行為更改,如下圖所示。
可以看到 Hook 可以将自己融入到它所要劫持的對象(對象 B)所在的程序中,成為系
統程序的一部分,這樣我們就可以通過 Hook 來更改對象 B 的行為。被劫持的對象(對象B ),稱作 Hook 點,為了保證 Hook 的穩定性, Hook 點一般選擇容易找到并且不易變化的對象,靜态、變量和單例就符合這一條件。
2 Hook技術分類
Hook 技術知識點比較多 ,是以 Hook 技術根據不同的角度會有很多種分類,這裡介紹
其中的三種分類。
根據 Hook 的 API 語言劃分,分為 Hook Java 和 Hook Native 。
- Hook Java 主要通過反射和代理來實作,應用于在 SDK 開發環境中修改 Java 代碼 。
- Hook Native 則應用于在 NDK 開發環境和系統開發中修改 Native 代碼。
根據 Hook 的程序劃分,分為應用程式程序 Hook 和全局 Hook。
- 應用程式程序 Hook 隻能 Hook 目前所在的應用程式程序。
-
應用程式程序是 Zygote 程序 fock 出來的,如果對 Zygote 進行 Hook,就可以實作
Hook 系統所有的應用程式程序,這就是全局 Hook 。
根據 Hook 的實作方式劃分,分為如下兩種。
- 通過反射和代理實作,隻能 Hook 目前的應用程式程序。
- 通過 Hook 架構來實作,比如 Xposed,可以實作全局 Hook ,但是需要 root 。
3 Hook技術原理
3.1 Hook技術實作途徑
- 第一 :找到hook點
- 第二 :找到hook方法
- 第三 :将hook方法放到系統之外執行 ?
3.2 Hook技術之免注冊式跳轉
何實作鈎子函數呢(鈎子函數也稱為hook函數)
1 利用系統内部提供的接口,通過實作該接口,然後注入進系統(特定場景) 不适用
2 動态代理 (所有場景)
3.3 Java層hook如何尋找hook點
使用反射hook java層。
兩點:
-
1 hook點
hook的方法所在的對象一定是靜态,這樣才能還原系統的對象。
- 2 如何插入hook的自己的邏輯