首页
社区
课程
招聘
[原创]Android通用脱壳机FUPK3
发表于: 2018-8-7 16:52 48881

[原创]Android通用脱壳机FUPK3

2018-8-7 16:52
48881

大家好,我是F8LEFT,潜水了这么久,抽空来发个技术帖子。这次要发的作品是我以前写的一个脱壳机FUPK3,这个脱壳机的思路应该是以前没人放过的,这里我不私藏了,放出来给大家来评评。
Android代码是开源的,那么通过直接修改Android源码,把运行时的所有dex数据dump出来,不就可以实现一个通用的脱壳机了吗?FUPk3就是基于上面的思路来实现的。FUPK3需要修改Android源码,导出数据接口.不过,最为核心的脱壳操作是在一个so中执行的,脱壳时应用会自动加载该so,这样好处在于可以通过替换这个so来达到动态修bug的效果。

cookie
脱壳需要知道app当前加载的所有dex文件。每一个被加载到内存中的dex文件都会被记录为一个cookie值,存放在程序的loader中,所有类的加载都需要通过该loader进行。Java层的loader可能会比较复杂,比如会用到双亲委派机制等,不好遍历。但是,到了Jni层,一切都变得简单起来,在native中,会通过一个Hash表来存储所有dex文件。

因此,想要知道当前apk加载了那些dex就简单多了,只需要遍历这个userDexFile这个Hashtable就好了。直接在Android源码中导出接口。

然后,直接在so里面调用接口,就可以取出所有dex文件的内存布局。

dex重建
dex文件被加载起来后,一些值就不会再被用到,如文件头sig,数据偏移等,部分壳会把这些数据抹除。这些数据需要直接从应用的运行时数据 DvmDex, ClassObject, MethodObject等取出来,并进行重建。还有一些常量数据,StringPool,TypePool等,这些是不会加密的,直接dump出来。

对于Method的重构要复杂得多,每一代加固的发展重点都是增强对Method的CodeItem的加密。从整体加密到函数抽取到最新的函数VMP,还原难度也越来越高。VMP暂且不说,函数抽取本身还是可以攻破的。有些壳做得非常复杂,会在函数执行时还原代码,执行完后又加密回去。针对这种情况,可以看到,在程序运行时的某一个时刻,dex的部分数据肯定是还原的,那么我们可以通过不断地手动构造代码,来遍历触发这些还原点,同时进行数据提取,最终完成修复。

在上面,直接在Android源码中构造了脱壳用到的接口 gFupk,它提供了4个void*的空间来存放临时数据,与一个可以替换的接口方法fupkExportMethod。这样,只需要手动调用fupkInvokeMethod方法,程序就会走函数正常的执行流程,从dvmInvokeMethod开始,进入dvmInterpret中,并最终调用完gFupk.ExportMethod后直接退出Interpret。这样当我们手动调用函数时,既可以让壳还原出原始代码,又不会影响到程序本身的稳定性。

这样,所有加密的数据都提取出来了,直接进行组合,以加密的方式dump出来。

其他
Android加固发展到现在,经历了好几个大版本改动。最初的是dex整体加固,现在的是VMP加固,中间出了不少非常不错的脱壳机,其中最为经典的有2个:ZjDroid与dexHunter,这两个都是开源的,并且写得非常好,即使是放到今天来看,也具有相当的参考价值,想要学习脱壳的同学们可以拜读一下。另外,FUpk3是运行在dalvik上的,那么要在art下脱壳怎么办呢?道理还是一样的,只是art下会复杂很多, 跑解析的跑编译的都有,修复起来需要记录很多数据,这里由于某些原因就不公开art下的脱壳机了。

写在最后
新手想要入门,需要什么?1. 一台谷歌亲儿子(nexus) 2. 一个Ubuntu系统 3. 一套完整的Android源码。平时有事没事可以多看看源码,刷刷机之类的。Android平台与Windows上的不同,到目前为止,Android上系统的优秀的教材实在是少,如果没人手把手地带入门的话,基本上就是在白做功,幸好大部分难点的解决方案答案都可以在源码里面找到,多熟悉一下总会有好处的。

7.https://github.com/F8LEFT/FUPK3
看雪上的md插件怪怪的,大家去我的github上看吧,欢迎各种star与follow,演示视频在这里 https://pan.baidu.com/s/1HH_-TQGca1NLoSqzvOPB3Q 密码:izm3

