首页
社区
课程
招聘
[原创]某视频app的混淆分析总结以及反混淆
发表于: 2020-3-15 23:56 19037

[原创]某视频app的混淆分析总结以及反混淆

2020-3-15 23:56
19037

最近拿到一个某版本的某视频app的so,这个版本跟之前反ollvm混淆版本有所不同,于是拿JNI_OnLoad分析并记录一下

将样本放到IDA中看看JNI_OnLoad,如下

一眼看上去,貌似就是普通的ollvm混淆,但是我们先看看这个函数的结尾。


这很明显不是一个函数的结尾,跟进去sub_525A看看


这个也不像是一个函数,而且结尾用的是MOV PC,R1跳转,IDA根本不知道目的地是哪里。既然这样,模拟执行trace一下看看(具体方法见之前的的帖子),trace部分内容如下

可以见到MOV PC,R1指令实际上跳转到了0x00005270中,经过观察trace文件,发现该样本的所有类似BX xxx,MOV PC,xxx,实际上都仅仅是一个跳转,BX并没有起到X转换模式的作用,仅仅相当于一个B xxxx,所以我们可以通过分析trace文件,找到这类指令,统一patch成B 目标地址就行了,这样子IDA就能正常分析下去。

先手动patch完之后再次打开IDA,


发现IDA无法分析JNI_Onload,是patch出了什么问题吗,我们在JNI_Onload按一下P,MakeFunction试试,发现报错如下

双击看看报错的地方


我们看到0000505A根本不是一条指令,为何会出现这种代码?往上看地址00005046,发现这里搞了个CBZ R1,loc_5058+2,故意跳到了一条指令的中间,这样子IDA肯定无法分析的,实际上如果这条指令条件是成立的话,原程序肯定也会崩溃,所以我们断定这条指令肯定不成立,处理的话直接NOP掉即可。其实这种手法在这个样本很多地方都有,后面通过脚本直接处理掉。

基本原理就是使用恒成立或者恒不成立的条件指令作为跳转,然后在另外一个不会执行的分支加入一些错误的指令让静态分析器出错,因为静态分析器遇到条件跳转指令会认为有两个分支,进入不执行的错误分支解析时候发现有不正常的指令,所以解析无法继续,这类混淆依然可以直接改成b xxxx直接去掉错误的分支,让IDA分析正常

来看看另外一个类似的混淆


我们看看loc_24A8,这个loc的代码是arm的,但是看上去非常奇怪,实际上loc_24A8是thumb的代码,造成loc_24A8被IDA识别arm的原因是loc_249E最后一条BX R1指令,R1为偶数,因此目的地被识别成arm模式,其实loc_249E根本不执行,只是用作欺骗IDA让目的块loc_24A8识别成arm。将loc_24A8改成thumb模式,代码是这样的


这里还看到一条SVC 0指令,说不定这么做是为了隐藏某个敏感的系统调用。

其实总结一下这些混淆不外乎几点


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2020-3-23 21:54 被my1988编辑 ,原因:
上传的附件:
收藏
免费 10
支持
分享
最新回复 (27)
雪    币: 19
活跃值: (331)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
很赞,学习了
2020-3-16 01:13
0
雪    币: 83
活跃值: (1087)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
3
你怎么一眼看过去知道是ollvm混淆的
最后于 2020-3-16 08:03 被killpy编辑 ,原因:
2020-3-16 07:54
0
雪    币: 1498
活跃值: (1091)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4
killpy 你怎么一眼看过去知道是ollvm混淆的
严格来说不能完全确定是ollvm,只能说是类似ollvm,模式非常像,ollvm就三个套路,拿一个demo混淆一下,看多了就知道了。
2020-3-16 08:56
0
雪    币: 977
活跃值: (435)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
5
学习了
2020-3-16 09:43
0
雪    币: 36
活跃值: (1061)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
6
mark,好文
2020-3-16 09:54
0
雪    币: 5235
活跃值: (3260)
能力值: ( LV10,RANK:175 )
在线值:
发帖
回帖
粉丝
7
楼主牛逼 膜拜大佬
2020-3-16 10:05
0
雪    币: 14865
活跃值: (6088)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
学习。
反混淆只能靠毅力。
2020-3-16 10:21
0
雪    币: 145
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
9
2020-3-16 15:33
0
雪    币: 7
活跃值: (263)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
大佬的这个反混淆思想非常不错
2020-3-16 17:26
0
雪    币: 554
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
大佬的思路不错,学习了。
2020-3-16 18:18
0
雪    币: 199
活跃值: (926)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
思路清晰,牛逼
2020-3-17 00:12
0
雪    币: 1237
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
13
思路赞赞赞
2020-3-17 09:19
0
雪    币: 11
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
JNIonload 模拟执行可以跑,另外的函数模拟执行跑不过去,就无法生成trace文件。
真机函数可以hook,ida调试进不去,不知道大佬有没有别的思路可以生成trace 文件?
2020-3-17 21:39
0
雪    币: 1498
活跃值: (1091)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
15
gopig JNIonload 模拟执行可以跑,另外的函数模拟执行跑不过去,就无法生成trace文件。 真机函数可以hook,ida调试进不去,不知道大佬有没有别的思路可以生成trace 文件?
跑不过去看具体原因,实现一下对应的系统调用以及需要的java类。
2020-3-17 22:30
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
16
怎样可以确定一个函数真实的结束的地址,有什么思路吗
2020-3-18 21:04
0
雪    币: 1498
活跃值: (1091)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
17
MadlifeKX 怎样可以确定一个函数真实的结束的地址,有什么思路吗
你拿一个正常的函数结尾,跟这个对比一下,就明白了,一般正常的函数结尾都是类似pop的指令
2020-3-18 21:05
0
雪    币: 218
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
18
  楼主牛牪犇
2020-3-19 23:01
0
雪    币: 402
活跃值: (48)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
dy现在都成了各大大佬们练手的玩意了
2020-3-22 13:18
0
雪    币: 402
活跃值: (48)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
暗街之王 dy现在都成了各大大佬们练手的玩意了
说真的,这个JNI_Onload的混淆程度可能连它妈(开发者)都不一定认识了
2020-3-22 13:21
0
雪    币: 4883
活跃值: (18890)
能力值: ( LV13,RANK:317 )
在线值:
发帖
回帖
粉丝
21
感谢分享
2020-4-4 15:28
0
雪    币: 1636
活跃值: (653)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
22
感谢分享
2021-3-22 11:44
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
23
干货 感谢分享 
2021-9-8 22:03
0
雪    币: 248
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
24
干货 感谢分享 
2021-9-10 16:41
0
雪    币: 206
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
25
感谢分享 大佬牛B 
2021-11-2 17:06
0
游客
登录 | 注册 方可回帖
返回
//