首页
社区
课程
招聘
[原创]分析一下X加密
发表于: 2021-5-9 14:54 21220

[原创]分析一下X加密

2021-5-9 14:54
21220

本地环境依然是6.0.1的系统,这应该是最后一个分析的抽取类型的壳,后面会正式进入VMP的分析,文章没有分析的太透彻,主要还是以脱壳为主。文中ida中出现的字段和函数名可能根据自己的理解被修改过,也可能出现错误,还请各位大佬多多担待,并且指正,由于某些原因最终的脱壳脚本没办法给大家提供,但是会有思路,还请大家多多包涵.

首先,这个壳有点不太一样
图片描述

大家通过看上面图片可以发现,这个应用的dex抽取过后和壳打到一起了。所以后面就不会有再去加载dex的操作。OK,下面正式开始分析

定位s.h.e.l.l.S

8083ea54f4569841b4cf223c614333cb.png

s.h.e.l.l.N->静态块

52ec6f14b60277f4f547ade1577a7037.png

之后进入so层的分析

0a2129527928f9b85107fd8e24705287.png

调试的话,直接定位linker,调试一下.init_proc

08967748bf33ff0c80f40a2f5b2ff79d.png

642e42f56cd1da01ff1e2014463b2949.png

1bf9734883f257b83e52b74eba6aad1c.png

0b5f71799fe05c0271ab1d7cce0197b7.png

a1f58647bc4c47b92aa587f0310be08a.png

9d21960493a0029af14dce444fb4ed33.png

过掉UND之后,可以开始dump了。

7d5f359dba2f8a37b5c13a5cfcf24ca3.png

0c94068aebf921ea06b4cd2de7a9b4a2.png

1d5620b0e7a13da115b244fbabcb9e42.png

47d92a86955f749f0da598417382d3ba.png

发现并不是从ELF头开始的,而是0x10000起始的。所以直接修复了

我采用新建一个2进制文件,先将0x10000之前的数据copy进去,后面再拼接此dump出的数据,然后实际大小,是dump出的大小加上前面的数据得出总大小

24a0e23bd8c8ea5fb6ab220f7fd61c8c.png

2533331d0662840e0a5841e2af106860.png

然后把数据追加到新创建的so中,注意对齐

fbd2fc1bcddd46526a0c6ab96542f51e.png

由于我并不需要把so完美修复好,我本地修复主要是动态调试有个对照,所以这2个segment修复后,就可以看到大致的代码了。

e48f9df8b32844757a4f22c24925d5b3.png

init_array做了保护,被编译器拆分成很多函数,我分析的时候几乎是一个一个看的,总结出来了,init_array主要做2个事情,第一,字符串解密,并保存;第二,反调试,下面简单介绍一下主要流程.

f7b258035259409b0f8ff59405a24cdf.png

前面若干个函数主要做了一些字符串的解密,类似于下图

acfb51dbe1152b85cd64b460b7239613.png

定位sub_12BDC:

兼容性处理与函数地址初始化

e86d861968b7145a890a9de856a02207.png

定位sub_2CB80

这函数主要做反调试

89932a0756200c1124096af995766c2d.png

3e167cbc2e4afa02944dd17d22a25725.png

53c4e25320da4e4d7bc7100af5095b1e.png

这个函数并不是很长,通过分析,核心做了2个事情。(这里说一下)

初始化一些数据:例如: 机型相关的数据:HARDWARE,MODEL,RELEASE,sdk_version等等(这个是为了兼容性考虑,后面逻辑会有一些判断),applicationInfo,processName,sourceDir, 待使用的文件路径,和一些Java层的class名字,最终都会保存在一个全局结构体中,和乐固类似。

Java层的函数动态注册: 其中主要涉及到如下函数

**N:l->sub_3C02C

N:r->sub_3EF5C

N:ra->sub_3F46C**

下面做简单分析,定位sub_3AB48(JNI_ONLOAD核心实现在这里)

JNI_ONLOAD走完了,下面继续回到Java层,看看调用了哪个native函数

这个函数有很多的兼容性的操作.

这里hook了非常多的art的函数,我们比较关注的,定位sub_26BAC, 壳的还原时机就是hook了这个loadMethod函数

后面还有一些逻辑,不过到这里,这个壳已经可以脱了。

定位sub_27034

然后进入sub_51CD8开始真正的填充

init_array已经有3中反调试了

89932a0756200c1124096af995766c2d.png

3e167cbc2e4afa02944dd17d22a25725.png

53c4e25320da4e4d7bc7100af5095b1e.png

后面还有,但是我idb丢失了一次,这个忘记了,大家到时候自己调试一下在sub_2D6CC

检测是否有/data/dexname

尝试env->loadClass("cn/youlor/Unpacker")

检测是否存在“/data/local/tmp/unpacker.config”

检测是否存在fart

检测/data/local/tmp/re.frida.server

然后有个专门的线程,检测maps中的内容,检测了如下字符串

com.android.reverse-

/data/local/tmp/libFupk3.so

xposed.Fdex2

/system/bin/app_process32_xposed

xposed.installer

app_process64_xposed

libxposed_art.so

io.va.exposed

