前言
各位坛友好,HoneyBadger是我写的一整套Android逆向分析工具,总共分为2个部分,一个是针对JNI层,一个是针对Java层。
本文主要是JNI层工具的介绍,对Java层感兴趣的请移步 。
水平有限,献丑了。
初衷
(新手请直接下翻跳到工具介绍部分,《初衷》部分默认读者均为有实际VM对抗经历者)
最近几年,随着移动安全的不断发展,分析样本是越来越困难了,有效对抗的手段也逐渐的转移到了so层,其中最有效的大概就是vm了,而且越来越多,也越来越强.
这就不得不让人思考:如何高效的对抗VM?以及层出不穷的奇技淫巧?
下面是我从这2个层面去思考的过程。
一、高效对抗vm.
vm说到本质上,它增加的不是难度,而是工作量,所以从这个角度说,对抗没难度,只要汇编功底扎实都可以,我们关心的应当是高效,那么如何高效呢?
从实战的痛苦经验/经历出发,我认为,要解决高效问题首先要解决的是:对抗vm应该采用什么策略或者思路或者步骤,方案确定后工作量也就能预判了,这大概属于方法论范畴。
我实践的尝试过程是基于PE编辑/重组技术,实现PE的近似还原,如果能够相对快速的实现PE还原,或者大幅度的降低分析成本,那目的就基本达到了,思路在此抛砖引玉。
首先,伪码一,表示保护前的原代码:
1
2
3
4
5
6
|
:start
add
cmp
jmp
bx
:end
|
然后,伪码二,表示在经过vm后的代码,大约如下(仅为便于描述,其实vm不vm的,具体保护形式不重要,因为即便是简单的几行花指令玩好也能急剧增加分析成本,万变不离其宗):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
:start
while
(true)
switch(translate()) {
case vm_add:{
break
;
}
case vm_cmp:{
break
;
}
case vm_jmp:{
break
;
}
case vm_bx: {
break
}
}
:end
|
关键点:假如我们能够将上面的vm伪码(伪码二)处理为,伪码三:
1
2
3
4
5
6
|
:start
vm_add();
vm_cmp();
vm_jmp();
vm_bx();
:end
|
那么,从伪码三转换为伪码一也是一样的原理,从而达到PE文件近似还原的目的也就有了可能。注意这里的近似还原不是说字节码和原始一模一样,而是从分析的角度一样,比如逻辑、可读性、直接丢到IDA后看到的效果等。
所以,我们要考虑的便是如何实现从伪码二到伪码三这个过程。
要实现这个过程,需要具备如下能力:
- 能够分析出一个比较短(我目前感觉20行左右就差不多足够了)的代码块的真实用途。
- 把PE文件视作CPP,像内联汇编一样自由的编辑汇编,当能任意编辑的时候,就可以做到如下,包括但不限于:
- 简化vm的分析,vm_handler中肯定充斥着各种猥琐恶心代码,所以我们首先做瘦身优化工作:大篇幅的汇编看起来费劲,一遍一遍的重复瘦身优化动作之后剩余的汇编还费劲就见鬼了。而这个简化的过程是可积累的,比如记录为sig。
- 删除死代码块,这种被填充的垃圾看着就烦
- 修改猥琐代码为正常代码,比如IDA无法正常分析,那就全部删掉,然后一点点恢复,直到定位到引起IDA工作异常的代码,然后改掉。
- 将vm代码剖离、简化,乃至等价替换掉。
- 生成与未保护前的代码相同逻辑或者布局的新代码
- 直接打补丁
- 能够方便的测试,包括但不限于
- 环境冻结:上下文、时间戳、随机数、封包.....即重放
- 反复测试
- 代码块测试
- 快照测试
- 能够方便的生成PE
- 方便的跟踪功能,包括但不限于:
- 全部执行的汇编
- 寄存器
- 内存变化
- 函数
- etc ....
如果有以上的能力,PE还原就基本没问题了。
所以,我想要实现这个能力。
层出不穷的奇技淫巧
总有一些牛人或独辟蹊径、或功力深厚,使用一些不常见的做法,或者很巧妙的做法,让人烦不胜烦。
虽然我们可以选择拼体力、拼自己的工具链、拼积累,但这是一件绵绵无绝期的事情,玩的多了就会发现没啥意思,我不再喜欢时间花在这种事情上。
同时,很多时候,我们不关心算法是什么,而是只是想知道干了什么。
所以,我想要 直接 就能知道样本做了什么。
思考结论
总结下来,我想要的就2点:
为了实现这两点,于是我写了2个东西
- 完整的实现了一套虚拟机
是的,我自己完整的实现了一款虚拟机。
虚拟机才是一切的基础核心,调试器只是界面,调试器原本是不想写的,而且其实也是没有必要的。
那么,上述的vm对抗思路可行否?
答案:已验证可行. demo验证很容易。
实战验证较麻烦,曾经20多天分析完的vm样本,3天可丢进IDA进行后续分析,只是仍有很多需要处理的地方,尚未形成工具化,所以暂不公开,待我忙完后如果论坛里没有相关讨论实践,我就来一篇完整实操。
可以直接知道样本做了什么了吗?
可以了,可打印一切日志,想要的,都可以有。
为什么要自己写而不用qemu?unicorn?以及其他?
这个解释起来又容易又不容易,主要看人,一句话描述的话就是:我认为不合适。所以就不解释了。
站在巨人肩膀上的未必是巨人。
为了应对JNI和JAVA层之间交互,从而脱离了虚拟机的监视范围的情况,于是我又处理了下面这个
- APP的全量监控
同上,目的仍然是监视一切,当前的能力包括:
- 任意函数的参数打印、修改
- 任意函数的返回值打印、修改
- 任意函数替换
- 带函数签名的堆栈打印
- 成员变量的读、写、拦截
- 全量拦截时几乎不影响速度
- 不需要写代码,点点鼠标就可拦截java层的一切
- etc ...
由于时间有限,且一直是自用,所以一直都是ROM版本,懒得弄成独立的bin。
对详情感兴趣的请移步 。
至此,花费数年,尽管仍有很多工作需要处理,但我想干的事情的地基已经完成,首先放出调试器。
简介
在日常的分析中,SO的静态分析往往满足不了需求,从而需要动态调试。
而Android so的动态调试却可能遇到各种坎坷,用起来总是不爽快,却又无能为力,无能为力很重要。
此次的HoneyBadger版本提供了arm调试器功能,以期望解决这个问题。
以及不久的将来上文所述的PE编辑功能最终会可视化的体现到这里。
此arm调试器的原理是:基于HoneyBadger自身的虚拟机引擎,实现本地虚拟执行并实现调试功能。
支持的指令集:
Arm/ArmV7, 需要Arm64的朋友请耐心等待,不会太久了。
想要x86/x64来玩Windows上exe\dll\驱动的朋友需要等待的久一些,可能很久。但是,也会有的,一是因为我要实现自动挖掘漏洞的思路印证是计划的一部分,二是因为我很想换姿势重新玩一下VMP,以及其他高强度保护。
运行环境:
Windows X64 , 需要Mac/Linux版本的朋友请耐心等待,这个倒是没啥,纯属当前有点懒。
功能介绍
HoneyBager调试器目前提供了5个tab,分别是配置、反汇编、日志、断点、模块。
设置页面
选项解释
- 目标APK路径: 要分析的应用apk的路径。有些在so中读取apk资源、hash什么的,所以直接APK原始文件设置进来。
- 动态库目录: 解压出来的目标apk的lib目录,解压出来是为了防止同时使用IDA等工具时文件不一致。
- 主动态库:要分析的so
- 主插件路径:用户自行编写的调试插件,比如我们想调试主动态库中的函数Java_com_xx_xx,那么在插件中直接按HoneyBager的API文档写调用代码即可。
- 启动调试按钮: 在所有的设置完成后,点击该按钮就会开始执行调试运行。
- 虚拟环境模式:
- 清静模式: 在算法分析时,希望环境干净点,以让分析少一些干扰因素。比如有样本动态执行代码,即mmap->mprotect->shellcode类似流程,让分析麻烦,清净模式就可以固定下来,像普通代码一样正常分析。
- 噪音模式: 真实的手机运行环境有很多随机因素,比如曾经发现有样本用句柄、指针、基址当做盐,我们不评价这种做法的优劣,只是说从对抗角度类似情况用清静模式可以先专心把算法分析完,然后用噪音模式验证是否有盐没发现,从而确保还原正确。
- 自动加载主动态库依赖的库: 有些时候我们的目标函数依赖了其他动态库,这个时候能够自动加载就方便了。
- 启动调试时自动断点位置: 关心就选中,不关心就不选中,让程序自动处理,然后只关心插件咋执行函数就完了。
- 触发时自动断点: 就是一些常用的断点,只是为了方便。
反汇编页面
功能解释
- 插件菜单
- 该菜单下的子菜单全部由插件自定义,比如想测试3个不同函数,就设置3个功能项
- 其他想要的功能也可以自行在这里添加
其他没什么需要解释的,都是常见的调试功能
断点页面
模块页面
结束
当我写界面之后,才发现这个工作量也很大,区段、字符串、句柄、线程、监视、结构体定义、跳转高亮、DB、条件断点...都要写但还没咋写...
且要处理的细节超多...
原本想抄x64dbg的界面控件,说起来都是泪,现在x64dbg的源码只剩下ini等几个工具类和图标,其他全部删除重写了...
现在工具还有诸多不完善,希望直接用成熟产品的朋友还请耐心等待一段时间再用。
愿意当免费小白鼠的朋友,可以测试,发现问题、有需求、有建议都可以直接反馈给我,我一向很勤奋,应当更新速度不会太慢。
不在乎界面、明确知道自己需要什么的大佬也可以测试,需要的东西在日志文件中应当全都有,不论是遇到问题还是有需求直接反馈给我即可。
还请大家多一些宽容理解,我只是一个普通程序员,无法做到一次性完美,需要时间去完善。
下载地址: https://github.com/honeybadger8mg/honeybadger/releases
第二篇在这里
谢谢大家。