企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
#### **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)