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加密的指令集
};

修改之後如下。
這裏寫圖片描述
已經可以正常反編譯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最新虛擬殼脫殼後完全修復詳細解析

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章