首页
社区
课程
招聘
[原创]细说arm反类ollvm混淆-基本思想
发表于: 2020-2-29 17:59 21701

[原创]细说arm反类ollvm混淆-基本思想

2020-2-29 17:59
21701

先从一个简单的函数开始

直接正常编译,ida cfg如下

如果用ollvm加上fla(这里为了简单说明问题,只加fla,加了其他混淆并不改变反混淆的原理)

可以看到,加入了很多小块,而原来真正跟原程序相关的块,这里已经用浅蓝色标出,先来看看这样子直接F5的结果。

可以看到原来非常直接的顺序执行逻辑,现在变成非常不直观的平坦化逻辑,每一个真实逻辑执行完,无法直观地知道下一个真正要执行的地方是哪里。造成这种效果的罪魁祸首就是加上去的小块.


观察一下一个真实块的逻辑

这个块对应的是原程序a变量与5比较的逻辑,只不过做完a跟5的比较判断之后,将一个很大的数字mov到R0寄存器.


继续看看这个块的目的地loc_738所做的事情。

这个块做的事情只有一个,根据之前的真实块(loc_70E)mov到R0的结果,决定需要跳转到哪个块。中间可能经过其他白色块的中转,但是最终的结果肯定是另外一个真实块。 这类混淆的基本运行逻辑逻辑是[真实块]->[控制块(0到n个)]->[下一个真实块]->[控制块(0到n个)]->[下一个真实块].....


再去认真观察蓝色的真实块的特征,可以发现,所有真实块的输入,都与那些ollvm加入的分发控制块无关,比如,loc_70E的输入是var_20这个变量,与所有白色控制块所读写的寄存器无关。


基于上述观察可得,fla加入的所有白色控制块,与原程序的真实逻辑并没有任何关系,在混淆中只充当一个决定下一个真实块的分发控制作用,如果我们知道真实块的前后关系,可以把他们直接连接起来,跳过所有白色的控制块,我们的程序依然是正确的,程序的逻辑也变得直观多了


于是我们反混淆需要解决以下几个问题

观察白色的块,其实特征非常明显,非常短(只有几条指令),仅仅只有寄存器的操作,而没有内存操作,最后都是cmp+跳转等等,这个不同厂商的混淆有细微的差别,但多数都特征非常明显,可以直接静态分析出来,在反混淆程序设计上,为了隔离这种差别引起的复杂性,可以用多态隔离掉就可以了。确定所有控制块后,直接用0清除这些块里面所有指令,免得干扰ida分析,因为修复成功后,所有真实块都不会经过这些控制块了。

单从静态分析去确定真实块的关系非常浪费时间,这里可以采取两种方法

这种方法优点是借用成熟的调试工具,无需模拟环境,上手简单,缺点是如果程序有反调试,需要先将反调试干掉。这里需要借助一下idapython脚本。链接

脚本的原理非常简单,在待trace函数每一条指令都下一个断点,并将断点属性改为BPT_TRACE,这样断点不会停下来,但会触发原先设置好的回调函数,在回调函数中,可以将运行指令的地址等所有信息记录下来。最后得出含有这种内容一个trace文件。

利用模拟执行直接执行目标函数,也可以达到每条指令都记录下来的效果,优点是无视反调试(但也有可能遇到对抗),缺点是需要准备好模拟环境,实现一些系统调用以及java函数等等,操作比较麻烦,对于android环境的模拟,开源界已经存在一些优秀项目如AndroidNativeEmu,但由于该项目存在一些bug和一些未实现的系统调用,我拿来做了些改进参见这里


无论用那种方式,我们都可以得出一个记录所有执行指令的trace文件,有了这个文件我们就可以知道真实块的前后顺序了,方法如下


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2020-3-2 09:22 被my1988编辑 ,原因:
收藏
免费 20
支持
分享
打赏 + 5.00雪花
打赏次数 3 雪花 + 5.00
 
