前言
书接上文,HoneyBadger是我写的一整套Android逆向分析工具,这是第二篇,没有看过第一篇的请移步
本文主要是Java层工具的介绍,水平有限,献丑。
初衷
Android Java层的逆向,笼统的分的话可以划分为2个主要过程:
- 单个函数的算法还原
这个没什么,可能最复杂也就是加了料的上万行smali需要人肉看(我没碰上过上万的,最多的时候也就几千行),而实际情况是上点手段,Jeb、jadx等工具也就能正常看了
- 踩点、定位、流程的分析
这个大概占用了整个分析还原过程的大部分时间,麻烦也在于这里。
上文已知so层保护已不在乎,所以此处只需要讨论纯Java层了。
我主要想解决的问题就2个
- 关键函数定位太麻烦
当前定位的做法是通过各种线索,先找到一个点,然后借助于frida、Xposed(或衍生)等工具不断的hook、观察日志、阅读代码...循环。
这个说起来简单,做起来很烦。
比如遇到了大量的抽象函数或者类或者接口或者名字被混淆成I1II0o0O这种让人眼花。
比如有一些事情我用frida做不到,也许是我js太差,也许是我frida学的太差,而且我不喜欢JavaScript,反正我是不想学了。
frida当然是好工具,我还记得当年有位广州的大佬给我推荐frida时那惊艳的感觉。
Android9之后的Xposed(或衍生)问题太多了,源码看过,我能力有限维护不了。
不管是什么辅助工具,都要不停的写代码,不停的写代码,烦。
- 无死角、无遗漏
我习惯算法分析时弄清楚每一个变量的前世今生,如果分析不清楚就会很难受。
于是,我的需求就产生了,我想做到下面几件事:
- 我不想学js,不想学frida
- 换句话说,学习知识没有问题,但我不想持续的学习工具本身。比如Xposed(或衍生)就很好,随便几篇教程看完就结束了。
- 如无必要,我不想写代码
- 在APP的生命周期内,想拦截什么就拦截什么,想在哪拦就在哪拦。
- 能够像Xposed一样简便的扩展功能
- 记录一切我想要的信息
于是,APP全量监控也来了。
简介
APP全量监控,顾名思义,就是要监视APP的一切动作,并尽可能的简化人的参与部分,以提高逆向的效率。
她的本质是ROM,基于LineageOS,其原理可以简单的按ROM魔改来理解,虽然有区别,但区别是什么并不重要,重要的是能做到什么。
支持的设备:
LineageOS支持的手机都可以,其他AOSP支持的设备也可以。
她当前的能力包括:
- 任何时机,一切Java函数参数和结果的打印、修改
- 任何时机,一切Java函数替换
- 任何时机,一切Java成员变量读、写,以及拦截
- 部分系统库(系统so)函数的拦截修改
- 拦截配置化
- 所有的日志(APP自身的、拦截的)均上传至HoneyBadger客户端
- 仅仅是踩点、分析、定位的话,不需要写代码,只要点点鼠标就可以
- 插件化
个性化的需求都在插件中实现,只需要重启APP即可生效
- 即使全量拦截,对APP或者系统的速度也基本无影响
她的工作逻辑是,首先有个监视模式开关
- 监视模式开
此时会监视所有的类、函数等一切行为。
当击中拦截策略中的规则时,就按规则处理。
当没有击中规则时,便上传未知,然后由用户自行判断是放行还是拦截。
- 监视模式关
此时只监视策略中的规则,其他一律放行,且不上报
当前全量监控包含2个tab,一个是策略和配置,一个是行为日志记录
策略及配置
上图选项解释
- 左侧的表为所有的策略配置
- 端口: HoneyBadger本地创建了个微型服务器,用于接收由设备传上来的日志和数据,以及其他交互
- 插件工程: 当用户需要个性化的需求的时候,按文档开发插件即可,这里是插件的工程目录,目前策略也是放在这个目录的raw下
- 插件路径:插件的编译输出路径
- 推送至ROM:将插件一键推送到设备
- 清空策略
- 新增策略
- 预检策略:检查是否有误等
- 应用策略至工程:策略变了,保存策略到插件对应目录
- 从手机拉取策略:查看当前手机上的策略配置
- 策略部署到手机:有些时候插件代码没有变化,只是策略变了,那么直接推送策略到手机即可,不需要重新编译插件
添加到拦截: 上图的类是放行类,也就是不关心的类,当希望拦截该类时就添加到拦截
上图选项解释
添加到白名单: 此处的这个类是要拦截状态,不想拦了,就添加到白名单
上图选项解释
- 放行函数:当前函数不拦截了
其他不需要解释
上图选项解释
都不需要解释
上图选项解释
全量拦截的范围是指定的APP进程及其子进程,需要新增或者删除APP时直接在此处添加,然后推送到设备即可
上图选项解释
图为上传的日志展示。
- 类->白名单
在发现未知的类的时候,如果是不想关心的类,直接添加到白名单
- 函数->白名单
图中选中的行是打印函数参数的日志,当发现该函数不想关心时,添加到白名单,添加到白名单后,将不会拦截
- 函数->拦截
当函数没有设置规则时,拦截类型会标注为未知函数,如果关心就添加到拦截,如果不关心就添加到白名单。图中的拦截是个bug,懒得更新图了,正常应当是灰色的。
- 详细内容部分
- 参数是依次打印的,并用数字标明是第几个参数的值
- 堆栈可以看到所有函数的签名,这样就可以直接定位到具体函数了,混淆?接口?不在乎了
上图选项解释
上图选项解释
- 成员读的展示
- 可以打印出该成员当前值
- 是谁在读取,对应的堆栈。这样就可以直接定位关键函数。
- 成员写的展示
- 这个就不放图了,和读差不多,只不过打印出来的是设置的值
插件开发
就是普通的apk开发,继承一个interface,依赖一个jar,就正常开发就可以了,没啥说的,开发一个插件没几行代码。
结束
考虑到本ROM的危险敏感性,目前不对个人用户开放,如果有正规企业、机构需要可以与我联系。
HoneyBadger的调试器部分论难度论工作量都比这ROM高很多,但之所以可以直接放出,是因为是GUI版,而不是SDK版,"业务"功能做不了,危险系数低。
鱼龙混杂,还请大家理解我的有所保留。
至此,耗时数年,付出极惨重代价后,Android全面监视、逆向体系的基础工作已完成,Demo终于出来了。
我终于还是抗住了压力撑到了现在没有半途而废,否则今后想起这段过往的失落恐怕会很难过。
谢谢大家,两篇介绍文章结束,后续将会是实战教程文章。
更多【HoneyBadger系列二 Android App全量监控也来了】相关视频教程:www.yxfzedu.com