360加固脱壳过程(老版本和新版本)

来源:互联网 发布:手机捉鬼软件 编辑:程序博客网 时间:2024/05/01 19:20

老版本

360加固在assets目录下添加了libjiagu.so文件。
这里写图片描述
关键字符串加密的方式为先与5A异或再取反。
这里写图片描述
这里写图片描述
我们把这部分字符串在winhex里面处理一下,据此就可以找到大部分反调试的位置。
这里写图片描述
下面开始动态调试,在linker中下断点,在libjiagu.so加载之前断下调试。
第一处rtld_db_dlactivity反调试(偏移0x51A4):
这里写图片描述
这里写图片描述
将DE 10修改为C0 46过掉第一处反调试。
第二处TracerPid反调试(偏移0x9E08):
这里写图片描述
这里写图片描述
将strtol返回值修改为0过掉第二处反调试。
第三处IDA端口反调试(偏移0x3E6C):
这里写图片描述
这里写图片描述
调试的时候可以换一个端口号,或者修改内存中的值过掉第三处反调试。
第四处文件监控线程反调试(偏移0x4E20,0x4E70,0x4FD4,0x501C):
这里写图片描述
这里写图片描述
总共有四次,全部nop掉过掉第四处反调试。
第五处时间反调试,返回和第一次相同的时间即可。
单步调试过掉前面的反调试之后,在case 33处会调用释放出来的so文件中的JNI_OnLoader函数。这个JNI_OnLoader函数会进行检查当前虚拟机类型和其它参数,并且解密释放出被加壳的dex文件。在内存中解密原dex文件后,Ctrl+S找寻最后一个debug__xxx在Hex View­查看即可看到dex头文件魔数。
这里写图片描述
这里写图片描述
dump出的dex文件如下。
这里写图片描述
用dex2oat的方法也能成功脱壳。
这里写图片描述

新版本

新版本360已经native化原DEX的onCreate中的所有指令了,还用老方法是拿不到onCreate的。运行时有一个函数专门解析每一条DEX指令,通过jni反射执行。
这里写图片描述
如下图所示,onCreate的code_off被改了。
这里写图片描述
我们来说说新版本onCreate的修复。首先编写一个apk,这个apk中包含所有的指令。
这里写图片描述
提交到360加固之后过掉反调试进入第二个so。
这里写图片描述
这里有一个大的switch,在图中所示位置下断点得到的R3是被加密的指令基地址。0x8D3E3CB4处其实就是将key(此处为0xD0)和被加密的指令异或得到switch的分支。dump出的被加密的指令如下(已经和0xD0异或)。
这里写图片描述
比如3B06这条指令,因为我们有未加固的apk,所以我们知道原来是0106(move v6, v0),编写一个简单的程序就可以计算出该指令在second.so中的偏移和switch分支表中的偏移。

