#### **常用的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模式下自动安装即可。
![](https://box.kancloud.cn/9c72942088b73b693f2f2ca176bf90d0_345x272.jpeg)
![](https://box.kancloud.cn/5a541453f0172cf50b49bb3751378f29_334x453.png)
因为安装时会需要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 中,效果如图所示。
![](https://box.kancloud.cn/3b8ede12ae9a230423b3663919735055_308x126.png)
如果直接将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服务设置应用如图所示。
![](https://box.kancloud.cn/c8a7f5815ea55310ccdf123193d8b8ee_319x453.png)
* **下载使用Cydiasubstrate库**
Cydiasubstrate官方建议以在Android SDK Manager中添加它们插件地址的方式进行更新下载,如图所示,在用户自定义网址中添加 http://asdk.cydiasubstrate.com/addon.xml。
![](https://box.kancloud.cn/67064a2d794f71eb6021f1536a0b57d1_574x402.png)
通过使用Android SDK Manager工具下载完Cydiasubstrate框架后,其存储于目录`${ANDROID_HOME}sdkextrassaurikitcydia_substrate`下。但是,由于Android SDK Manager在国内使用起来存在很多的限制,下载的时候也不是非常稳定,所以还是建议大家直接去官网下载开发库。
官方下载地址为:http://asdk.cydiasubstrate.com/zips/cydia_substrate-r2.zip。
下载完成后,将得到的所有文件(很多的jar包与so库),都复制到Android项目下的libs文件夹中,就可以直接使用了。效果如图所示。
![](https://box.kancloud.cn/a90ab25a86906fad36f1b84e5c8b3475_354x243.png)
其中的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屏幕刷新机制