#### **常用的Hook 工具**
* **Xposed 框架**
* 官網地址:http://repo.xposed.info
* GitHub源碼:[Xposed](https://github.com/rovo89/Xposed)
* **CydiaSubstrate 框架**
* **ADBl/DDI 框架**
#### **Xposed 框架**
Xposed框架是一款可以**在不修改APK的情況下影響程序運行(修改系統)的框架服務**,**通過替換/system/bin/app_process 程序控制 zygote 進程,使 app_process 在啟動過程中加載XposedBridge.jar 這個jar包,從而完成對Zygote進程及其創建的Dalvik虛擬機的劫持**。基于Xposed框架可以制作出許多功能強大的模塊,且在功能不沖突的情況下同時運作。此外,Xposed框架中的每一個庫還可以單獨下載使用,如Per App Setting(為每個應用設置單獨的dpi或修改權限)、Cydia、XPrivacy(防止隱私泄露)、BootManager(開啟自啟動程序管理應用),對原生Launcher替換圖標等應用或功能均基于此框架。
Xposed框架是基于一個Android的本地服務應用XposedInstaller與一個提供API的jar文件來完成的。所以,安裝使用Xposed框架我們需要完成以下幾個步驟。
* **安裝本地服務XposedInstaller**
需要安裝XposedInstall.apk本地服務應用,我們能夠在其官網的framework欄目中找到,下載并安裝。地址為:
http://repo.xposed.info/module/de.robv.android.xposed.installer
安裝好后進入XposedInstaller應用程序,會出現需要激活框架的界面,如圖8-5所示。這里我們點擊“安裝/更新”就能完成框架的激活了。部分設備如果不支持直接寫入的話,可以選擇“安裝方式”,修改為在Recovery模式下自動安裝即可。


因為安裝時會需要Root權限,安裝后會啟動Xposed的app_process,所以安裝過程中會存在設備多次重新啟動。
>[info] **注意**:由于國內的部分ROM對Xposed不兼容,如果安裝Xposed不成功的話,強制使用Recovery寫入可能會造成設備反復重啟而無法正常啟動。
* **下載使用API庫**
其 API 庫XposedBridgeApi-.jar(version 是 XposedAPI 的版本號,如我們這里是XposedBridgeApi-54.jar)文件,我們能夠在Xposed的官方支持xda論壇找到,其地址為:
http://forum.xda-developers.com/xposed/xposed-api-changelog-developer-news-t2714067
下載完畢后我們需要將 Xposed Library 復制到 lib目錄(注意是 lib 目錄,不是Android提供的 libs 目錄),然后將這個 jar 包添加到 Build PATH 中,效果如圖所示。

如果直接將jar包放置到了libs目錄下,很可能會產生錯誤`IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation`。估計Xposed作者在其框架內部也引用了BridgeApi,這樣操作可以避免重復引用。
#### **CydiaSubstrate框架**
Cydia Substrate是一個代碼修改平臺。它可以修改任何主進程的代碼,不管是用Java還是C/C++(native代碼)編寫的。而Xposed只支持HOOK app_process中的 Java 函數,因此 Cydiasubstrate 是一款強大而實用的 HOOK工具。
與使用Xposed框架類似,使用Cydiasubstrate框架之前我們需要配置它的使用環境,對于強大的Cydiasubstrate框架使用其實只需要配置兩個地方。安裝Cydiastrate框架Android本地服務,下載使用Cydiastrate提供的API。
* **安裝Cydiastrate框架Android本地服務**
一個就是在Android設備中安裝Cydiasubstrate框架的本地服務應用substrate.apk,我們可以在其官網下載到。
當然,我們安裝substrate后,需要“Link Substrate Files”(連接本地的Substrate服務文件),這一步是需要Root權限的,連接后還需要重啟設備才能夠生效。Substrate服務設置應用如圖所示。

* **下載使用Cydiasubstrate庫**
Cydiasubstrate官方建議以在Android SDK Manager中添加它們插件地址的方式進行更新下載,如圖所示,在用戶自定義網址中添加 http://asdk.cydiasubstrate.com/addon.xml。

通過使用Android SDK Manager工具下載完Cydiasubstrate框架后,其存儲于目錄`${ANDROID_HOME}sdkextrassaurikitcydia_substrate`下。但是,由于Android SDK Manager在國內使用起來存在很多的限制,下載的時候也不是非常穩定,所以還是建議大家直接去官網下載開發庫。
官方下載地址為:http://asdk.cydiasubstrate.com/zips/cydia_substrate-r2.zip。
下載完成后,將得到的所有文件(很多的jar包與so庫),都復制到Android項目下的libs文件夾中,就可以直接使用了。效果如圖所示。

其中的substrate.h頭文件與lib文件夾下的so文件是提供在使用NDK進行原生Hook程序開發中的函數支持庫。
>[info] **注意**:CydiaSubstrate框架對于inline Hook的操作目前還存在一些bug,使用的時候可能會出現崩潰的現象,部分使用了國內定制的ROM的設備在使用CydiaSubstrate框架時會出現設備無法重新啟動或無法Hook的現象。
#### **ADBI/DDI框架**
ADBI(全稱為:Android Dynamic Binary Instrumentation Toolkit)即Android的動態二進制指令工具包,兼容Android中的ARM與Thmub指令,提供動態庫注入與函數Hook(包括inline Hook)。當然,其也提供了Java層的類似功能,即DDI(Dynamic Dalvik Instrumentation Toolkit)框架。
ADBI/DDI框架與Xposed和CydiaSubstrate框架最大的區別是,它是一個命令行工具,使用起來更加的簡單方便。我們可以在Github上找到其源碼,地址為:
ADBI:https://github.com/crmulliner/adbi。
DDI:https://github.com/crmulliner/ddi
#### **參考文章**:
[《Android安全技術揭秘與防范》—第8章8.2節常用的Hook工具](https://yq.aliyun.com/articles/99823?spm=5176.100239.blogcont99909.19.6c23be47do2f4T#)
* **趙四的文章**
[Android中Xposed框架篇---利用Xposed框架實現攔截系統方法](http://blog.csdn.net/jiangwei0910410003/article/details/52822081)
[Android中Xposed框架篇---修改系統位置信息實現自身隱藏功能 ](http://blog.csdn.net/jiangwei0910410003/article/details/52836241)
[Android逆向之旅---Native層的Hook神器Cydia Substrate使用詳解 ](http://blog.csdn.net/jiangwei0910410003/article/details/73699649)
- 前言
- Android系統的體系結構
- Dalvik VM 和 JVM 的比較
- Android 打包應用程序并安裝的過程
- Android ADB工具
- Android應用開發
- Android UI相關知識總結
- Android 中window 、view、 Activity的關系
- Android應用界面
- Android中的drawable和bitmap
- AndroidUI組件adapterView及其子類和Adapter的關系
- Android四大組件
- Android 數據存儲
- SharedPreference
- Android應用的資源
- 數組資源
- 使用Drawable資源
- Material Design
- Android 進程和線程
- 進程
- 線程
- Android Application類的介紹
- 意圖(Intent)
- Intent 和 Intent 過濾器(Google官網介紹)
- Android中關于任務棧的總結
- 任務和返回棧(官網譯文)
- 總結
- Android應用安全現狀與解決方案
- Android 安全開發
- HTTPS
- 安卓 代碼混淆與打包
- 動態注入技術(hook技術)
- 一、什么是hook技術
- 二、常用的Hook 工具
- Xposed源碼剖析——概述
- Xposed源碼剖析——app_process作用詳解
- Xposed源碼剖析——Xposed初始化
- Xposed源碼剖析——hook具體實現
- 無需Root也能Hook?——Depoxsed框架演示
- 三、HookAndroid應用
- 四、Hook原生應用程序
- 五、Hook 檢測/修復
- Android 應用的逆向與加固保護技術
- OpenCV在Android中的開發
- Android高級開發進階
- 高級UI
- UI繪制流程及原理
- Android新布局ConstraintLayout約束布局
- 關鍵幀動畫
- 幀動畫共享元素變換
- Android異步消息處理機制完全解析,帶你從源碼的角度徹底理解
- Android中為什么主線程不會因為Looper.loop()里的死循環卡死?
- 為什么 Android 要采用 Binder 作為 IPC 機制?
- JVM 中一個線程的 Java 棧和寄存器中分別放的是什么?
- Android源碼的Binder權限是如何控制?
- 如何詳解 Activity 的生命周期?
- 為什么Android的Handler采用管道而不使用Binder?
- ThreadLocal,你真的懂了嗎?
- Android屏幕刷新機制