1. 程式人生 > >360加固脫殼過程(老版本和新版本)

360加固脫殼過程(老版本和新版本)

老版本

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 02
U4 codeOff; //指向DexCode結構的偏移
}

struct DexCode {
u2  registersSize;           
u2  insSize;        
u2  outsSize;                
u2  triesSize;               
u4  debugInfoOff;      
u4  insnsSize; //指令集個數以2位元組為單位
u2  insns[1]; //被360加密的指令集
};