#### **Root的危害**
* Android通过用户隔离来保障每个应用的安全
* 每个App都可以申请Root权限
* Root后,你的App就可以被其他App访问
* 内存被篡改
* 行为被监控
* ……
:-: ![](https://box.kancloud.cn/9251473e986a4a6f362f52abf73ad3be_616x180.jpg)
图1
:-: ![被注入后的Chrome进程](https://box.kancloud.cn/27e0ddcca9ddd730b752d4aaf27d284f_883x662.jpg)
图2 被注入后的Chrome进程
#### **App劫持**
**什么是App劫持?**
* App劫持:App的执行流程被重定向
* 通常通过“注入+Hook”来实现
:-: ![APP劫持示例](https://box.kancloud.cn/b7b202f9092d7664da7015a7de9cc433_837x866.jpg)
图3:APP劫持示例
**App劫持过程**
* Step1: 逆向分析App的逻辑
* Step2: 注入模块到App进程中
* Ptrace
* Dlopen
* Step3: Hook
* Java Hook
* Native(so) Hook
:-: ![注入Hook过程](https://box.kancloud.cn/92a7dff9083833b1de8d396fdb131e50_1128x966.jpg)
图4:注入Hook过程
#### **Hook详解**
**具有Hook行为的App**
* 病毒
* 数量较少
* 开发hook模块成本较高
* 需要root
* 安全软件
* 主动防御
#### **Hook类病毒**
Wind Seeker
![](https://box.kancloud.cn/0649af635ffbdbd73d5ddd712260e792_241x429.jpg)
代码示例:
![](https://box.kancloud.cn/b06a77cc8864f0f5a469ee9d4af24832_623x269.jpg)
![](https://box.kancloud.cn/74c84a22367ae8e5a46086f4c903b42a_560x228.jpg)
#### **Hook类型**
* Java Hook
* Static Field Hook:静态成员hook
* Method Hook:函数hook
* Native So Hook
* GOT Hook:全局偏移表hook
* SYM Hook:符号表hook
* Inline Hook:函数内联hook
#### **Java静态成员Hook**
* 修改Java Class的静态成员的值
* 通过反射
~~~
Class<?> cls = Class.ForName(“”)
Field fld = cls.getDeclaredField(“”)
~~~
* 为什么是静态成员static field?
* 反射只能得到Class,不能得到object
**Java static field hook示例**
:-: ![](https://box.kancloud.cn/4149f3d409ae50d5c76c427525560ae8_825x698.jpg)
图5 Java static field hook示例
#### **Java函数hook**
* 修改Java类的某函数指向自定义函数
* Dalvik:Java Method -> Native Method
* ART:Method Inline Hook
**Dalvik:**
* Java函数在内存中指向的是字节码:Method->insns
* 字节码inline hook?复杂!
* 将Java函数转为Native函数
* Method->nativeFunc 指向So中的函数
:-: ![Java函数hook之Dalvik](https://box.kancloud.cn/2f0a987b50cbb700449c8d0d07e083af_305x114.jpg)
图6 Java函数hook之Dalvik
#### **So GOT Hook**
* 修改App加载的so中Got表里函数的绝对地址
* GOT
* Global Offset Table:全局偏移表
* 存储了依赖库so的函数的绝对地址
* PLT
* Procedure Linkage Table:过程链接表
* 将当前so内对依赖库函数的相对调用转移到Got中的绝对地址
**正常执行流程**
![](https://box.kancloud.cn/4d849559709c5a05a5f253ae5cdf9270_871x248.jpg)
**Hook后执行流程**
![](https://box.kancloud.cn/1966201f3b2b682ae9a2312730594c2a_931x392.jpg)
#### **So SYM Hook**
* 修改App加载的So的符号表里的函数地址
* 缺点:
* 必须在so加载前hook
**So SYM hook流程**
![](https://box.kancloud.cn/1a76f82e4dbd278e4464012dcccc0526_918x765.jpg)
#### **So Inline Hook**
* 修改App加载的So的函数里的代码
* 跳转有范围限制,需要跳板
* 需要兼容arm和thumb指令
* 优点:覆盖面广
* 缺点:难度高,不稳定
**So inline Hook流程**
![](https://box.kancloud.cn/501f006bb96d7e9fc0c2beb94274d97a_1103x899.jpg)
#### **Hook Zygote**
* 全局hook的方法:
* Hook当前已运行的所有App进程,监听新进程
* Hook Zygote进程
* App进程是有Zygote孵化出来的
* 如果Zygote被注入/hook,其他App都将被注入/hook
**Hook前**
:-: ![](https://box.kancloud.cn/e084b31075719453661f0f800551ccbc_823x537.jpg)
图7 HookZygote前
**Hook后**
:-: ![](https://box.kancloud.cn/db4cd58c7458a4d57cb27304870c5de1_841x517.jpg)
图8 HookZygote前
#### **流行的Hook框架**
* Xposed
* http://repo.xposed.info/
* Cydia Substrate
* http://www.cydiasubstrate.com/
* ADBI/DDI
* https://github.com/crmulliner/adbi
* https://github.com/crmulliner/ddi
* frida Hook框架
* https://www.frida.re/
Frida是一款基于python + javascript 的hook框架,通杀android\ios\linux\win\osx等各平台。由于是基于脚本的交互,因此相比xposed和substrace cydia更加便捷
**流行的Hook框架:Xposed**
* 目前使用最广的Android平台开源hook框架
* 替换App_Process
* Java函数转为Native函数
* 在被hook函数执行时,调用BeforeHook/AfterHook接口
* 添加/删除hook需要重启zygote
**流行的Hook框架:Cydia Substrate**
* 兼容iOS和Android
* 在iOS平台使用广泛
* 需要重启Zygote
**流行的Hook框架对比**
![](https://box.kancloud.cn/df19e3b53c72f40d6afc8ed44d91e0d1_964x596.jpg)
### **App劫持检测/修复**
#### **Hook检测/修复:Java Hook**
* 静态成员hook
* 检测:根据变量的class判定是否属于当前App的classes.dex
* 修复:无法修复:无法获得原始值
:-: ![Hook检测或修复:Java静态成员Hook](https://box.kancloud.cn/0e5888bd52d6ae1478741f8a8de10dd7_889x389.jpg)
图9 Hook检测或修复:Java静态成员Hook
* 函数hook
* Dalvik:Java->Native
* 检测:
* 根据nativFunc找到对应的BridgeFunction,判定其是否在libdvm.so内存区间;
* 判断insns指向的so内存区间
* 修复:无法修复,Native->Java不可逆
:-: ![](https://box.kancloud.cn/06d46e48243f43f0696b981e4303a8e8_1223x347.jpg)
图10 Hook检测/修复:Java 函数Hook
#### **注入修复**
* 为什么要修复注入?
* 有可能只注入、不hook:监听线程
* Hook:摘除钩子
* 修复注入的方法
* munmap
* 必须先将hook修复
* 不稳定,容易crash
#### **修复Zygote**
* 如何保证Zygote进程不被hook?
* Init启动Zygote进程
* 在hook之前就将Zygote保护起来
* 怎么保证在其他App之前启动?
* 学习Xposed,替换app_process?
* 需要重启
* 不够稳定,兼容性
* 对所有App有效,可配性不高
#### **App劫持修复:结论**
* Hook摘除不稳定,容易crash
* 三个“基本”结论:
* Hook基本无法修复
* 注入基本无法剔除
* Zygote基本无法保护
#### **离我的App远点!——创建可信App运行环境**
**创建App可信运行环境**
* 创建可信的Zygote进程
* 保护可信的Zygote
* 让App从干净的Zygote进程fork
**一、创建可信Zygote进程**
* Step1:启动一个新的Zygote进程
* 编译自定义app_process
* 无需重启
:-: ![](https://box.kancloud.cn/b4a404fe2c9449871f902b81e4cd7a8b_1284x389.jpg)
图11 启动一个新的Zygote进程
**二、保护可信Zygote进程**
* Step2: 保护可信Zygote
* 反调试/反注入
* Ptrace_me
* 双进程保护
* 其他保护
:-: ![](https://box.kancloud.cn/73a37d6e506e4689639d1d54a073f8e2_1679x389.jpg)
图12 保护可信Zygote进程
**三、控制可信Zygote出口**
* 通过可信Zygote fork自定义App
* 重定向ActivityManagerService发送的socket client
* 控制进程
* 需要保护的App:发送给可信Zygote
* 无需保护的App:发送给旧Zygote
:-: ![](https://box.kancloud.cn/7118556f0f00e87ee320d027a6b6de7c_1679x389.jpg)
图13 控制可信Zygote出口
示例:整体流程
![](https://box.kancloud.cn/d5861483e6c0ad63fea2be3ae0374b24_1553x762.jpg)
#### **参考文章**
[插件化知识详细分解及原理 之代理,hook,反射](http://blog.csdn.net/yulong0809/article/details/56842027)
[知识总结之 插件化学习 Hook系统方法分析](http://blog.csdn.net/cankingapp/article/details/73292035)
[Android插件化原理解析——Hook机制之动态代理](https://www.jianshu.com/p/b30ea19c444b)
[在Android中实现Hook机制的实验](http://blog.csdn.net/zoudifei/article/details/49871065)
[浅谈android hook技术](https://sec.xiaomi.com/article/23)
[Android安全技术揭秘与防范](http://www.java1234.com/a/javabook/andriod/2017/0920/8971.html)
[Android应用劫持攻与防](http://www.java1234.com/a/javabook/andriod/2017/0908/8865.html)
[《Android安全技术揭秘与防范》目录—导读 ](https://yq.aliyun.com/articles/99909?spm=5176.11065265.1996646101.searchclickresult.aa2a61pRyf47)
- 前言
- 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屏幕刷新机制