赞赏  laoli121   +1.00 2022/08/09
赞赏  找合作伙伴   +2.00 2020/03/08 非常棒,方便的话,能否交流一下安卓模拟的问题,就是让安卓程序在pc上跑,不是那种装模拟器的方式 。
赞赏  上海刘一刀   +2.00 2020/03/01 写的蛮好 很有启发性 大佬方便的话 可以分享下样本和代码吗
最新回复 (49)
雪    币: 48
活跃值: (3439)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
大佬,牛逼
最后于 2020-2-29 20:11 被Harpe编辑 ,原因:
2020-2-29 20:06
0
雪    币: 47
活跃值: (418)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
3
给大佬打 call,大佬
2020-2-29 22:12
0
雪    币: 977
活跃值: (435)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
4
2020-3-1 00:25
0
雪    币: 3040
活跃值: (1150)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
5
膜大佬
2020-3-1 09:35
0
雪    币: 5235
活跃值: (3260)
能力值: ( LV10,RANK:175 )
在线值:
发帖
回帖
粉丝
6
膜拜大佬   mark一下 有空慢慢学习
2020-3-1 10:26
0
雪    币: 2081
活跃值: (541)
能力值: ( LV3,RANK:27 )
在线值:
发帖
回帖
粉丝
7
向大佬学习
2020-3-1 11:03
0
雪    币: 1498
活跃值: (1091)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
8
上海刘一刀
样本和代码在github上,有兴趣可以看看https://github.com/maiyao1988/deobf,代码还在改进当中。
最后于 2020-3-1 11:12 被my1988编辑 ,原因:
2020-3-1 11:10
1
雪    币: 977
活跃值: (435)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
9
my1988 上海刘一刀 膜 样本和代码在github上,有兴趣可以看看https://github.com/maiyao1988/deobf,代码还在改进当中。
多谢
2020-3-1 19:49
0
雪    币: 8447
活跃值: (5041)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
10
牛逼
2020-3-2 08:03
0
雪    币: 7
活跃值: (263)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
厉害
2020-3-2 16:32
0
雪    币: 484
活跃值: (872)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
12
感谢大佬,git上好像少了个Application.py
2020-3-7 11:20
0
雪    币: 1498
活跃值: (1091)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
13
感谢提醒已fix,这些问题可以直接在git上提issue
2020-3-7 11:40
0
雪    币: 1157
活跃值: (847)
能力值: ( LV8,RANK:150 )
在线值:
发帖
回帖
粉丝
14
可以考虑符号执行来确定块的真实关系,直接执行确定关系可以是可以,就是恢复出来的代码只能包含特定参数场景的流程,跟原代码逻辑还是有比较大的差异

符合执行的方式,我自己测试的结果,恢复效果还是很好的,跟源码相似度很高
2020-3-7 23:26
0
雪    币: 1498
活跃值: (1091)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
15
freakish 可以考虑符号执行来确定块的真实关系,直接执行确定关系可以是可以,就是恢复出来的代码只能包含特定参数场景的流程,跟原代码逻辑还是有比较大的差异 符合执行的方式,我自己测试的结果,恢复效果还是很好的 ...
这个我曾经想过,但是还没实践过,有个疑问,直接符号执行如果复杂的话,会不会有路径爆炸?还有就是,符号执行那些bcf出来的块有好办法去掉吗?
2020-3-8 09:33
0
雪    币: 489
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
16
非常期待大佬 后续写一篇文章详细讲怎么patch的文章。努力期待中。。。
2020-3-8 13:07
0
雪    币: 1498
活跃值: (1091)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
17
找合作伙伴 非常期待大佬 后续写一篇文章详细讲怎么patch的文章。努力期待中。。。
呵呵,patch目前还不完善。需要多分析几个案例才能写出来。
2020-3-8 16:05
0
雪    币: 453
活跃值: (166)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
写得太好了,好好学习一下。另外能否问一下 ExAndroidNativeEmu 里面的 libcms.so 是哪个版本的 APK 里面的呢?
2020-3-8 21:21
0
雪    币: 1498
活跃值: (1091)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
19
playniuniu 写得太好了,好好学习一下。另外能否问一下 ExAndroidNativeEmu 里面的 libcms.so 是哪个版本的 APK 里面的呢?
这个我都无法确定,因为我是基于AndroidNativeEmu改进的,原项目就有的文件,我只是拿来做测试用例。
2020-3-8 23:04
0
雪    币: 2335
活跃值: (1319)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
20
my1988 这个我曾经想过,但是还没实践过,有个疑问,直接符号执行如果复杂的话,会不会有路径爆炸?还有就是,符号执行那些bcf出来的块有好办法去掉吗?
我也写过反ollvm混淆的脚本,尝试用angr符号执行,angr文档太烂,坑太多就放弃了。
2020-3-8 23:06
1
雪    币: 2335
活跃值: (1319)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
21
用无名侠那个用Unicorn实现的简单的分支遍历 还不错
2020-3-8 23:07
0
雪    币: 2335
活跃值: (1319)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
22
my1988 呵呵,patch目前还不完善。需要多分析几个案例才能写出来。
deollvm64 之前写的,比较龊,各种拼凑,希望能有所帮助
最后于 2020-3-8 23:12 被FraMeQ编辑 ,原因:
2020-3-8 23:12
0
雪    币: 1498
活跃值: (1091)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
23
FraMeQ my1988 呵呵,patch目前还不完善。需要多分析几个案例才能写出来。 deollvm64 之前写的,比较龊,各种拼凑,希望能有所 ...
page not found
2020-3-8 23:27
0
雪    币: 83
活跃值: (1087)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
24
你说的多态隔离是啥意思
最后于 2020-3-9 06:02 被killpy编辑 ,原因:
2020-3-9 06:02
0
雪    币: 1498
活跃值: (1091)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
25
killpy 你说的多态隔离是啥意思
控制块的特征不同厂商可能不同,将识别控制块的逻辑统一接口,然后针对特殊情况写特殊识别的逻辑
2020-3-9 07:39
0
游客
登录 | 注册 方可回帖
返回
//