io.virtualapp.sandvxposed

libriru_

com.saurik.substrate

re.frida.server

mapp.rm-

_frida-agent.so

com.example.FunDex-

经过下面一段脚本的执行,可以直接F9让应用完美运行起来

比较抱歉,这边由于某些原因,最终的脚本不能给到大家,下面说一下思路。

大家要先仔细调试一下sub_27034这个函数,就知道dump哪里了,很明显。

根据上面壳本身的还原逻辑,我们可以直接从内存中dump出3段数据,

第一段是真正的opcode相关信息存放的数据段,例如opcode的长度,以及真正的opcode。

后面2段是存放有关debuginfo相关的数据,例如debuginfo的值,以及当前debuginfo在第一段数据中对应的起始地址。

然后我们还需要保存当前3段数据的起始地址,因为这些数据dump出来的时候,存放的都是实际地址,所以我们需要减去起始地址,纯计算偏移去做。

这里用py脚本解析DexFile就好。把每个code_item的debuginfo保存到文件,这里是否保存到文件取决于大家最终的修复脚本用py还是C,我是用C的,但是我的解析脚本是py,所以保存文件中给C解析.

这里还原大家一定要直接看指令,不要F5,不要F5,不要F5!

1.还原sub_152D2

2.还原sub_51CD8

脱壳前:

脱壳后:

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

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

最后于 2021-5-9 14:59 被GitRoy编辑 ,原因:
上传的附件:
收藏
免费 13
支持
分享
最新回复 (22)
雪    币: 2270
活跃值: (5532)
能力值: ( LV8,RANK:146 )
在线值:
发帖
回帖
粉丝
2
nnnb
2021-5-9 15:05
0
雪    币: 1167
活跃值: (2189)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
+1
2021-5-9 15:20
0
雪    币: 2971
活跃值: (117422)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
牛逼,很详细了!
2021-5-9 15:28
0
雪    币: 3342
活跃值: (13983)
能力值: ( LV9,RANK:230 )
在线值:
发帖
回帖
粉丝
5
竟然检测Fundex
2021-5-9 17:35
0
雪    币: 3212
活跃值: (728)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
tql
2021-5-9 20:17
0
雪    币: 6573
活跃值: (3873)
能力值: (RANK:200 )
在线值:
发帖
回帖
粉丝
7
nb
2021-5-10 13:35
0
雪    币: 219
活跃值: (594)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
这是干嘛的
2021-5-10 14:06
0
雪    币: 5330
活跃值: (5464)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
9
dzahz 这是干嘛的
记录一下分析加固的过程
2021-5-10 14:40
0
雪    币: 8277
活跃值: (642)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
10

那个UND指令是IDA在ARM架构下的软件断点指令形式(UND指令是无效异常指令,执行时会触发CPU异常,IDA收到异常后就可以停下,即为软件断点作用),就跟windows的int3断点似的,出现这个问题,因为这段代码是自修改代码,SMC,你调试时不可以下多余一个的断点,建议直接f4或者单步调试,因为你f2下了断点,而且没有取消这个断点直接往下调试了,在它后面mmap时就把内存这个断点UND指令复制过去了,所造成的问题,注意,IDA下软件断点在UI表现上虽然看不到实际的内存修改,仅是断点处颜色改变,但是其内存处被修改成断点指令了。

最后于 2021-5-10 15:42 被sqdebug编辑 ,原因:
2021-5-10 15:38
1
雪    币: 5330
活跃值: (5464)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
11
sqdebug 那个UND指令是IDA在ARM架构下的软件断点指令形式(UND指令是无效异常指令,执行时会触发CPU异常,IDA收到异常后就可以停下,即为软件断点作用),就跟windows的int3断点似的,出现这个 ...
原来如此!! 谢谢大佬指点!!
2021-5-10 15:48
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
12
大佬,图中使用的royhook tool有开源吗
2021-6-24 14:15
0
雪    币:
活跃值: (135)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
ddddhm
2021-7-22 18:49
0
雪    币: 2240
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
14
学习了,大佬!
2021-7-22 19:16
0
雪    币: 5330
活跃值: (5464)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
15

0

最后于 2021-7-22 20:37 被GitRoy编辑 ,原因:
2021-7-22 20:36
0
雪    币: 5330
活跃值: (5464)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
16
diskloader 学习了,大佬!

能给大家带来帮助,我感觉到非常荣幸!

最后于 2021-7-22 20:37 被GitRoy编辑 ,原因:
2021-7-22 20:37
0
雪    币: 248
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
17
nb
2021-7-23 10:17
0
雪    币: 1255
活跃值: (780)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
nb!
2021-7-23 16:57
0
雪    币: 7
活跃值: (86)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
直接看不懂
2021-7-25 20:08
0
雪    币:
活跃值: (135)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
大佬你怎么学的
2021-7-28 18:47
0
雪    币: 576
活跃值: (2035)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
mark
2021-7-28 20:37
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
22
求 royhook tool工具
2021-9-16 23:25
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
23
大佬 你给的apk是用哪个版本apktool打包的,我这边打包资源错误
2021-9-28 00:21
0
游客
登录 | 注册 方可回帖
返回
//