首页
社区
课程
招聘
[原创]简单尝试脱某加固的DEX壳
发表于: 2017-1-2 20:51 15485

[原创]简单尝试脱某加固的DEX壳

2017-1-2 20:51
15485
0x00 序
第一次尝试脱dex壳,样本是在“*****”官网上免费加固的,非商业版。

本文只是做些简单的笔记,给像我一样的逆向新手们提供点思路,高手们不要见笑。

0x01 加固包和原包对比

加固后的classes.dex文件变大了,脱到JEB里面发现多了一些壳代码和一些垃圾类(jpvbhn、cioub、flsye…)。

原包中,很多类方法的指令被抽空了,如下面的onCreate。

将assets目录下的libexec.so脱到IDA中,发现个别方法被加密,并且用了o-llvm进行混淆编译。导出表中的那些x、y开头的变量就是o-llvm在编译过程中,添加混淆控制流(-bcf)时创建的。

ptrace注入,从内存中dump出来一个libexec.so,看一下字符串表:

在字符串表中看到一些关键词(dvmResolveClass.c、HOOK:%s() write dex!),瞎猜*****可能是抽取dex中的方法指令,然后hook dalvik/art 关键函数,在运行时加载该类时再解密指令。所以用DexHunter试一下。
https://github.com/zyq8709/DexHunter
ps:从字符串表也可以看到,*****为了“防模拟器”,判断了好多系统属性(ro.product.model、ro.product.device…)。

0x02:利用DexHunter还原dex
DexHunter的大致原理是在某dex的第一个类被加载时,遍历该dex文件的所有的class_def_item,主动加载所有的class(调用dvmDefineClass),并初始化(调用dvmIsClassInitialized和dvmInitClass),让壳自己完成方法指令的解密,然后再做必要修复并dump。
编译带DexHunter的dalvik,刷机之后试了一下,在脱壳过程中apk进程死了。

*****有点意思,应该是在libexec.so或libexecmain.so被加载之后,在native代码中判断了“/data/”目录下是否存在dexname文件(这也算DexHunter的一个特征),如果有则自退。
修改DexHunter源码,把dexname这个文件名改掉:

再试一次,还是挂了,这次貌似是调用com.cioub类的clinit方法导致的。

看一下com.cioub类的clinit方法的实现就明白了,上面提到的那些垃圾类(jpvbhn、cioub、flsye…)都是*****为了“防DexHunter”添加的。

先用笨方法解决一下,通过一个名单文件,将这些“防DexHunter”类pass掉。

再试一次,脱出了whole.dex,这实际是一个odex文件,利用baksmali和smali将其转换为dex文件,拖到JEB中看一下:

之前被抽空的onCreate方法成功还原了,去掉那些垃圾类和shell代码应该就差不多了。

0x03 后序
1、使用DexHunter脱完之后,如果还有方法没有还原,那加固厂商可能做了函数级加解密,在方法调用时再解密方法指令。
2、定位native方法指令在内存中的位置

这3个native方法是*****加固之后的3个核心方法,但libexec.so的JNI_Onload貌似加密了,并且导出函数的名字也混淆了(采用RegisterNative动态注册),找出对应的native函数有点费劲。
可以在dvmCallJNIMethod函数中加点log,其实这个函数中本来有log,只不过注掉了。放开的时候,要进行一下过滤,否则打出的日志太多会淹没其它有用的信息。


3、*****应该已经有解释器壳了,猜测*****商业版以后可能会是“类抽取+解释器壳”的形式,因为所有指令都解释执行的话,应该会对效率影响较大,所以二者结合是个不错的选择。

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

