首页
社区
课程
招聘
[原创]阿里早期加固代码还原4.4-6.0
发表于: 2017-1-6 22:59 21031

[原创]阿里早期加固代码还原4.4-6.0

2017-1-6 22:59
21031

分析的样本是alictf2014 EvilAPK第三题,网上的脱壳方法都是在mmap等函数下断点dump解密的dex,但是不懂原理,想知道加固的原理,不然下次一改还是不会。
  用jeb打开apk就是一个StubApplication的空壳,核心方法还是在onCreate和attachBaseContext方法里面,只需要将这2个方法逆向就可以知道加固的原理,通过分析,加固核心点还是动态加载dex,首先用RC4解密算法解密asset目录下的cls.jar还原出真正的dex,然后用mmap将dex映射内存,使用openDexFile加载dex,就会得到cookie,然后用这个cookie设置Application类中的某些成员。
  开始提供的代码只适用于android5.0以下,2014年的样本在android5+跑不起来,这次再接再厉,在android4.4-6.0平台加固可以实现通杀,7.0还没测试,不知道现在厂商用的是什么加固方法,希望给学逆向的同学一些帮助。  

  附件提供了还原libmobisec.so的C语言代码,解密后dump出来的dex,并且可以用自己写的StubApplication通过jni来动态加载这个dex由于代码没有对dex中的资源做处理,生成的apk需要将除了StupAppliation的类去掉,并且public.xml中的内容要和dump.dex中的public.xml对应


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

上传的附件:
收藏
免费 3
支持
分享
最新回复 (43)
雪    币: 7818
活跃值: (1073)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
2
很不错,最近也逆向了这个,不过没有写成代码,楼主真是太棒了,写成代码了。楼主也可以看下近期阿里的壳子,原理都一样,只不过内部符号都去掉了,而且加了混淆,就很难分析明白了,我现在还卡在这里。
2017-1-7 08:59
0
雪    币: 457
活跃值: (333)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢楼主的分享。mark。
2017-1-8 21:34
0
雪    币: 97697
活跃值: (200829)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
4
support!
2017-1-8 22:20
0
雪    币: 63
活跃值: (324)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
厉害了我的哥,有兴趣一起研究新技术吗
2017-1-9 00:28
0
雪    币: 3542
活跃值: (1867)
能力值: ( LV6,RANK:93 )
在线值:
发帖
回帖
粉丝
6
厉害了word,能分享出来就是好样的!
2017-1-9 09:22
0
雪    币: 24
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
支持!支持!
2017-1-9 09:27
0
雪    币: 148
活跃值: (278)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
运行直接崩了啊.dalvik下。4.4.4的系统
2017-1-9 10:03
0
雪    币: 172
活跃值: (1623)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
9
工程生成的apk要将其中除了StubAppliation的类删除,res目录下的public.xml中的资源id要跟dump.dex中的public.xml相同
2017-1-9 10:16
0
雪    币: 148
活跃值: (278)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
嗯,好的,多谢哈,最近我也在研究
2017-1-9 10:20
0
雪    币: 172
活跃值: (1623)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
11
jni里面这段代码判断Dalvik写反了
            jstring vm_version = (*env)->NewStringUTF(env, "java.vm.version");
            jobject v32 = (*env)->CallStaticObjectMethod(env, mySystem, system_getProperty, vm_version);
            const char* runtime_version = (*env)->GetStringUTFChars(env, v32, 0);
            LOGI("---- vmVersionStr:%s", runtime_version);
            double d=atof(runtime_version);
            
            if(d>2)
              isDalvik=0;
            else
              isDalvik=1;
2017-1-9 10:38
0
雪    币: 18
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
楼主这是全静态破解么?
2017-1-9 11:08
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
很棒
2017-1-9 18:58
0
雪    币: 25
活跃值: (1111)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
14
楼主厉害,可以研究研究加固的实现了
2017-1-10 09:01
0
雪    币: 13
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
mark
2017-1-10 09:10
0
雪    币: 38
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
楼主nice,学习一下
2017-1-10 13:13
0
雪    币: 3
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
你不是说以后不说话了吗,怎么又说话了
2017-1-13 12:06
0
雪    币: 44
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
厉害,学习了
2017-1-21 09:31
0
雪    币: 757
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
mark下下
2017-2-6 09:07
0
雪    币: 360
活跃值: (84)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
20
查找 codeOff 的代码好像有点问题, function 没有 include ?
把部分代码复制到 header.h 之后好了,另外,u4 使用 unsigned int 我这里不够长,换成 long 才行
2017-2-7 15:21
0
雪    币: 220
活跃值: (18)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
21
mark了
2017-2-7 16:17
0
雪    币: 38
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
不是我说你,你看帖子就是不认真。我是说不回答了,不是不说话。这个又不是提问帖,我感谢一下不算
2017-2-7 16:19
0
雪    币: 14
活跃值: (285)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
最好研究下libsecuritysdkx-3.1.45以后的版本,能静态还原他的全量混淆就算厉害了。
2017-2-8 13:47
0
雪    币: 5
活跃值: (116)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
mark
2017-2-8 14:41
0
雪    币: 67
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
mark 厉害
2017-2-9 15:44
0
游客
登录 | 注册 方可回帖
返回
//