// 360calc_switch.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <stdlib.h>int _tmain(int argc, _TCHAR* argv[]){    unsigned char tempa=0x00;    unsigned char tempb=0x00;    unsigned char tempc=0x00;    unsigned char tempd=0x00;unsigned int switch_table[]=//这里是switch table对应的偏移{0x00002e6a,0x00001fea,0x00001286,0x00003ffc,0x00003ede,0x00003458,0x00002ee4,0x000044d2,0x000043e4,0x000021e8,0x0000047a,0x00000f82,0x000005c8,0x00004022,0x00003eb6,0x00003232,0x000038a0,0x000041fe,0x00003a56,0x00000632,0x000036f8,0x0000350c,0x000025e4,0x00002716,0x00003bca,0x0000264a,0x00003cfa,0x000034b4,0x00002848,0x00003f8e,0x00002d2c,0x00003016,0x000044d2,0x00001b12,0x000044d2,0x000044d2,0x0000150a,0x00003e8e,0x00002e00,0x00001982,0x000004f8,0x00004048,0x0000395e,0x000009fc,0x00002e6a,0x0000231a,0x000044d2,0x000011dc,0x000004de,0x00000d70,0x00000436,0x00003c96,0x00002e6a,0x00002cc2,0x0000211c,0x00003488,0x00000bf0,0x00002b1a,0x00000402,0x000032d2,0x0000134e,0x0000049e,0x0000366c,0x000013a2,0x000044d2,0x00002ff2,0x000006be,0x00003350,0x0000122e,0x000044d2,0x000030d6,0x0000424e,0x00001c04,0x00003a18,0x00003732,0x00000604,0x000044d2,0x00001f84,0x000038fc,0x00003428,0x000006a2,0x00000fa6,0x000044d2,0x00003ace,0x00003bee,0x0000324c,0x00003218,0x0000125a,0x0000144a,0x00002e6a,0x00001efc,0x00003d9e,0x00002f08,0x000044d2,0x00002f50,0x000007d6,0x00000f90,0x0000376c,0x000042d0,0x000037ea,0x00002e6a,0x00000840,0x000037a6,0x000044d2,0x00003c56,0x000024b2,0x000012ea,0x00003072,0x00000b3e,0x00003c36,0x0000041a,0x000026b0,0x00003aae,0x000044d2,0x00000f00,0x00003d20,0x000044d2,0x00002a46,0x00003c12,0x000015ca,0x000010fa,0x00000c96,0x0000392a,0x000005aa,0x000029e0,0x00001e4a,0x00002e6a,0x000003fc,0x00002eb6,0x00002b84,0x00000682,0x00001ccc,0x0000359c,0x000028ae,0x00002ab0,0x00001378,0x00004070,0x000042a0,0x000033f8,0x000013cc,0x000044d2,0x000020b6,0x00003b5c,0x0000174a,0x00002e6a,0x00000552,0x00003872,0x00003160,0x00002bee,0x00001420,0x000023e6,0x000027e2,0x00002f6e,0x00001058,0x00001178,0x0000277c,0x0000443c,0x000010aa,0x00000770,0x000018dc,0x0000297a,0x00002050,0x00002e6a,0x0000051c,0x00000d0c,0x000013f6,0x000040ea,0x00001828,0x0000224e,0x000044d2,0x000044d2,0x00002c58,0x000044d2,0x00002d96,0x00002380,0x00004226,0x00000aa6,0x00003e42,0x00000fb8,0x00004410,0x00003278,0x000004ca,0x000040c0,0x00003c76,0x00004160,0x00000fec,0x00002f28,0x000022b4,0x00000534,0x0000399c,0x00003fb0,0x0000131c,0x00002e7e,0x000044d2,0x000043b8,0x000032a4,0x000012b8,0x000031fa,0x00001a4a,0x0000045a,0x00004344,0x000044d2,0x0000427a,0x00001d88,0x0000382e,0x000044d2,0x00004098,0x00002e6a,0x000038ce,0x00003f6c,0x00003554,0x000044d2,0x000044d2,0x00002914,0x00000590,0x000005e0,0x00002f90,0x00003cc8,0x0000244c,0x000044d2,0x000044d2,0x000030f8,0x0000065a,0x00003f4a,0x00003aee,0x000035e0,0x000006e4,0x00002518,0x000044d2,0x000044d2,0x00002e9a,0x00003f28,0x00002e6a,0x00002fcc,0x000041d6,0x00003e1c,0x00000dd4,0x00003e68,0x000044d2,0x000044d2,0x00003f06,0x00002fb2,0x000031d2,0x0000446e,0x0000257e,0x0000168a,0x00002182,0x00000704,0x0000091e,0x000044d2,0x000039da,0x000044a0,0x000034e0,0x00003fd6,0x00000570    };    int switch_base=0x35CCC;    int opcode=0x3b; //这里填写switch之前的opcode,下面得到此case的地址    int i=opcode-1;    int opcode_realaddr=switch_table[i]+switch_base;    printf("addr=0x%x,off=+0x%x\n",opcode_realaddr,switch_table[i]);//ida中opcode的地址    system("PAUSE");    return 0;}

这样我们就可以得到一张表,第一项是opcode,第二项是指令长度,第三项是在second.so中的偏移,第四项是在switch分支表中的偏移,第五项是指令。

0x01,0x02,0x360ce,0x402,"move"……

现在可以随便找一个apk让360加固,过反调试一直运行到第2个so,在偏移地址0x35CA6下断点,得到被加密的抽取指令360jiami_decode,配置decodeopcode.py中switch_table_addr为switch分支表的起始地址,decode_key为异或的key,运行decodeopcode.py就可以得到所有的被抽取的指令了。最后手动将被抽取的指令填回到dex里面去。

Struct DexMethod{U4 methodIdx; U4 accessFlags; //访问标志被360改成了84 02U4 codeOff; //指向DexCode结构的偏移}struct DexCode {u2  registersSize;           u2  insSize;        u2  outsSize;                u2  triesSize;               u4  debugInfoOff;      u4  insnsSize; //指令集个数以2字节为单位u2  insns[1]; //被360加密的指令集};

修改之后如下。
这里写图片描述
已经可以正常反编译onCreate中的代码。
这里写图片描述
这样做优点不言而喻,缺点也明显,性能损耗较严重。目前的现状应该是兼顾二者的妥协结果。
附件
参考资料
1.360加固保关键技术浅析
2.360官网脱壳分析-2017-04-04
3.360官网脱壳分析-2017-06-25
4.Android脱壳圣战-360加固宝加固分析和脱壳教程解析
5.分享一个360加固脱壳模拟器(2017/07/17更新)
6.17年10月30日360最新虚拟壳脱壳后完全修复详细解析

原创粉丝点击