各位坛友好,HoneyBadger是我写的一整套Android逆向分析工具,总共分为2个部分,一个是针对JNI层,一个是针对Java层。
本文主要是JNI层工具的介绍,对Java层感兴趣的请移步 HoneyBadger系列二 Android App全量监控也来了。
水平有限,献丑了。
(新手请直接下翻跳到工具介绍部分,《初衷》部分默认读者均为有实际VM对抗经历者)
最近几年,随着移动安全的不断发展,分析样本是越来越困难了,有效对抗的手段也逐渐的转移到了so层,其中最有效的大概就是vm了,而且越来越多,也越来越强.
这就不得不让人思考:如何高效的对抗VM?以及层出不穷的奇技淫巧?
下面是我从这2个层面去思考的过程。
vm说到本质上,它增加的不是难度,而是工作量,所以从这个角度说,对抗没难度,只要汇编功底扎实都可以,我们关心的应当是高效,那么如何高效呢?
从实战的痛苦经验/经历出发,我认为,要解决高效问题首先要解决的是:对抗vm应该采用什么策略或者思路或者步骤,方案确定后工作量也就能预判了,这大概属于方法论范畴。
我实践的尝试过程是基于PE编辑/重组技术,实现PE的近似还原,如果能够相对快速的实现PE还原,或者大幅度的降低分析成本,那目的就基本达到了,思路在此抛砖引玉。
首先,伪码一,表示保护前的原代码:
然后,伪码二,表示在经过vm后的代码,大约如下(仅为便于描述,其实vm不vm的,具体保护形式不重要,因为即便是简单的几行花指令玩好也能急剧增加分析成本,万变不离其宗):
关键点:假如我们能够将上面的vm伪码(伪码二)处理为,伪码三:
那么,从伪码三转换为伪码一也是一样的原理,从而达到PE文件近似还原的目的也就有了可能。注意这里的近似还原不是说字节码和原始一模一样,而是从分析的角度一样,比如逻辑、可读性、直接丢到IDA后看到的效果等。
所以,我们要考虑的便是如何实现从伪码二到伪码三这个过程。
要实现这个过程,需要具备如下能力:
如果有以上的能力,PE还原就基本没问题了。
所以,我想要实现这个能力。
总有一些牛人或独辟蹊径、或功力深厚,使用一些不常见的做法,或者很巧妙的做法,让人烦不胜烦。
虽然我们可以选择拼体力、拼自己的工具链、拼积累,但这是一件绵绵无绝期的事情,玩的多了就会发现没啥意思,我不再喜欢时间花在这种事情上。
同时,很多时候,我们不关心算法是什么,而是只是想知道干了什么。
所以,我想要 直接 就能知道样本做了什么。
总结下来,我想要的就2点:
为了实现这两点,于是我写了2个东西
是的,我自己完整的实现了一款虚拟机。
虚拟机才是一切的基础核心,调试器只是界面,调试器原本是不想写的,而且其实也是没有必要的。
那么,上述的vm对抗思路可行否?
答案:已验证可行. demo验证很容易。
实战验证较麻烦,曾经20多天分析完的vm样本,3天可丢进IDA进行后续分析,只是仍有很多需要处理的地方,尚未形成工具化,所以暂不公开,待我忙完后如果论坛里没有相关讨论实践,我就来一篇完整实操。
可以直接知道样本做了什么了吗?
可以了,可打印一切日志,想要的,都可以有。
为什么要自己写而不用qemu?unicorn?以及其他?
这个解释起来又容易又不容易,主要看人,一句话描述的话就是:我认为不合适。所以就不解释了。
站在巨人肩膀上的未必是巨人。
为了应对JNI和JAVA层之间交互,从而脱离了虚拟机的监视范围的情况,于是我又处理了下面这个
同上,目的仍然是监视一切,当前的能力包括:
由于时间有限,且一直是自用,所以一直都是ROM版本,懒得弄成独立的bin。
对详情感兴趣的请移步 HoneyBadger系列二 Android App全量监控也来了。
至此,花费数年,尽管仍有很多工作需要处理,但我想干的事情的地基已经完成,首先放出调试器。
在日常的分析中,SO的静态分析往往满足不了需求,从而需要动态调试。
而Android so的动态调试却可能遇到各种坎坷,用起来总是不爽快,却又无能为力,无能为力很重要。
此次的HoneyBadger版本提供了arm调试器功能,以期望解决这个问题。
以及不久的将来上文所述的PE编辑功能最终会可视化的体现到这里。
此arm调试器的原理是:基于HoneyBadger自身的虚拟机引擎,实现本地虚拟执行并实现调试功能。
支持的指令集:
Arm/ArmV7, 需要Arm64的朋友请耐心等待,不会太久了。
想要x86/x64来玩Windows上exe\dll\驱动的朋友需要等待的久一些,可能很久。但是,也会有的,一是因为我要实现自动挖掘漏洞的思路印证是计划的一部分,二是因为我很想换姿势重新玩一下VMP,以及其他高强度保护。
运行环境:
Windows X64 , 需要Mac/Linux版本的朋友请耐心等待,这个倒是没啥,纯属当前有点懒。
HoneyBager调试器目前提供了5个tab,分别是配置、反汇编、日志、断点、模块。
其他没什么需要解释的,都是常见的调试功能
当我写界面之后,才发现这个工作量也很大,区段、字符串、句柄、线程、监视、结构体定义、跳转高亮、DB、条件断点...都要写但还没咋写...
且要处理的细节超多...
原本想抄x64dbg的界面控件,说起来都是泪,现在x64dbg的源码只剩下ini等几个工具类和图标,其他全部删除重写了...
现在工具还有诸多不完善,希望直接用成熟产品的朋友还请耐心等待一段时间再用。
愿意当免费小白鼠的朋友,可以测试,发现问题、有需求、有建议都可以直接反馈给我,我一向很勤奋,应当更新速度不会太慢。
不在乎界面、明确知道自己需要什么的大佬也可以测试,需要的东西在日志文件中应当全都有,不论是遇到问题还是有需求直接反馈给我即可。
还请大家多一些宽容理解,我只是一个普通程序员,无法做到一次性完美,需要时间去完善。
下载地址: https://github.com/honeybadger8mg/honeybadger/releases
第二篇在这里
HoneyBadger系列二 Android App全量监控也来了
谢谢大家。
:start
add
cmp
jmp
bx
:end
:start
add
cmp
jmp
bx
:end
:start
while
(true)
switch(translate()) {
case vm_add:{
break
;
}
case vm_cmp:{
break
;
}
case vm_jmp:{
break
;
}
case vm_bx: {
break
}
}
:end
:start
while
(true)
switch(translate()) {
case vm_add:{
break
;
}
case vm_cmp:{
break
;
}
case vm_jmp:{
break
;
}
case vm_bx: {
break
}
}
:end
:start
vm_add();
vm_cmp();
vm_jmp();
vm_bx();
:end
:start
vm_add();
vm_cmp();
vm_jmp();
vm_bx();
:end
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2023-1-12 09:50
被eightmg编辑
,原因: