首页
社区
课程
招聘
[原创]360加固保分析
发表于: 2020-6-11 20:08 39662

[原创]360加固保分析

2020-6-11 20:08
39662

背景:

调试手机是Android 6.032位的手机。样本是自己写的一个经过360加固的小程序。加固时间为今年的5月份左右。

步骤:

总体来说就是分为两大步,首先是分析libjiagu.so,从中dump出第二个so,也就是解释器so,第二步就是修复分析解释器so,找到指令映射的对应关系,得出指令映射表。

第一步:

首先看一下.init_array做了什么事


可以看到这里只有一个函数,经过我的分析这里并没有做什么重要的事。

然后继续看JNI_OnLoad区域。

发现是这样子的,然后我们的静态分析就变得困难了,只能开始我们的动态调试之旅了。

通过动态调试我从JNI_OnLoad一路跟到这个重要的函数,_Z10__fun_a_18Pcj

可以看到这个函数被混淆的非常严重。但是经过我的分析有用的分支基本只有case31case35两个分支。这里可以说一下case31是一个反调试的分支,case35是进入第二个so的入口,别的分支有的也做了一些事,但是对于我们来说用处不大。

反调试:

我们可以在这里下断,然后跟随R0寄存器。如图

这个版本的一共有三个反调试的点,一个是符号,一个是端口,一个是时间。

此处为第一个反调试了。

我们可以在内存窗口修改指令,改成无用指令。

第一个反调试之后,两次f9就是第二个反调试的点了,也就是时间反调试。

从这个跳转进入,即为时间调试。

在这里我们只需把R0寄存器置0就可以。

还有一个是端口检测,我们只需更改ida的默认调试端口就可以了。

到此,反调试告一段落。

 

接下来我们继续分析,sub_5CE8为第二个so加载的关键地方。

如图,这个是ida f5的结果。

但是我们会发现一个有趣的地方。

有没有觉得这个地方与Android源码中加载so的函数有点相似。

在这个函数断下就可以dump第二个so

但是可惜的是它并没有走这个分支,而是这个分支

sub_540C这个函数一共要解密四个部分,分别为程序头表、JMPREL、RELA、DYNAMIC

一个循环即为一部分。我们把这四部分dump出来。

R7寄存器地址即为整个第二个so的开始地址,我们可以把整个malloc的区域全dump下来。

需要注意的是

一定要在这个循环执行完之后dump,即解密完。

在这里说一下如何修复,因为这个so没有elf_header,所以需要我们自己修复,并且把其他三部分放到原来的地方。在这里特别说一下,R7寄存器为so的开始地址,R1寄存器为此部分在so的偏移,R0为要解密的数据大小。如此,我们可以修复解释器so

总结一下,我们把dump出来的四部分按照偏移直接覆盖到dump出来的so中就可以,因为我们dump出来的so的那四部分并未解密。但是需要注意先修复elf_header

第二步:

按惯例来分析init_array区域,经过分析init_array区域并没有做什么重要的事情。

然后分析JNI_OnLoad,这个函数做了很多事情,最重要的就是注册stub方法和dex的加载。

Dex的加载在这里完成


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2020-6-11 20:08 被[軍]编辑 ,原因:
上传的附件:
收藏
免费 22
支持
分享
最新回复 (47)
雪    币: 29
活跃值: (295)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
感谢分享
2020-6-11 23:14
0
雪    币: 498
活跃值: (4206)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
感谢分享,jumpout咋对抗的呢
2020-6-12 08:09
0
雪    币: 73
活跃值: (923)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
楼主这功力,简直了,佩服。
2020-6-12 11:36
1
雪    币: 10017
活跃值: (3457)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
这是免费版的吗
2020-6-12 15:10
0
雪    币: 224
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
6
这才是我遇到的加固so,之前那些大佬分析的 我都找不到样本
2020-6-12 15:58
0
雪    币: 440
活跃值: (5977)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
7
是的 免费版的
2020-6-12 17:20
0
雪    币: 440
活跃值: (5977)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
8
哆啦噩梦 感谢分享,jumpout咋对抗的呢
暂时还没有找到好的对抗方法
2020-6-12 17:21
0
雪    币: 498
活跃值: (4206)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
[軍] 暂时还没有找到好的对抗方法
楼主jumpout咋处理的
2020-6-12 18:10
0
雪    币: 440
活跃值: (5977)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
10
哆啦噩梦 楼主jumpout咋处理的
可以patch处理 但是对于参数的识别不是太友好
2020-6-12 19:06
0
雪    币: 210
活跃值: (108)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
老师,请教一下。
“R7寄存器地址即为整个第二个so的开始地址,我们可以把整个malloc的区域全dump下来。”  这个需要在哪条指令处dump?
2020-7-1 19:15
0
雪    币: 440
活跃值: (5977)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
12
caijunfan 老师,请教一下。 “R7寄存器地址即为整个第二个so的开始地址,我们可以把整个malloc的区域全dump下来。” 这个需要在哪条指令处dump?
把整个malloc区域全dump下来就可以,然后进行so修复
2020-7-2 10:59
0
雪    币: 210
活跃值: (108)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
[軍] 把整个malloc区域全dump下来就可以,然后进行so修复
是把四次malloc的区域dump下来吗~
2020-7-2 17:34
0
雪    币: 440
活跃值: (5977)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
14
caijunfan 是把四次malloc的区域dump下来吗~[em_85]
那四个区域肯定要dump的,这四个区域是so文件中加密的四部分 等它解密完后dump下来 用来修复so文件 除此之外还要dump整个so文件,就是截图中这部分 AEEC0000 AEFC0000   这是完整的so文件,只不过里面其中的四部分加密了,当然,除了这四部分之外,还有别的很多部分。
2020-7-3 18:48
0
雪    币: 1841
活跃值: (1290)
能力值: ( LV3,RANK:35 )
在线值:
发帖
回帖
粉丝
15
感谢分享
2020-7-5 11:13
0
雪    币: 236
活跃值: (361)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
感谢大佬分享教程
2020-7-7 20:07
0
雪    币: 210
活跃值: (108)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
[軍] 那四个区域肯定要dump的,这四个区域是so文件中加密的四部分 等它解密完后dump下来 用来修复so文件 除此之外还要dump整个so文件,就是截图中这部分 AEEC0000 AEFC0000 ...
感谢大佬~我分析的可能版本不太一样 有差别
2020-7-16 17:18
0
雪    币: 19
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
18
感谢分享
2020-7-17 15:23
1
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
19
跟大佬请教一下,整个malloc区域全dump下来文件大小不到100K,比你提供的的dump.so 765k文件小很多,是什么原因
2020-8-2 21:20
0
雪    币: 440
活跃值: (5977)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
20
mb_evshufvg 跟大佬请教一下,整个malloc区域全dump下来文件大小不到100K,比你提供的的dump.so 765k文件小很多,是什么原因
可能是dump错了地方 也可能是没有dump下来的原因
2020-8-3 11:51
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
21
谢谢,我忘了按照十六进制转换了
2020-8-4 09:08
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
22
再跟大佬请教一下,我如何在加载第二个so里面下断点了,这个断点对应的地址怎么确定
2020-8-4 21:20
0
雪    币: 440
活跃值: (5977)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
23
mb_evshufvg 再跟大佬请教一下,我如何在加载第二个so里面下断点了,这个断点对应的地址怎么确定
上面提到过,从case35可以进入第二个so
2020-8-5 11:43
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
24
请教一下,从case35的.engine:0000CEF4                 BLX     LR,进入,加载的第二个so在模块列表中是什么名称,怎么找到调试中的sub_1CE60的断点位置,如何确定第二个so的调试基地址了
2020-8-5 17:15
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
25
已经找到了,大佬不用答复了,谢谢
2020-8-5 18:26
0
游客
登录 | 注册 方可回帖
返回
//