最后,美团招人啦,想学习业界最新的技术吗,想认识业界顶级大牛吗,快来加入我们吧。详情看地址http://www.expshell.com/?p=114

 
try {
 UpkConfig config = new UpkConfig();
 if (config.load() && config.mTargetPackage.equals(data.info.getPackageName())) {
     Fupk upk = new Fupk(config.mTargetPackage);
     upk.unpackAfter(10000);
 }
} catch (Throwable t) {
}
// 每个打开的dex文件都会存储到gDvm.userDexFiles中
static void addToDexFileTable(DexOrJar* pDexOrJar) {
 u4 hash = (u4) pDexOrJar;
 void* result;

 dvmHashTableLock(gDvm.userDexFiles);
 result = dvmHashTableLookup(gDvm.userDexFiles, hash, pDexOrJar,
         hashcmpDexOrJar, true);
 dvmHashTableUnlock(gDvm.userDexFiles);

 if (result != pDexOrJar) {
     ALOGE("Pointer has already been added?");
     dvmAbort();
 }

 pDexOrJar->okayToFree = true;
}
// @F8LEFT exported function
HashTable* dvmGetUserDexFiles() {
 return gDvm.userDexFiles;
}

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

最后于 2018-8-8 19:52 被currwin编辑 ,原因:
收藏
免费 9
支持
分享
打赏 + 5.00雪花
打赏次数 1 雪花 + 5.00
 
赞赏  junkboy   +5.00 2018/08/07
最新回复 (120)
雪    币: 2
活跃值: (64)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
厉害了大佬
2018-8-7 16:54
0
雪    币: 1
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
老师  我第一
2018-8-7 16:54
0
雪    币: 6003
活跃值: (3490)
能力值: ( LV6,RANK:96 )
在线值:
发帖
回帖
粉丝
4
F8LEFT大佬 666
2018-8-7 16:55
0
雪    币: 6911
活跃值: (9064)
能力值: ( LV17,RANK:797 )
在线值:
发帖
回帖
粉丝
5
支持支持
2018-8-7 16:57
0
雪    币: 76
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
F8LEFT大佬 666 
2018-8-7 16:58
0
雪    币: 1014
活跃值: (582)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
前排膜拜。另外.大佬艹粉吗
2018-8-7 16:59
0
雪    币: 20
活跃值: (210)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
膜f8大佬
2018-8-7 17:00
0
雪    币: 102
活跃值: (2045)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
mark,跟F8大佬学习
2018-8-7 17:00
0
雪    币: 507
活跃值: (130)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
10
友情暖贴。
2018-8-7 17:02
0
雪    币: 729
活跃值: (1306)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
11
支持支持
2018-8-7 17:03
0
雪    币: 1307
活跃值: (4126)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
12
git上没有内容额,是删了吗
2018-8-7 17:04
0
雪    币: 205
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
膜拜
2018-8-7 17:09
0
雪    币: 2466
活跃值: (4550)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
666666666大佬
2018-8-7 17:22
0
雪    币: 9
活跃值: (422)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
gayhub是空的呀,已follow
2018-8-7 17:24
0
雪    币: 220
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
前排围观大神
2018-8-7 17:25
0
雪    币: 11716
活跃值: (133)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
支持~
2018-8-7 17:26
0
雪    币: 13
活跃值: (35)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
膜拜大佬
2018-8-7 17:26
0
雪    币: 324
活跃值: (384)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
19
膜拜
2018-8-7 17:37
0
雪    币: 440
活跃值: (1163)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
20
膜拜F8大佬
2018-8-7 17:40
0
雪    币: 440
活跃值: (1163)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
21
FIGHTING安 git上没有内容额,是删了吗
晚上放,大佬写的很清楚了
2018-8-7 17:46
0
雪    币: 8277
活跃值: (642)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
22
大佬,膜拜
2018-8-7 17:52
0
雪    币: 393
活跃值: (224)
能力值: ( LV8,RANK:140 )
在线值:
发帖
回帖
粉丝
23
我们招人是认真的,面试成功将与我们共事
2018-8-7 17:56
0
雪    币: 1036
活跃值: (1311)
能力值: ( LV3,RANK:35 )
在线值:
发帖
回帖
粉丝
24
膜拜大佬!!!  
2018-8-7 18:02
0
雪    币: 59
活跃值: (680)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
牛逼F8老师
2018-8-7 18:36
0
游客
登录 | 注册 方可回帖
返回
//