首页
社区
课程
招聘
[原创]HoneyBadger系列二 Android App全量监控也来了
2023-1-11 04:00 20790

[原创]HoneyBadger系列二 Android App全量监控也来了

2023-1-11 04:00
20790

前言

书接上文,HoneyBadger是我写的一整套Android逆向分析工具,这是第二篇,没有看过第一篇的请移步 HoneyBadger系列一 开篇,虚拟机调试器来了

 

本文主要是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终于出来了。

 

我终于还是抗住了压力撑到了现在没有半途而废,否则今后想起这段过往的失落恐怕会很难过。

 

谢谢大家,两篇介绍文章结束,后续将会是实战教程文章。


[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

最后于 2023-1-11 04:05 被eightmg编辑 ,原因:
收藏
点赞6
打赏
分享
最新回复 (18)
雪    币: 343
活跃值: (1056)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
eightmg 2023-1-11 04:03
2
1

删除了

最后于 2023-1-27 15:56 被eightmg编辑 ,原因: 删除
雪    币: 62
活跃值: (533)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
万里星河 2023-1-12 00:28
3
1
eightmg 占沙发,做个广告 细心的朋友可能注意到了,工具放出的很仓促。 是的,几年前我高估了自己的实力,同时远远低估了这套工具的难度、工作量、以及所需要的知识储备,尽管现在基础工作完成了,但身心俱疲,身心俱疲, ...

大佬你好 拜读至此 我有些许疑问 若有时间答复 我将不甚感激
首先 关于虚拟机调试器 这个算是模拟执行so 并在此基础上动态调试对吧 那么如果so中存在jni 也就是与java层交互的代码 又该如何呢?需要像unidbg一样繁琐地补环境吗?
其次 关于Android App全量监控 这个是需要刷机才能用对吧? 全量监控会不会导致输出的信息太多太杂从而也是难以定位呢?其次我对带参数的java堆栈打印 和 对属性的读写监控十分感兴趣 能详细说说实现原理吗?众所周知 安卓自带的java层堆栈打印是不带参数的 这个只能通过魔改rom来实现吗?是否有更通用的方式通过xp或者frida直接实现?
再者 rom需要通过怎样的途径才能有偿获取呢 支持试用吗?

最后 能理解大佬不放出rom的苦衷 但也希望可以加一下片段性的原理性代码说明使帖子更有深度些 同时期待大佬的下篇佳作

最后于 2023-1-12 00:41 被万里星河编辑 ,原因:
雪    币: 343
活跃值: (1056)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
eightmg 2023-1-12 03:17
4
0

你问到关键点上了,赞!  我依次回复


那么如果so中存在jni 也就是与java层交互的代码 又该如何呢?需要像unidbg一样繁琐地补环境吗?

答案:不需要,我不知道unidbg需要补什么,我没用过。


后续会发插件开发教程,还在写,这里我先简单说下处理逻辑。


插件是C++编写的dll,一切都是模板,拷贝下就行。

模拟Java类也是,Java模板类中需要改的就几个点,准确的说就是改下类名、函数签名、成员签名的字符串,然后需要模拟函数返回值的时候返回下对应的实例指针就行了,我实操大部分都是1分钟内结束。

系统类我大部分都集成了,不需要你们再处理,直接用。


然后还有一些文件啊什么的之类的环境,通常也不需要你们处理,我都有内置。当然,也有接口可以自行接管。


也有可能有没支持的文件啊类啊,联系我就行了,这种东西我这里通常可以支持的很快。


关于Android App全量监控 这个是需要刷机才能用对吧?

对,需要刷机


全量监控会不会导致输出的信息太多太杂从而也是难以定位呢?

不会

真正实战时是不需要全面监控的,只需要监控部分,只要你不是强迫症就是要较劲非要看全部,那就可以直接点点鼠标批量添加白名单,只留下你想看的。

比如系统类,市面上所有APP都加起来,关键的类也还是就那么几十个,其他都是可以直接白名单,就几十个类,信息再多又能多到哪里去呢?

比如APP的类,一开始大可以直接全部白名单,然后再把关心的类点点鼠标设置成拦截模式。

比如你看我文中的截图,就那么几个日志,白名单的类十几万个。


上面说的是监视模式打开的情况下,如果是关闭监视模式,那你设置的拦截啥就只会拦截啥


带参数的java堆栈打印 和 对属性的读写监控十分感兴趣 能详细说说实现原理吗

这个暂时不行

是否有更通用的方式通过xp或者frida直接实现?

我烦js呀,frida不咋用,不好说能不能实现。话说我这个ROM本身就有一部分原因是不想用frida,我要方便一些。

Xposed的话,先不说能不能做到,只说9之后它遗留的其他麻烦会让人很痛苦。


rom需要通过怎样的途径才能有偿获取呢 支持试用吗?

 这套工具应当能够对公司的安全部门的同仁工作帮助比较大,无视对抗,提升效率。     试用功能在写。


最后于 2023-1-12 09:56 被eightmg编辑 ,原因:
雪    币: 62
活跃值: (533)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
万里星河 2023-1-13 11:44
5
0
eightmg 你问到关键点上了,赞!  我依次回复那么如果so中存在jni 也就是与java层交互的代码 又该如何呢?需要像unidbg一样繁琐地补环境吗?答案 ...
令人期待
雪    币: 4875
活跃值: (6139)
能力值: ( LV12,RANK:200 )
在线值:
发帖
回帖
粉丝
飞翔的猫咪 4 2023-2-23 19:14
6
0
给楼主的毅力和想法点赞,最近有些高维度的工具都是基于qemu的
雪    币: 4875
活跃值: (6139)
能力值: ( LV12,RANK:200 )
在线值:
发帖
回帖
粉丝
飞翔的猫咪 4 2023-2-23 19:18
7
0
"关键函数定位太麻烦
当前定位的做法是通过各种线索,先找到一个点,然后借助于frida、Xposed(或衍生)等工具不断的hook、观察日志、阅读代码...循环。"
确实,这个太费时间,很容易就陷入到app自身代码的维度,如果从更高维度监控然后运行app等待结果吐出来就好了。

雪    币: 324
活跃值: (1134)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
guijian 2023-2-28 18:42
8
0
飞翔的猫咪 "关键函数定位太麻烦 当前定位的做法是通过各种线索,先找到一个点,然后借助于frida、Xposed(或衍生)等工具不断的hook、观察日志、阅读代码...循环。" 确实,这个 ...
哪些基于qemu,模拟执行的?
雪    币: 20
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
神行者 2023-2-28 23:07
9
0
删掉了?
雪    币: 27
活跃值: (221)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
昕雪 2023-4-7 20:34
10
0
在哪里啊?
雪    币: 3654
活跃值: (3828)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
caolinkai 2023-5-19 23:56
11
0
没了
雪    币: 720
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
jackyAndroid 2023-7-18 19:30
12
0
期待rom啊
雪    币: 130
活跃值: (145)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
小海CC 2023-7-19 15:29
13
0
飞翔的猫咪 "关键函数定位太麻烦 当前定位的做法是通过各种线索,先找到一个点,然后借助于frida、Xposed(或衍生)等工具不断的hook、观察日志、阅读代码...循环。" 确实,这个 ...
感觉也还是在各入口打桩
雪    币: 720
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
jackyAndroid 2023-8-11 18:00
14
0
这个是啥原理啊?
雪    币: 574
活跃值: (257)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
miyuecao 2023-8-14 16:52
15
0
大佬牛叉,膜拜下
雪    币: 2
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_omoiqpnh 2023-8-29 14:40
16
0
大神,怎么联系合作?
雪    币: 62
活跃值: (533)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
万里星河 2023-11-10 21:55
17
0
eightmg 你问到关键点上了,赞!  我依次回复那么如果so中存在jni 也就是与java层交互的代码 又该如何呢?需要像unidbg一样繁琐地补环境吗?答案 ...
前段时间闲着没事 通过结合LSP+Dobby 实现了java层接口的动态拦截和带参数的堆栈打印 但对于如何用LSP实现对java字段的读写监控还是没有十分明确的思路 是需要hook一下ArtField的某些method吗 不知大佬可否指点一下思路 不甚感激
雪    币: 62
活跃值: (533)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
万里星河 2023-11-11 09:51
18
0
万里星河 前段时间闲着没事 通过结合LSP+Dobby 实现了java层接口的动态拦截和带参数的堆栈打印 但对于如何用LSP实现对java字段的读写监控还是没有十分明确的思路 是需要hook一下ArtField ...
翻了一下源码 原来art底层自带了字段读写的监听机制 复行数十步豁然开朗
雪    币: 19270
活跃值: (28900)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
秋狝 2023-11-11 21:58
19
1
感谢分享
游客
登录 | 注册 方可回帖
返回