上传的附件:
收藏
免费 1
支持
分享
最新回复 (21)
雪    币: 163
活跃值: (504)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
强 前排学习了...
2017-1-2 21:56
0
雪    币: 2177
活跃值: (2045)
能力值: (RANK:400 )
在线值:
发帖
回帖
粉丝
3
写的不错。
2017-1-2 22:27
0
雪    币: 9479
活跃值: (757)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
最好能把测试apk发上来
2017-1-2 23:02
0
雪    币: 2673
活跃值: (2947)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
商业的在初始化那里是不行的
2017-1-3 09:01
0
雪    币: 133
活跃值: (233)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
思路清晰,给力
2017-1-3 09:16
0
雪    币: 53
活跃值: (106)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
虽然这都是两三年前的技术了,不过大多数厂商的免费版还在用这套技术。
2017-1-3 09:51
0
雪    币: 11
活跃值: (80)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
赞一个。。。
2017-1-3 09:54
0
雪    币: 147
活跃值: (33)
能力值: ( LV6,RANK:94 )
在线值:
发帖
回帖
粉丝
9
求问  脱未知的加固   dexname怎么写里面里面的特征字符串(就是第一行的内容)
2017-1-3 10:15
0
雪    币: 93
活跃值: (136)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
前排mark
2017-1-3 13:57
0
雪    币: 144
活跃值: (38)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
mark哦哦
2017-1-3 18:46
0
雪    币: 18
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
不错!求教Ptrace dump so 的方法!
2017-1-4 10:09
0
雪    币: 147
活跃值: (33)
能力值: ( LV6,RANK:94 )
在线值:
发帖
回帖
粉丝
13
求Dexhunter的编译方式,我怎么老是编译不通过

libdex/Android.mk:72: C:/Android/android-ndk-r13b/build//../build/core/build-hos
t-static-library.mk: No such file or directory
dexlist/Android.mk:49: C:/Android/android-ndk-r13b/build//../build/core/build-ho
st-executable.mk: No such file or directory
dexdump/Android.mk:79: C:/Android/android-ndk-r13b/build//../build/core/build-ho
st-executable.mk: No such file or directory
dx/Android.mk:20: C:/Android/android-ndk-r13b/build//../build/core/base_rules.mk
: No such file or directory
dx/Android.mk:40: C:/Android/android-ndk-r13b/build//../build/core/base_rules.mk
: No such file or directory
dx/Android.mk:58: C:/Android/android-ndk-r13b/build//../build/core/base_rules.mk
: No such file or directory
dx/Android.mk:76: C:/Android/android-ndk-r13b/build//../build/core/base_rules.mk
: No such file or directory
tools/dexdeps/Android.mk:29: C:/Android/android-ndk-r13b/build//../build/core/ba
se_rules.mk: No such file or directory
tools/dmtracedump/Android.mk:16: C:/Android/android-ndk-r13b/build//../build/cor
e/build-host-executable.mk: No such file or directory
tools/dmtracedump/Android.mk:24: C:/Android/android-ndk-r13b/build//../build/cor
e/build-host-executable.mk: No such file or directory
2017-1-4 10:36
0
雪    币: 360
活跃值: (84)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
14
直接dump的话应该是没有 .data 段的吧,想问一下 LZ 是怎么还原 ELF 头部的
2017-1-4 18:42
0
雪    币: 44229
活跃值: (19960)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
15
编辑了一下帖,将公司名隐去了,大家互相理解一下。
2017-1-4 20:43
0
雪    币: 2030
活跃值: (1303)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
16
好的,^_^,其实只是一篇菜鸟文而已,***应该不至于,坛主费心了。
2017-1-4 21:45
0
雪    币: 63
活跃值: (324)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
17
把工程带上就更完美了亲
2017-1-5 15:01
0
雪    币: 222
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
后排mark
2017-1-5 21:08
0
雪    币: 103
活跃值: (324)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
dvmDefineClass 某个类时崩溃 怎么解决的呢?
2017-1-10 17:42
0
雪    币: 3
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
这是很久很久以前的东西了吧,话说去爱加密上班就是给的这个小玩意让人来脱的,不过蛮喜欢你发明的新词汇,,解释器的壳+类抽取,
2017-1-11 18:01
0
雪    币: 163
活跃值: (1538)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
21
dvmDefineClass 某个类时崩溃 怎么解决的呢?
2019-12-13 18:30
0
雪    币: 3703
活跃值: (18310)
能力值: ( LV12,RANK:277 )
在线值:
发帖
回帖
粉丝
22
感谢分享
2020-4-5 10:24
0
游客
登录 | 注册 方可回帖
返回
//