首页
社区
课程
招聘
[原创]HoneyBadger系列一 开篇,虚拟机调试器来了
2023-1-11 02:57 18619

[原创]HoneyBadger系列一 开篇,虚拟机调试器来了

2023-1-11 02:57
18619

前言

各位坛友好,HoneyBadger是我写的一整套Android逆向分析工具,总共分为2个部分,一个是针对JNI层,一个是针对Java层。
本文主要是JNI层工具的介绍,对Java层感兴趣的请移步 HoneyBadger系列二 Android App全量监控也来了
水平有限,献丑了。

初衷

(新手请直接下翻跳到工具介绍部分,《初衷》部分默认读者均为有实际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。
    对详情感兴趣的请移步 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,分别是配置、反汇编、日志、断点、模块。

设置页面

选项解释
  • 目标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

 

第二篇在这里
HoneyBadger系列二 Android App全量监控也来了

 

谢谢大家。


[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

最后于 2023-1-12 09:50 被eightmg编辑 ,原因:
收藏
点赞14
打赏
分享
最新回复 (25)
雪    币: 3147
活跃值: (2544)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
黑屏 2023-1-11 08:07
2
0
提示找不到libcrypto.dll
雪    币: 233
活跃值: (1346)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
安卓qq 2023-1-11 09:16
3
0
不错,看起来很牛逼...................
加油,大佬
雪    币: 233
活跃值: (1346)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
安卓qq 2023-1-11 09:16
4
0
希望能坚持做下去,别烂尾
雪    币: 343
活跃值: (1056)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
eightmg 2023-1-11 11:20
5
0
黑屏 提示找不到libcrypto.dll
什么操作系统?具体运行环境发一下,我测试下
雪    币: 19
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
jilay 2023-1-11 11:49
6
0
eightmg 什么操作系统?具体运行环境发一下,我测试下

windows 10 系统,启动exe 提示找不到libcrypto-1_1-x64.dll

最后于 2023-1-11 11:50 被jilay编辑 ,原因:
雪    币: 4116
活跃值: (1019)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
Papaya. 2023-1-11 14:21
7
0
jilay eightmg 什么操作系统?具体运行环境发一下,我测试下 windows 10 系统,启动exe 提示找不 ...
win11也有这个提示
雪    币: 4116
活跃值: (1019)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
Papaya. 2023-1-11 14:23
8
0

系统win11 22H2


最后于 2023-1-11 14:25 被Papaya.编辑 ,原因:
雪    币: 229
活跃值: (213252)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
shinratensei 1 2023-1-11 15:03
9
0
优秀
雪    币: 343
活跃值: (1056)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
eightmg 2023-1-11 16:08
10
0
黑屏 提示找不到libcrypto.dll
已修复,请重新下载
雪    币: 343
活跃值: (1056)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
eightmg 2023-1-11 16:08
11
0
jilay eightmg 什么操作系统?具体运行环境发一下,我测试下 windows 10 系统,启动exe 提示找不 ...
已修复,请重新下载
雪    币: 343
活跃值: (1056)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
eightmg 2023-1-11 16:08
12
0
Papaya. win11也有这个提示
已修复,请重新下载
雪    币: 1148
活跃值: (3359)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
王麻子本人 2023-1-11 20:24
13
0
eightmg 已修复,请重新下载


最后于 2023-1-11 20:26 被王麻子本人编辑 ,原因:
雪    币: 52
活跃值: (501)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
万里星河 2023-1-11 23:26
14
0
支持一下大佬
雪    币: 0
活跃值: (69)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
骄傲的兔子 2023-1-12 01:48
15
0
火钳刘明
雪    币: 180
活跃值: (112)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
七个小矮人 2023-2-1 14:21
16
0
主插件 是啥?
雪    币: 52
活跃值: (3274)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
DirtyAngle 2023-2-1 17:46
17
0
牛逼
雪    币: 685
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mickelfeng 2023-2-2 19:03
18
0
牛逼,下载试试
雪    币: 309
活跃值: (1119)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
guijian 2023-2-21 10:01
19
0
赞一个!
雪    币: 51
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
钱的搬运工 2023-5-7 21:48
20
1

无法定位程序输入点 CreateEventW于动态链接库

api ms win core synch 1 2 0.dll上

雪    币: 19103
活跃值: (28707)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
秋狝 2023-5-8 09:19
21
0
好东东
雪    币: 3624
活跃值: (3783)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
caolinkai 2023-5-19 23:41
22
0
牛逼
雪    币: 263
活跃值: (379)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
fzyspark 2023-8-14 18:39
23
0
雪    币: 3048
活跃值: (3686)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
青眼白龙 2023-8-14 19:34
24
0
工程不小,点赞
雪    币: 400
活跃值: (700)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Da_ 2023-11-8 20:13
25
0
Mark
游客
登录 | 注册 方可回帖
返回