2

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

寒号鸟二代 2017-1-6 22:59 10233
分析的样本是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对应
上传的附件:
最新回复 (41)
jltxgcy 2017-1-7 08:59
2
很不错,最近也逆向了这个,不过没有写成代码,楼主真是太棒了,写成代码了。楼主也可以看下近期阿里的壳子,原理都一样,只不过内部符号都去掉了,而且加了混淆,就很难分析明白了,我现在还卡在这里。
qqsunqiang 2017-1-8 21:34
3
谢谢楼主的分享。mark。
linhanshi 2017-1-8 22:20
4
support!
AqCxBoM 2017-1-9 00:28
5
厉害了我的哥,有兴趣一起研究新技术吗
lynnux 2017-1-9 09:22
6
厉害了word,能分享出来就是好样的!
backerchen 2017-1-9 09:27
7
支持!支持!
SANCDAYE 2017-1-9 10:03
8
运行直接崩了啊.dalvik下。4.4.4的系统
2
寒号鸟二代 2017-1-9 10:16
9
工程生成的apk要将其中除了StubAppliation的类删除,res目录下的public.xml中的资源id要跟dump.dex中的public.xml相同
SANCDAYE 2017-1-9 10:20
10
嗯,好的,多谢哈,最近我也在研究
2
寒号鸟二代 2017-1-9 10:38
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;
wingsbupt 2017-1-9 11:08
12
楼主这是全静态破解么?
bhwxf 2017-1-9 18:58
13
很棒
繁华皆成空 2017-1-10 09:01
14
楼主厉害,可以研究研究加固的实现了
狂奔的鸡骨架 2017-1-10 09:10
15
mark
trackway 2017-1-10 13:13
16
楼主nice,学习一下
黑夜破解 2017-1-13 12:06
17
你不是说以后不说话了吗,怎么又说话了
小目 2017-1-21 09:31
18
厉害,学习了
知花香 2017-2-6 09:07
19
mark下下
1
Caln 2017-2-7 15:21
20
查找 codeOff 的代码好像有点问题, function 没有 include ?
把部分代码复制到 header.h 之后好了,另外,u4 使用 unsigned int 我这里不够长,换成 long 才行
kingdog 2017-2-7 16:17
21
mark了
trackway 2017-2-7 16:19
22
不是我说你,你看帖子就是不认真。我是说不回答了,不是不说话。这个又不是提问帖,我感谢一下不算
hiltercn 2017-2-8 13:47
23
最好研究下libsecuritysdkx-3.1.45以后的版本,能静态还原他的全量混淆就算厉害了。
xautzbl 2017-2-8 14:41
24
mark
spydh 2017-2-9 15:44
25
mark 厉害
Zkeleven 2017-2-9 16:28
26
能支持多dex吗
了log 2017-2-12 16:58
27
感谢分享
Android绝影 2017-2-17 17:55
28
感谢分享
繁华皆成空 2017-3-1 15:49
29

跟了一下,发现7.0以上,DexFile中多了两个参数, 6.0是 private static Object openDexFile(String sourceName, String outputName, int flags) 7.0以后是 private static Object openDexFile(String sourceName, String outputName, int flags,ClassLoader loader, DexPathList.Element[] elements)

繁华皆成空 2017-3-1 15:51
30
而且传参时,loader和elements传进去的应该是有实际意义的值,暂时还不知道怎么处理
hackoflife 2017-3-2 11:38
31
留名收藏
繁华皆成空 2017-3-7 16:44
32

楼主我在你代码的基础上添加了几行代码测试可以运行在7.0+机器上 

if(sdk_int>22&&sdk_int<24)
{
        mCookie = (*env)->GetFieldID(env, myDexFile, "mCookie", "Ljava/lang/Object;");
        myOpenDexFile=(*env)->GetStaticMethodID(env, myDexFile, "openDexFile", "(Ljava/lang/String;Ljava/lang/String;I)Ljava/lang/Object;");
}
else if(sdk_int>=24){
  //7.0+ openDexFile稍有不同
        mCookie = (*env)->GetFieldID(env, myDexFile, "mCookie", "Ljava/lang/Object;");
  myOpenDexFile=(*env)->GetStaticMethodID(env, myDexFile, "openDexFile", "(Ljava/lang/String;Ljava/lang/String;ILjava/lang/ClassLoader;[Ldalvik/system/DexPathList$Element;)Ljava/lang/Object;");
}
if(sdk_int>22&&sdk_int<24)
{
        art_MarCookie=(*env)->CallStaticObjectMethod(env, myDexFile, myOpenDexFile, inPath,0,0);
        LOGI("----MarCookie:%p",art_MarCookie);
}else if(sdk_int>=24){
   //7.0+此处需要5个参数
   jclass ApplicationClass = (*env)->GetObjectClass(env,new_ctx);
          jmethodID getClassLoader = (*env)->GetMethodID(env,ApplicationClass, "getClassLoader", "()Ljava/lang/ClassLoader;");
        jobject classLoader = (*env)->CallObjectMethod(env,new_ctx, getClassLoader);
        art_MarCookie=(*env)->CallStaticObjectMethod(env, myDexFile, myOpenDexFile, inPath,0,0,classLoader,0);
}

 new_ctx是attachBaseContext上的context

不知世事 2017-3-10 14:53
33
谢谢分享,下载研究一番
billyzxc 2017-3-15 17:02
34
谢谢分享mark下
wenboly 2017-5-24 16:09
35
谢谢分享
apks 2017-5-24 21:27
36
mark
skyun 2017-8-2 08:56
37
赞赞赞
skyun 2017-8-2 08:56
38
赞赞赞
major啦啦 2017-8-2 09:29
39
阿里就是天真
ddssxk 2017-9-1 17:09
40
发现,跑步起来
xunbu 2017-12-7 17:27
41
编译成功,启动后闪退出错了,求解(dex是否替换成功?)
04-09  09:53:58.419:  I/info(4487):  compare:  i=0  item=0x1e100049
04-09  09:53:58.419:  I/info(4487):  replace:  find  same  replace
04-09  09:53:58.469:  D/dalvikvm(4487):  JIT  code  cache  reset  in  0  ms  (0  bytes  2/0)
04-09  09:53:58.469:  D/dalvikvm(4487):  GC_FOR_ALLOC  freed  293K,  3%  free  17423K/17940K,  paused  13ms,  total  13ms
04-09  09:53:58.489:  I/dalvikvm-heap(4487):  Grow  heap  (frag  case)  to  26.603MB  for  9830416-byte  allocation
04-09  09:53:58.499:  D/dalvikvm(4487):  GC_FOR_ALLOC  freed  1K,  2%  free  27022K/27544K,  paused  11ms,  total  11ms
04-09  09:53:58.549:  D/AndroidRuntime(4487):  Shutting  down  VM
04-09  09:53:58.549:  W/dalvikvm(4487):  threadid=1:  thread  exiting  with  uncaught  exception  (group=0x41fadba8)
04-09  09:53:58.559:  E/AndroidRuntime(4487):  FATAL  EXCEPTION:  main
04-09  09:53:58.559:  E/AndroidRuntime(4487):  Process:  com.example.unpack,  PID:  4487
04-09  09:53:58.559:  E/AndroidRuntime(4487):  java.lang.RuntimeException:  Unable  to  start  activity  ComponentInfo{com.example.unpack/com.ali.tg.testapp.MainActivity}:  java.lang.NullPointerException
xunbu 2017-12-8 17:38
42
需要用样本的资源替换掉工程的资源,ok!
返回