汽车APP产品分析-亿盾加固1
一、前言
二、加固整体构架
三、壳java层分析
四、壳so静态分析
五、壳so动态分析
六、脱壳二次打包
七、总结
一、前言
1.1、app加固的本质
代码安全只是表面,核心是帮助客户满足业务不被阻断、关键数据资产不被窃取的安全需求。因为加固自身不创造价值,加固的价值必须和公司业务挂钩,来间接体现。通过安全体系建立为业务服务保障,增加收益与减少了资损率。
1.2、不同视角看加固
切换立场、改变视角来看APP加固,因为对一件事的不同面,每一面都能看到的不同的东西。
用户视角:更多的是关注功能使用与交互体验,看到的是表现层的功能和交互。所以对于C端用户而言,很难感知其存在价值。
产品视角:关注产品本身体验与价值而考量,看到的是需求、方案、价值。
技术视角:关注技术成本和可扩展性与安全性,看到的是架构、实现、可扩展、安全性。能感知到安全加固的重要性,但是更多的是从技术实现角度出发。
业务视角:保障业务正常运营,看到的是成本和收益。
所以,视角不同,观点不同,加固决策不同,安全程度也不同。
有了上面这些铺垫,接下来你看完文章后大概不会觉得这样的方案很奇怪,这是计划的一部分。
二、加固整体架构
2.1、加固架构
2.2、解壳过程
壳加载运行起来后是解密原始dex与启动加载APP Application过程,完成一系列的工作:
解密原apk的dex集合
使用加密过程中对应的算法进行解密每个dex文件。
将解密之后的dex集合添加到dexElements数组
通过反射将解密的dex集合添加到dexElements数组。
动态加载原apk的Application
原apk的Application在加密过程被替换成解密壳的Application,因此需要在加载壳过程中还原该操作。
三、壳java层分析
3.1、attachBaseContext
so释放与加载在创建APP进程加载Application之前,完成解压缩释放到lib目录、System.loadLibrary("nesec")加载so到内存并在MyJni类中注册了如下几个jni方法:
public static native void cp(); public static native void d(String arg0); public static native void e(String arg0); public static native boolean load(Application arg0, String arg1); public static native boolean load2(Application arg0, String arg1); public static native boolean run(Context arg0, Application arg1);
3.2、native load 加载dex
加载完so后调用注册好的native方法load解密dex并加载到内内存,dex加载的过程大到为dex文件解密及将解密的dex集合添加到dexElements数组。
3.3、原Application
加载完dex后要从原APP的Application运行,代码如下:
public static String strAppName; static { MyApplication.TAG = "wrapper"; MyApplication.strAppName = "com.netease.nis.wrapper.MyApplication"; MyApplication.a = null; MyApplication.b = null; MyApplication.newApp = null; MyApplication.mOfficial = true; } private static Application a(Context arg2) { try { if(MyApplication.newApp != null || MyApplication.strAppName.compareTo("") == 0) { return MyApplication.newApp; } ClassLoader v0_1 = arg2.getClassLoader(); if(v0_1 == null) { return MyApplication.newApp; } Class v0_2 = v0_1.loadClass(MyApplication.strAppName); if(v0_2 != null) { MyApplication.newApp = (Application)v0_2.newInstance(); return MyApplication.newApp; } } catch(Exception v0) { v0.toString(); return MyApplication.newApp; } return MyApplication.newApp; }
通过动态加载原app的Application并执行,具体流程如下:
(1)通过Class.newInstance()创建一个Application实例;
(2)执行Application实例的attach();
Application v0_7 = MyApplication.a(arg13); MyApplication.newApp = v0_7; if(v0_7 != null) { Method v0_8 = Application.class.getDeclaredMethod("attach", Context.class); if(v0_8 != null) { v0_8.setAccessible(true); try { v0_8.invoke(MyApplication.newApp, arg13); goto label_224; } catch(InvocationTargetException v0_9) { } new StringBuilder("[attachBaseContext] InvocationTargetException:").append(v0_9); goto label_204; } }
四、壳so静态分析
4.1、壳入口隐藏
按照我个人惯例,定位到壳so模块后首先使用ida加载模块静态分析收集下信息(字符串,壳入口、导出方法)等,用ida打开后直接提示如图4-1所示:
图4-1
不用奇怪,这是节信息被处理过了,防止静态反编译,点击ok继续,查看导出函数时发现一堆乱码,如图4-2所示:
图4-2
应该是被加密处理了,查看节信息也找不到init_array节,如图4-3所示:
图4-3
静态不好定位就动态定位壳入口,在内存中一切的隐藏都很难跳系统机制。
五、壳so动态分析
5.1、壳入口定位
根据linker加载so流程中主要有两个点可以做为壳入口,init或init_array是so程序代码可以执行的最早的时机, 然后才加载Jni_onload,只要在linker执行init进下断点就可以定位壳入口。如图5-1所示:
图5-1
定位到的init_array方法中有几个关键的地方,init_array3,解密Jni_OnLoad代码。如图5-2所示:
图5-2
.note.gnu.text:000000782421DFD0 dec_sub_7D26D97FD0 ; CODE XREF: dec_sub_7D26D98040+50↓p .note.gnu.text:000000782421DFD0 62 03 00 B4 CBZ X2, locret_782421E03C .note.gnu.text:000000782421DFD0 .note.gnu.text:000000782421DFD4 05 00 80 52 MOV W5, #0 .note.gnu.text:000000782421DFD8 22 00 02 8B ADD X2, X1, X2 .note.gnu.text:000000782421DFDC E6 03 05 2A MOV W6, W5 .note.gnu.text:000000782421DFDC .note.gnu.text:000000782421DFE0 .note.gnu.text:000000782421DFE0 loc_782421DFE0 ; CODE XREF: dec_sub_7D26D97FD0+68↓j .note.gnu.text:000000782421DFE0 C6 04 00 11 ADD W6, W6, #1 .note.gnu.text:000000782421DFE4 C6 1C 00 12 AND W6, W6, #0xFF .note.gnu.text:000000782421DFE8 C4 7C 40 93 SXTW X4, W6 .note.gnu.text:000000782421DFEC 03 68 64 38 LDRB W3, [X0,X4] .note.gnu.text:000000782421DFF0 65 00 05 0B ADD W5, W3, W5 .note.gnu.text:000000782421DFF4 A5 1C 00 12 AND W5, W5, #0xFF .note.gnu.text:000000782421DFF8 A7 7C 40 93 SXTW X7, W5 .note.gnu.text:000000782421DFFC 08 68 67 38 LDRB W8, [X0,X7] .note.gnu.text:000000782421E000 08 68 24 38 STRB W8, [X0,X4] .note.gnu.text:000000782421E004 03 68 27 38 STRB W3, [X0,X7] .note.gnu.text:000000782421E008 04 68 64 38 LDRB W4, [X0,X4] .note.gnu.text:000000782421E00C 27 00 40 39 LDRB W7, [X1] .note.gnu.text:000000782421E010 64 00 04 0B ADD W4, W3, W4 .note.gnu.text:000000782421E014 84 1C 00 53 UXTB W4, W4 .note.gnu.text:000000782421E018 03 68 64 38 LDRB W3, [X0,X4] .note.gnu.text:000000782421E01C 64 7C 02 53 LSR W4, W3, #2 .note.gnu.text:000000782421E020 83 18 03 2A ORR W3, W4, W3,LSL#6 .note.gnu.text:000000782421E024 63 1C 00 53 UXTB W3, W3 .note.gnu.text:000000782421E028 63 E8 00 11 ADD W3, W3, #0x3A ; ':' .note.gnu.text:000000782421E02C 63 00 07 4A EOR W3, W3, W7 .note.gnu.text:000000782421E030 23 14 00 38 STRB W3, [X1],#1 .note.gnu.text:000000782421E034 3F 00 02 EB CMP X1, X2 .note.gnu.text:000000782421E038 41 FD FF 54 B.NE loc_782421DFE0
5.2、运行时加解密技术
运行时解密,运行后加密:
.note.gnu.text:00000071554361D4 decCode_loc_71F33B41D4 .note.gnu.text:00000071554361D4 E4 2F 40 F9 LDR X4, [SP,#arg_58] .note.gnu.text:00000071554361D8 44 0D 00 B4 CBZ X4, loc_7155436380 .note.gnu.text:00000071554361D8 .note.gnu.text:00000071554361DC 80 40 00 D1 SUB X0, X4, #0x10 .note.gnu.text:00000071554361E0 81 04 00 D1 SUB X1, X4, #1 .note.gnu.text:00000071554361E4 00 FC 44 D3 LSR X0, X0, #4 .note.gnu.text:00000071554361E8 3F 38 00 F1 CMP X1, #0xE .note.gnu.text:00000071554361EC 00 04 00 91 ADD X0, X0, #1 .note.gnu.text:00000071554361F0 02 EC 7C D3 LSL X2, X0, #4 .note.gnu.text:00000071554361F4 29 17 00 54 B.LS loc_71554364D8 .note.gnu.text:00000071554361F4 .note.gnu.text:00000071554361F8 E1 0E 01 4E DUP V1.16B, W23 .note.gnu.text:00000071554361FC E3 03 13 AA MOV X3, X19 .note.gnu.text:0000007155436200 01 00 80 D2 MOV X1, #0 .note.gnu.text:0000007155436200 .note.gnu.text:0000007155436204 .note.gnu.text:0000007155436204 Dec_Enc_Code_loc_71F33B4204 .note.gnu.text:0000007155436204 60 00 C0 3D LDR Q0, [X3] .note.gnu.text:0000007155436208 21 04 00 91 ADD X1, X1, #1 .note.gnu.text:000000715543620C 1F 00 01 EB CMP X0, X1 .note.gnu.text:0000007155436210 00 1C 21 6E EOR V0.16B, V0.16B, V1.16B .note.gnu.text:0000007155436214 60 04 81 3C STR Q0, [X3],#0x10 .note.gnu.text:0000007155436218 68 FF FF 54 B.HI Dec_Enc_Code_loc_71F33B4204 .note.gnu.text:0000007155436218 .note.gnu.text:000000715543621C 9F 00 02 EB CMP X4, X2 .note.gnu.text:0000007155436220 00 0B 00 54 B.EQ loc_7155436380 .note.gnu.text:0000007155436220 .note.gnu.text:0000007155436224 .note.gnu.text:0000007155436224 loc_7155436224 .note.gnu.text:0000007155436224 61 6A 62 38 LDRB W1, [X19,X2] .note.gnu.text:0000007155436228 40 04 00 91 ADD X0, X2, #1 .note.gnu.text:000000715543622C 9F 00 00 EB CMP X4, X0 .note.gnu.text:0000007155436230 E1 02 01 4A EOR W1, W23, W1 .note.gnu.text:0000007155436234 61 6A 22 38 STRB W1, [X19,X2] .note.gnu.text:0000007155436238 49 0A 00 54 B.LS loc_7155436380 .note.gnu.text:0000007155436238 .note.gnu.text:000000715543623C 63 6A 60 38 LDRB W3, [X19,X0] .note.gnu.text:0000007155436240 41 08 00 91 ADD X1, X2, #2 .note.gnu.text:0000007155436244 3F 00 04 EB CMP X1, X4 .note.gnu.text:0000007155436248 E3 02 03 4A EOR W3, W23, W3 .note.gnu.text:000000715543624C 63 6A 20 38 STRB W3, [X19,X0] .note.gnu.text:0000007155436250 82 09 00 54 B.CS loc_7155436380 .note.gnu.text:0000007155436250 .note.gnu.text:0000007155436254 63 6A 61 38 LDRB W3, [X19,X1] .note.gnu.text:0000007155436258 40 0C 00 91 ADD X0, X2, #3 .note.gnu.text:000000715543625C 1F 00 04 EB CMP X0, X4 .note.gnu.text:0000007155436260 E3 02 03 4A EOR W3, W23, W3 .note.gnu.text:0000007155436264 63 6A 21 38 STRB W3, [X19,X1] .note.gnu.text:0000007155436268 C2 08 00 54 B.CS loc_7155436380 .note.gnu.text:0000007155436268 .note.gnu.text:000000715543626C 63 6A 60 38 LDRB W3, [X19,X0] .note.gnu.text:0000007155436270 41 10 00 91 ADD X1, X2, #4 .note.gnu.text:0000007155436274 9F 00 01 EB CMP X4, X1 .note.gnu.text:0000007155436278 E3 02 03 4A EOR W3, W23, W3 .note.gnu.text:000000715543627C 63 6A 20 38 STRB W3, [X19,X0] .note.gnu.text:0000007155436280 09 08 00 54 B.LS loc_7155436380
执行到代码时解密,执行后加密回去,可以防止静态分析或内存dump。
5.3、linker加载填充方法
解密字符串表:
解析elf定位到加密后字符串且,解密后如图5-3所示:
图5-3
解密算法相对简单,就是异或算法
.note.gnu.text:0000007155463288 DecSecString_sub_71F336D288 .note.gnu.text:0000007155463288 45 04 00 35 CBNZ W5, loc_7155463310 .note.gnu.text:0000007155463288 .note.gnu.text:000000715546328C 64 01 00 34 CBZ W4, loc_71554632B8 .note.gnu.text:000000715546328C .note.gnu.text:0000007155463290 47 68 84 52 MOV W7, #0x2342 .note.gnu.text:0000007155463294 05 00 80 D2 MOV X5, #0 .note.gnu.text:0000007155463298 27 C6 AA 72 MOVK W7, #0x5631,LSL#16 .note.gnu.text:0000007155463298 .note.gnu.text:000000715546329C .note.gnu.text:000000715546329C DecString_loc_71F336D29C .note.gnu.text:000000715546329C 66 68 65 B8 LDR W6, [X3,X5] .note.gnu.text:00000071554632A0 C6 00 07 4A EOR W6, W6, W7 .note.gnu.text:00000071554632A4 E7 00 05 0B ADD W7, W7, W5 .note.gnu.text:00000071554632A8 66 68 25 B8 STR W6, [X3,X5] .note.gnu.text:00000071554632AC A5 10 00 91 ADD X5, X5, #4 .note.gnu.text:00000071554632B0 9F 00 05 6B CMP W4, W5 .note.gnu.text:00000071554632B4 48 FF FF 54 B.HI DecString_loc_71F336D29C .note.gnu.text:00000071554632B4 .note.gnu.text:00000071554632B8 .note.gnu.text:00000071554632B8 loc_71554632B8 .note.gnu.text:00000071554632B8 E3 03 01 2A MOV W3, W1 .note.gnu.text:00000071554632BC 3F 00 02 6B CMP W1, W2 .note.gnu.text:00000071554632C0 63 04 03 8B ADD X3, X3, X3,LSL#1 .note.gnu.text:00000071554632C4 00 0C 03 8B ADD X0, X0, X3,LSL#3 .note.gnu.text:00000071554632C8 42 02 00 54 B.CS loc_7155463310 .note.gnu.text:00000071554632C8 .note.gnu.text:00000071554632CC 43 04 00 51 SUB W3, W2, #1 .note.gnu.text:00000071554632D0 25 44 05 11 ADD W5, W1, #0x151 .note.gnu.text:00000071554632D4 63 00 01 4B SUB W3, W3, W1 .note.gnu.text:00000071554632D8 21 6C 05 11 ADD W1, W1, #0x15B .note.gnu.text:00000071554632DC 63 04 00 91 ADD X3, X3, #1 .note.gnu.text:00000071554632E0 63 04 03 8B ADD X3, X3, X3,LSL#1 .note.gnu.text:00000071554632E4 03 0C 03 8B ADD X3, X0, X3,LSL#3
解密指令:
像是魔改后的rc4算法。
.note.gnu.text:0000007155462040 dec_sub_7D26D98040 ; CODE XREF: Dec_sub_71F336C13C+13C↓p .note.gnu.text:0000007155462040 ; Dec_sub_71F336C13C+1CC↓p .note.gnu.text:0000007155462040 ; Dec_sub_71F336C13C+284↓p .note.gnu.text:0000007155462040 .note.gnu.text:0000007155462040 var_150= -0x150 .note.gnu.text:0000007155462040 var_140= -0x140 .note.gnu.text:0000007155462040 var_130= -0x130 .note.gnu.text:0000007155462040 var_114= -0x114 .note.gnu.text:0000007155462040 var_108= -0x108 .note.gnu.text:0000007155462040 var_8= -8 .note.gnu.text:0000007155462040 .note.gnu.text:0000007155462040 FF 43 05 D1 SUB SP, SP, #0x150 .note.gnu.text:0000007155462044 E3 F3 00 91 ADD X3, SP, #0x150+var_114 .note.gnu.text:0000007155462048 F3 53 00 A9 STP X19, X20, [SP,#0x150+var_150] .note.gnu.text:000000715546204C D3 01 00 D0 ADRP X19, #off_715549CF00@PAGE .note.gnu.text:0000007155462050 FE 13 00 F9 STR X30, [SP,#0x150+var_130] .note.gnu.text:0000007155462054 F5 5B 01 A9 STP X21, X22, [SP,#0x150+var_140] .note.gnu.text:0000007155462058 F4 23 01 91 ADD X20, SP, #0x150+var_108 .note.gnu.text:000000715546205C F5 03 01 AA MOV X21, X1 .note.gnu.text:0000007155462060 73 82 47 F9 LDR X19, [X19,#off_715549CF00@PAGEOFF] .note.gnu.text:0000007155462064 E1 03 03 AA MOV X1, X3 .note.gnu.text:0000007155462068 F6 03 00 AA MOV X22, X0 .note.gnu.text:000000715546206C E2 3F 00 B9 STR W2, [SP,#0x150+var_114] .note.gnu.text:0000007155462070 E0 03 14 AA MOV X0, X20 .note.gnu.text:0000007155462074 82 00 80 D2 MOV X2, #4 .note.gnu.text:0000007155462078 63 02 40 F9 LDR X3, [X19] .note.gnu.text:000000715546207C E3 A7 00 F9 STR X3, [SP,#0x150+var_8] .note.gnu.text:0000007155462080 40 FF FF 97 BL initkey_sub_7D26D97D80 .note.gnu.text:0000007155462080 .note.gnu.text:0000007155462084 E0 03 14 AA MOV X0, X20 .note.gnu.text:0000007155462088 E1 03 16 AA MOV X1, X22 .note.gnu.text:000000715546208C E2 03 15 AA MOV X2, X21 .note.gnu.text:0000007155462090 D0 FF FF 97 BL dec_sub_7D26D97FD0 .note.gnu.text:0000007155462090 .note.gnu.text:0000007155462094 E1 A7 40 F9 LDR X1, [SP,#0x150+var_8] .note.gnu.text:0000007155462098 60 02 40 F9 LDR X0, [X19] .note.gnu.text:000000715546209C 3F 00 00 EB CMP X1, X0 .note.gnu.text:00000071554620A0 C1 00 00 54 B.NE loc_71554620B8 .note.gnu.text:00000071554620A0 .note.gnu.text:00000071554620A4 F3 53 40 A9 LDP X19, X20, [SP,#0x150+var_150] .note.gnu.text:00000071554620A8 F5 5B 41 A9 LDP X21, X22, [SP,#0x150+var_140] .note.gnu.text:00000071554620AC FE 13 40 F9 LDR X30, [SP,#0x150+var_130] .note.gnu.text:00000071554620B0 FF 43 05 91 ADD SP, SP, #0x150 .note.gnu.text:00000071554620B4 C0 03 5F D6 RET .note.gnu.text:0000007155461FD0 .note.gnu.text:0000007155461FD0 dec_sub_7D26D97FD0 ; CODE XREF: dec_sub_7D26D98040+50↓p .note.gnu.text:0000007155461FD0 62 03 00 B4 CBZ X2, locret_715546203C .note.gnu.text:0000007155461FD0 .note.gnu.text:0000007155461FD4 05 00 80 52 MOV W5, #0 .note.gnu.text:0000007155461FD8 22 00 02 8B ADD X2, X1, X2 .note.gnu.text:0000007155461FDC E6 03 05 2A MOV W6, W5 .note.gnu.text:0000007155461FDC .note.gnu.text:0000007155461FE0 .note.gnu.text:0000007155461FE0 loc_7155461FE0 ; CODE XREF: dec_sub_7D26D97FD0+68↓j .note.gnu.text:0000007155461FE0 C6 04 00 11 ADD W6, W6, #1 .note.gnu.text:0000007155461FE4 C6 1C 00 12 AND W6, W6, #0xFF .note.gnu.text:0000007155461FE8 C4 7C 40 93 SXTW X4, W6 .note.gnu.text:0000007155461FEC 03 68 64 38 LDRB W3, [X0,X4] .note.gnu.text:0000007155461FF0 65 00 05 0B ADD W5, W3, W5 .note.gnu.text:0000007155461FF4 A5 1C 00 12 AND W5, W5, #0xFF .note.gnu.text:0000007155461FF8 A7 7C 40 93 SXTW X7, W5 .note.gnu.text:0000007155461FFC 08 68 67 38 LDRB W8, [X0,X7] .note.gnu.text:0000007155462000 08 68 24 38 STRB W8, [X0,X4] .note.gnu.text:0000007155462004 03 68 27 38 STRB W3, [X0,X7] .note.gnu.text:0000007155462008 04 68 64 38 LDRB W4, [X0,X4] .note.gnu.text:000000715546200C 27 00 40 39 LDRB W7, [X1] .note.gnu.text:0000007155462010 64 00 04 0B ADD W4, W3, W4 .note.gnu.text:0000007155462014 84 1C 00 53 UXTB W4, W4 .note.gnu.text:0000007155462018 03 68 64 38 LDRB W3, [X0,X4] .note.gnu.text:000000715546201C 64 7C 02 53 LSR W4, W3, #2 .note.gnu.text:0000007155462020 83 18 03 2A ORR W3, W4, W3,LSL#6 .note.gnu.text:0000007155462024 63 1C 00 53 UXTB W3, W3 .note.gnu.text:0000007155462028 63 E8 00 11 ADD W3, W3, #0x3A ; ':' .note.gnu.text:000000715546202C 63 00 07 4A EOR W3, W3, W7 .note.gnu.text:0000007155462030 23 14 00 38 STRB W3, [X1],#1 .note.gnu.text:0000007155462034 3F 00 02 EB CMP X1, X2 .note.gnu.text:0000007155462038 41 FD FF 54 B.NE loc_7155461FE0 .note.gnu.text:0000007155462038 .note.gnu.text:000000715546203C .note.gnu.text:000000715546203C locret_715546203C ; CODE XREF: dec_sub_7D26D97FD0↑j .note.gnu.text:000000715546203C C0 03 5F D6 RET
填充指令:
解析ELF头,获取到Load so所需要的节,mmap映射到内存中,抹掉elf头信息,mprotect修改内存的读写权限。具填充代码如下:
.note.gnu.text:0000007155462F60 .note.gnu.text:0000007155462F60 ; 填充指令 .note.gnu.text:0000007155462F60 .note.gnu.text:0000007155462F60 mmap_so_memcpy_code_sub_71F336CF60 .note.gnu.text:0000007155462F60 .note.gnu.text:0000007155462F60 var_90= -0x90 .note.gnu.text:0000007155462F60 var_80= -0x80 .note.gnu.text:0000007155462F60 var_70= -0x70 .note.gnu.text:0000007155462F60 var_60= -0x60 .note.gnu.text:0000007155462F60 var_50= -0x50 .note.gnu.text:0000007155462F60 var_40= -0x40 .note.gnu.text:0000007155462F60 var_38= -0x38 .note.gnu.text:0000007155462F60 var_28= -0x28 .note.gnu.text:0000007155462F60 var_10= -0x10 .note.gnu.text:0000007155462F60 var_8= -8 .note.gnu.text:0000007155462F60 .note.gnu.text:0000007155462F60 FF 43 02 D1 SUB SP, SP, #0x90 .note.gnu.text:0000007155462F64 EA AF 06 6D STP D10, D11, [SP,#0x90+var_28] .note.gnu.text:0000007155462F68 E8 A7 05 6D STP D8, D9, [SP,#0x90+var_38] .note.gnu.text:0000007155462F6C FB 73 04 A9 STP X27, X28, [SP,#0x90+var_50] .note.gnu.text:0000007155462F70 FC 03 00 AA MOV X28, X0 .note.gnu.text:0000007155462F74 FE 2B 00 F9 STR X30, [SP,#0x90+var_40] .note.gnu.text:0000007155462F78 F3 53 00 A9 STP X19, X20, [SP,#0x90+var_90] .note.gnu.text:0000007155462F7C F5 5B 01 A9 STP X21, X22, [SP,#0x90+var_80] .note.gnu.text:0000007155462F80 F7 63 02 A9 STP X23, X24, [SP,#0x90+var_70] .note.gnu.text:0000007155462F84 F9 6B 03 A9 STP X25, X26, [SP,#0x90+var_60] .note.gnu.text:0000007155462F88 13 00 80 D2 MOV X19, #0 .note.gnu.text:0000007155462F8C 81 43 40 F9 LDR X1, [X28,#0x80] .note.gnu.text:0000007155462F90 F5 03 13 AA MOV X21, X19 .note.gnu.text:0000007155462F94 00 04 40 F9 LDR X0, [X0,#8] .note.gnu.text:0000007155462F98 E2 03 01 AA MOV X2, X1 .note.gnu.text:0000007155462F9C 2B 00 67 9E FMOV D11, X1 .note.gnu.text:0000007155462FA0 01 70 40 79 LDRH W1, [X0,#0x38] .note.gnu.text:0000007155462FA4 41 70 00 79 STRH W1, [X2,#0x38] .note.gnu.text:0000007155462FA8 01 08 80 D2 MOV X1, #0x40 ; '@' .note.gnu.text:0000007155462FAC 41 10 00 F9 STR X1, [X2,#0x20] .note.gnu.text:0000007155462FB0 02 70 40 79 LDRH W2, [X0,#0x38] .note.gnu.text:0000007155462FB4 81 07 40 F9 LDR X1, [X28,#8] .note.gnu.text:0000007155462FB8 80 43 40 F9 LDR X0, [X28,#0x80] .note.gnu.text:0000007155462FBC 43 E4 7A D3 LSL X3, X2, #6 .note.gnu.text:0000007155462FC0 62 0C 02 CB SUB X2, X3, X2,LSL#3 .note.gnu.text:0000007155462FC4 21 00 01 91 ADD X1, X1, #0x40 ; '@' .note.gnu.text:0000007155462FC8 00 00 01 91 ADD X0, X0, #0x40 ; '@' .note.gnu.text:0000007155462FCC 91 F7 FF 97 BL memcpy_1 .note.gnu.text:0000007155462FCC .note.gnu.text:0000007155462FD0 C0 0A 00 94 BL fopen_maps_sub_71F336FAD0 .note.gnu.text:0000007155462FD0 .note.gnu.text:0000007155462FD4 09 00 27 1E FMOV S9, W0 .note.gnu.text:0000007155462FD8 E1 03 13 AA MOV X1, X19 .note.gnu.text:0000007155462FDC 42 00 80 52 MOV W2, #2 .note.gnu.text:0000007155462FE0 10 F7 FF 97 BL lseek_0 .note.gnu.text:0000007155462FE0 .note.gnu.text:0000007155462FE4 0A 00 67 9E FMOV D10, X0 .note.gnu.text:0000007155462FE8 80 0F 40 F9 LDR X0, [X28,#0x18] .note.gnu.text:0000007155462FEC C0 00 00 B5 CBNZ X0, loc_7155463004 .note.gnu.text:0000007155462FEC .note.gnu.text:0000007155462FF0 4D 00 00 14 B loc_7155463124 .note.gnu.text:0000007155462FF0 .note.gnu.text:0000007155462FF4 .note.gnu.text:0000007155462FF4 loc_7155462FF4 .note.gnu.text:0000007155462FF4 B5 06 00 91 ADD X21, X21, #1 .note.gnu.text:0000007155462FF8 73 E2 00 91 ADD X19, X19, #0x38 ; '8' .note.gnu.text:0000007155462FFC 1F 00 15 EB CMP X0, X21 ; 判断是否结束 .note.gnu.text:0000007155463000 29 09 00 54 B.LS loc_7155463124 .note.gnu.text:0000007155463000 .note.gnu.text:0000007155463004 .note.gnu.text:0000007155463004 loc_7155463004 .note.gnu.text:0000007155463004 .note.gnu.text:0000007155463004 81 17 40 F9 LDR X1, [X28,#0x28] .note.gnu.text:0000007155463008 36 00 13 8B ADD X22, X1, X19 .note.gnu.text:000000715546300C 21 68 73 B8 LDR W1, [X1,X19] .note.gnu.text:0000007155463010 3F 04 00 71 CMP W1, #1 .note.gnu.text:0000007155463014 01 FF FF 54 B.NE loc_7155462FF4 .note.gnu.text:0000007155463014 .note.gnu.text:0000007155463018 C0 0A 40 F9 LDR X0, [X22,#0x10] .note.gnu.text:000000715546301C 84 03 40 F9 LDR X4, [X28] .note.gnu.text:0000007155463020 D4 16 40 F9 LDR X20, [X22,#0x28] .note.gnu.text:0000007155463024 98 00 00 8B ADD X24, X4, X0 .note.gnu.text:0000007155463028 C0 06 40 F9 LDR X0, [X22,#8] .note.gnu.text:000000715546302C 94 FE 3F 91 ADD X20, X20, #0xFFF .note.gnu.text:0000007155463030 1A CF 74 92 AND X26, X24, #0xFFFFFFFFFFFFF000 .note.gnu.text:0000007155463034 94 02 18 8B ADD X20, X20, X24 .note.gnu.text:0000007155463038 D9 12 40 F9 LDR X25, [X22,#0x20] .note.gnu.text:000000715546303C 94 CE 74 92 AND X20, X20, #0xFFFFFFFFFFFFF000 .note.gnu.text:0000007155463040 5F 03 14 EB CMP X26, X20 .note.gnu.text:0000007155463044 17 03 19 8B ADD X23, X24, X25 .note.gnu.text:0000007155463048 08 00 67 9E FMOV D8, X0 .note.gnu.text:000000715546304C C3 08 00 54 B.CC loc_7155463164 .note.gnu.text:000000715546304C .note.gnu.text:0000007155463050 .note.gnu.text:0000007155463050 loc_7155463050 .note.gnu.text:0000007155463050 C0 01 00 B0 ADRP X0, #off_715549CFD0@PAGE .note.gnu.text:0000007155463054 9B 02 1A CB SUB X27, X20, X26 .note.gnu.text:0000007155463058 E1 03 1B AA MOV X1, X27 .note.gnu.text:000000715546305C 02 E8 47 F9 LDR X2, [X0,#off_715549CFD0@PAGEOFF] .note.gnu.text:0000007155463060 C0 01 00 B0 ADRP X0, #off_715549CFE0@PAGE .note.gnu.text:0000007155463064 03 F0 47 F9 LDR X3, [X0,#off_715549CFE0@PAGEOFF] .note.gnu.text:0000007155463068 E0 03 1A AA MOV X0, X26 .note.gnu.text:000000715546306C 42 00 40 B9 LDR W2, [X2] .note.gnu.text:0000007155463070 E3 47 00 F9 STR X3, [SP,#0x90+var_8] .note.gnu.text:0000007155463074 68 08 40 F9 LDR X8, [X3,#(qword_715530E800+8 - 0x715530E7F8)] .note.gnu.text:0000007155463078 42 04 00 32 ORR W2, W2, #3 .note.gnu.text:000000715546307C 00 01 3F D6 BLR X8 ; mprotect .note.gnu.text:000000715546307C .note.gnu.text:0000007155463080 E8 03 00 2A MOV W8, W0 .note.gnu.text:0000007155463084 61 17 80 52 MOV W1, #0xBB .note.gnu.text:0000007155463088 E0 03 1A AA MOV X0, X26 .note.gnu.text:000000715546308C E2 03 1B AA MOV X2, X27 .note.gnu.text:0000007155463090 E8 43 00 F9 STR X8, [SP,#0x90+var_10] .note.gnu.text:0000007155463094 EF F6 FF 97 BL memset_0 ; 用BB填充ELF头 .note.gnu.text:0000007155463094 .note.gnu.text:0000007155463098 E8 43 40 F9 LDR X8, [SP,#0x90+var_10] .note.gnu.text:000000715546309C E3 47 40 F9 LDR X3, [SP,#0x90+var_8] .note.gnu.text:00000071554630A0 1F 05 00 31 CMN W8, #1 .note.gnu.text:00000071554630A4 40 0B 00 54 B.EQ loc_715546320C .note.gnu.text:00000071554630A4 .note.gnu.text:00000071554630A8 B9 06 00 B5 CBNZ X25, loc_715546317C .note.gnu.text:00000071554630A8 .note.gnu.text:00000071554630AC .note.gnu.text:00000071554630AC loc_71554630AC .note.gnu.text:00000071554630AC C0 06 40 B9 LDR W0, [X22,#4] .note.gnu.text:00000071554630B0 60 00 08 36 TBZ W0, #1, loc_71554630BC .note.gnu.text:00000071554630B0 .note.gnu.text:00000071554630B4 E2 2E 40 F2 ANDS X2, X23, #0xFFF .note.gnu.text:00000071554630B8 81 09 00 54 B.NE loc_71554631E8 .note.gnu.text:00000071554630B8 .note.gnu.text:00000071554630BC .note.gnu.text:00000071554630BC loc_71554630BC .note.gnu.text:00000071554630BC .note.gnu.text:00000071554630BC F7 FE 3F 91 ADD X23, X23, #0xFFF .note.gnu.text:00000071554630C0 F7 CE 74 92 AND X23, X23, #0xFFFFFFFFFFFFF000 .note.gnu.text:00000071554630C4 9F 02 17 EB CMP X20, X23 .note.gnu.text:00000071554630C8 A8 06 00 54 B.HI mmap_loc_71F336D19C .note.gnu.text:00000071554630C8 .note.gnu.text:00000071554630CC .note.gnu.text:00000071554630CC loc_71554630CC .note.gnu.text:00000071554630CC C1 01 00 B0 ADRP X1, #off_715549CFE0@PAGE .note.gnu.text:00000071554630D0 C3 06 40 B9 LDR W3, [X22,#4] .note.gnu.text:00000071554630D4 E0 03 1A AA MOV X0, X26 .note.gnu.text:00000071554630D8 62 00 00 12 AND W2, W3, #1 .note.gnu.text:00000071554630DC 65 08 42 D3 UBFX X5, X3, #2, #1 .note.gnu.text:00000071554630E0 24 F0 47 F9 LDR X4, [X1,#off_715549CFE0@PAGEOFF] .note.gnu.text:00000071554630E4 5F 00 1F 6B CMP W2, WZR .note.gnu.text:00000071554630E8 63 00 1F 12 AND W3, W3, #2 .note.gnu.text:00000071554630EC 82 00 80 52 MOV W2, #4 .note.gnu.text:00000071554630F0 42 10 9F 1A CSEL W2, W2, WZR, NE .note.gnu.text:00000071554630F4 A3 00 03 2A ORR W3, W5, W3 .note.gnu.text:00000071554630F8 84 08 40 F9 LDR X4, [X4,#(qword_715530E800+8 - 0x715530E7F8)] .note.gnu.text:00000071554630FC E1 03 1B AA MOV X1, X27 .note.gnu.text:0000007155463100 62 00 02 2A ORR W2, W3, W2 .note.gnu.text:0000007155463104 80 00 3F D6 BLR X4 ; mprotect .note.gnu.text:0000007155463104 .note.gnu.text:0000007155463108 1F 04 00 31 CMN W0, #1 .note.gnu.text:000000715546310C 00 08 00 54 B.EQ loc_715546320C .note.gnu.text:000000715546310C .note.gnu.text:0000007155463110 80 0F 40 F9 LDR X0, [X28,#0x18] .note.gnu.text:0000007155463114 B5 06 00 91 ADD X21, X21, #1 .note.gnu.text:0000007155463118 73 E2 00 91 ADD X19, X19, #0x38 ; '8' .note.gnu.text:000000715546311C 1F 00 15 EB CMP X0, X21 .note.gnu.text:0000007155463120 28 F7 FF 54 B.HI loc_7155463004 .note.gnu.text:0000007155463120 .note.gnu.text:0000007155463124 .note.gnu.text:0000007155463124 loc_7155463124 .note.gnu.text:0000007155463124 .note.gnu.text:0000007155463124 20 01 26 1E FMOV W0, S9 .note.gnu.text:0000007155463128 1F 00 1F 6B CMP W0, WZR .note.gnu.text:000000715546312C 6D 00 00 54 B.LE loc_7155463138 .note.gnu.text:000000715546312C .note.gnu.text:0000007155463130 20 01 26 1E FMOV W0, S9 .note.gnu.text:0000007155463134 FB F6 FF 97 BL close_0 .note.gnu.text:0000007155463134 .note.gnu.text:0000007155463138 .note.gnu.text:0000007155463138 loc_7155463138 .note.gnu.text:0000007155463138 20 00 80 52 MOV W0, #1 .note.gnu.text:0000007155463138 .note.gnu.text:000000715546313C .note.gnu.text:000000715546313C loc_715546313C .note.gnu.text:000000715546313C F3 53 40 A9 LDP X19, X20, [SP,#0x90+var_90] .note.gnu.text:0000007155463140 E8 A7 45 6D LDP D8, D9, [SP,#0x90+var_38] .note.gnu.text:0000007155463144 F5 5B 41 A9 LDP X21, X22, [SP,#0x90+var_80] .note.gnu.text:0000007155463148 EA AF 46 6D LDP D10, D11, [SP,#0x90+var_28] .note.gnu.text:000000715546314C F7 63 42 A9 LDP X23, X24, [SP,#0x90+var_70] .note.gnu.text:0000007155463150 F9 6B 43 A9 LDP X25, X26, [SP,#0x90+var_60] .note.gnu.text:0000007155463154 FB 73 44 A9 LDP X27, X28, [SP,#0x90+var_50] .note.gnu.text:0000007155463158 FE 2B 40 F9 LDR X30, [SP,#0x90+var_40] .note.gnu.text:000000715546315C FF 43 02 91 ADD SP, SP, #0x90 .note.gnu.text:0000007155463160 C0 03 5F D6 RET
这样做的一个好处就是防止从内存中直接反elf dump出来。以上流程都是在init_array中完成,接下来是执行JNI_OnLoad方法。
5.4、JNI_OnLoad定位
虽然代码己经解密并填充,但是导出函数还是不能看到,所以还是需要借肋系统机制定位Jni_OnLoad方法。
分析LoadNativeLibrary流程,执行到到_ZN3art9JavaVMExt17LoadNativeLibraryEP7_JNIEnvRKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEP8_jobjectP7_jclassPS9_方法,这个方法中会调用_ZN3art13SharedLibrary29FindSymbolWithoutNativeBridgeERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE,方法直接返回JNI_OnLoad地址。
5.5、反调式
查找是否有android_server运行
.note.gnu.proc:00000071553D11B4 40 01 89 9A CSEL X0, X10, X9, EQ .note.gnu.proc:00000071553D11B4 .note.gnu.proc:00000071553D11B8 ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553D11B8 B2 CD 02 94 BL opendir ; /proc/ .note.gnu.proc:00000071553D11B8 .note.gnu.proc:00000071553D11BC ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553D11BC 60 0A 00 B4 CBZ X0, loc_71553D1308 .note.gnu.proc:00000071553D11C0 F4 03 00 AA MOV X20, X0
.note.gnu.proc:00000071553D11C4 B3 CD 02 94 BL readdir
5.6、RegisterNatives
注册native方法
.note.gnu.proc:00000071553E88AC ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553E88AC E2 03 16 AA MOV X2, X22 .note.gnu.proc:00000071553E88B0 00 01 3F D6 BLR X8 ; RegisterNatives .note.gnu.proc:00000071553E88B0 .note.gnu.proc:00000071553E88B4 ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553E88B4 F7 03 00 2A MOV W23, W0 ; RegisterNatives END .note.gnu.proc:00000071553E88B4 .note.gnu.proc:00000071553E88B8 ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553E88B8 E0 03 16 AA MOV X0, X22
根据源码中结构可以得到方法存放位置,X2寄存器存放native方法。
static int registerNativeMethods(JNIEnv* env , const char* className , JNINativeMethod* gMethods, int numMethods) gMethods methods[] 数组 :其中定义了 Java 层方法与 Native 层方法的对应关系 ; JNINativeMethod 是结构体 typedef struct { const char* name; //Java 中定义的 Native 方法名 , 注意这是一个 C 字符串 const char* signature; //函数签名 , 可以使用 javap 生成 void* fnPtr; //C/C++ 中的 Native 函数签名 } JNINativeMethod;
5.6、解密dex
检测常见脱壳器:
.note.gnu.proc:00000071553C3680 94 04 03 94 BL getString_sub_78232118D0 .note.gnu.proc:00000071553C3680 .note.gnu.proc:00000071553C3684 ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553C3684 E8 23 40 39 LDRB W8, [SP,#0x60+var_58] .note.gnu.proc:00000071553C3684 .note.gnu.proc:00000071553C3688 ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553C3688 E9 0F 40 F9 LDR X9, [SP,#0x60+var_48] .note.gnu.proc:00000071553C3688 .note.gnu.proc:00000071553C368C ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553C368C E1 03 1F 2A MOV W1, WZR .note.gnu.proc:00000071553C368C .note.gnu.proc:00000071553C3690 ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553C3690 1F 01 00 72 TST W8, #1 .note.gnu.proc:00000071553C3690 .note.gnu.proc:00000071553C3694 ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553C3694 E0 02 89 9A CSEL X0, X23, X9, EQ .note.gnu.proc:00000071553C3694 .note.gnu.proc:00000071553C3698 ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553C3698 3E 05 03 94 BL access .note.gnu.proc:00000071553C3698 .note.gnu.proc:00000071553C369C ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553C369C E8 23 40 39 LDRB W8, [SP,#0x60+var_58] .note.gnu.proc:00000071553C369C //特征 /data/dexname /data/local/tmp/unpacker.config /data/fart /sdcard/fart /data/local/tmp/libFupk3.so libFupk3.so libblackdex.so libhoudini.so //模拟器检测
创建子进程反调试:
.note.gnu.proc:00000071553D2340 CC C9 02 94 BL fork .note.gnu.proc:00000071553D2340 .note.gnu.proc:00000071553D2344 ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553D2344 60 04 00 34 CBZ W0, loc_71553D23D0 .note.gnu.proc:00000071553D2344 .note.gnu.proc:00000071553D2348 ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553D2348 1F 04 00 71 CMP W0, #1 .note.gnu.proc:00000071553D2348 .note.gnu.proc:00000071553D234C ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553D234C 8B 06 00 54 B.LT loc_71553D241C .note.gnu.proc:00000071553D234C .note.gnu.proc:00000071553D2350 ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553D2350 13 00 00 90 ADRP X19, #sub_71553D245C@PAGE .note.gnu.proc:00000071553D2350 .note.gnu.proc:00000071553D2354 ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553D2354 F4 05 00 F0 ADRP X20, #(qword_7155490F20+0x510)@PAGE .note.gnu.proc:00000071553D2354 .note.gnu.proc:00000071553D2358 ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553D2358 73 72 11 91 ADD X19, X19, #sub_71553D245C@PAGEOFF .note.gnu.proc:00000071553D2358 .note.gnu.proc:00000071553D235C ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553D235C 80 32 04 B9 STR W0, [X20,#(qword_7155490F20+0x510)@PAGEOFF] .note.gnu.proc:00000071553D235C .note.gnu.proc:00000071553D2360 ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553D2360 20 02 80 52 MOV W0, #0x11 .note.gnu.proc:00000071553D2360 .note.gnu.proc:00000071553D2364 ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553D2364 E1 03 13 AA MOV X1, X19 .note.gnu.proc:00000071553D2364 .note.gnu.proc:00000071553D2368 ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553D2368 B6 C9 02 94 BL getfuncAddress .note.gnu.proc:00000071553D2368 .note.gnu.proc:00000071553D236C ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553D236C 00 E4 00 6F MOVI V0.2D, #0 .note.gnu.proc:00000071553D236C .note.gnu.proc:00000071553D2370 ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553D2370 A1 C3 00 D1 SUB X1, X29, #-(0x20+var_50) .note.gnu.proc:00000071553D2370 .note.gnu.proc:00000071553D2374 ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553D2374 20 02 80 52 MOV W0, #0x11 .note.gnu.proc:00000071553D2374 .note.gnu.proc:00000071553D2378 ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553D2378 E2 03 1F AA MOV X2, XZR .note.gnu.proc:00000071553D2378 .note.gnu.proc:00000071553D237C ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553D237C A0 83 3E AD STP Q0, Q0, [X29,#0x20+var_50] .note.gnu.proc:00000071553D237C .note.gnu.proc:00000071553D2380 ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553D2380 B3 83 1D F8 STUR X19, [X29,#0x20+var_50+8] .note.gnu.proc:00000071553D2380 .note.gnu.proc:00000071553D2384 ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553D2384 AB C8 02 94 BL nop_6045B09FB4 .note.gnu.proc:00000071553D2384 .note.gnu.proc:00000071553D2388 ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553D2388 83 32 84 B9 LDRSW X3, [X20,#(qword_7155490F20+0x510)@PAGEOFF] .note.gnu.proc:00000071553D2388 .note.gnu.proc:00000071553D238C ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553D238C 02 00 00 90 42 A0 10 91 ADRL X2, T2_Antidbg_sub_782315F428 .note.gnu.proc:00000071553D2394 A0 C3 00 D1 SUB X0, X29, #-(0x20+var_50) .note.gnu.proc:00000071553D2394 .note.gnu.proc:00000071553D2398 ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553D2398 E1 03 1F AA MOV X1, XZR .note.gnu.proc:00000071553D2398 .note.gnu.proc:00000071553D239C ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553D239C AD C8 02 94 BL create_pthread_create .note.gnu.proc:00000071553D239C .note.gnu.proc:00000071553D23A0 ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553D23A0 60 00 00 35 CBNZ W0, loc_71553D23AC .note.gnu.proc:00000071553D23A0 .note.gnu.proc:00000071553D23A4 ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553D23A4 A0 03 5D F8 LDUR X0, [X29,#0x20+var_50] .note.gnu.proc:00000071553D23A8 F2 C9 02 94 BL detach
解密dex所需信息:
c:5FD6EB80B07CB412704C5A46D899C63B p:com.xiaopeng.mycarinfo a:com.xiaopeng.mycarinfo.application.tinker.CarApplication//app入口 r:047AEA142BC032C4 e:0 s:0 d:4A7651EA24600BAA//解密dex key m:1 z:0 u:1 x:0 fx:0 fd:0 rd:0 rx:0 pp:0 vv:0 rr:0 xx:0 si:0 rl:0 hf:0 hc:0 hi:0 is:0 db:0 it:0 i:0 ad:0 ri:0 mc:0 adf:0 dbf:0 fc:0 au:0
从壳dex中拷贝出密文解密,包名、Application、key等信息
解密出明文dex:
.note.gnu.proc:00000071553EB834 ; 解密dex .note.gnu.proc:00000071553EB834 .note.gnu.proc:00000071553EB834 DecDex_sub_71553EB834 .note.gnu.proc:00000071553EB834 .note.gnu.proc:00000071553EB834 var_60= -0x60 .note.gnu.proc:00000071553EB834 .note.gnu.proc:00000071553EB834 FD 7B BA A9 STP X29, X30, [SP,#var_60]! .note.gnu.proc:00000071553EB834 ; End of function DecDex_sub_71553EB834 .note.gnu.proc:00000071553EB834 .note.gnu.proc:00000071553EB838 FC 0B 00 F9 STR X28, [SP,#0x10] .note.gnu.proc:00000071553EB838 .note.gnu.proc:00000071553EB83C ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553EB83C FA 67 02 A9 STP X26, X25, [SP,#0x20] .note.gnu.proc:00000071553EB83C .note.gnu.proc:00000071553EB840 ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553EB840 F8 5F 03 A9 STP X24, X23, [SP,#0x30] .note.gnu.proc:00000071553EB840 .note.gnu.proc:00000071553EB844 ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553EB844 F6 57 04 A9 STP X22, X21, [SP,#0x40] .note.gnu.proc:00000071553EB844 .note.gnu.proc:00000071553EB848 ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553EB848 F4 4F 05 A9 STP X20, X19, [SP,#0x50] .note.gnu.proc:00000071553EB848 .note.gnu.proc:00000071553EB84C ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553EB84C FD 03 00 91 MOV X29, SP .note.gnu.proc:00000071553EB84C .note.gnu.proc:00000071553EB850 ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553EB850 FF 83 11 D1 SUB SP, SP, #0x460 .note.gnu.proc:00000071553EB850 .note.gnu.proc:00000071553EB854 ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553EB854 5A D0 3B D5 MRS X26, #3, c13, c0, #2 .note.gnu.proc:00000071553EB854 .note.gnu.proc:00000071553EB858 ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553EB858 48 17 40 F9 LDR X8, [X26,#0x28] .note.gnu.proc:00000071553EB858 .note.gnu.proc:00000071553EB85C ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553EB85C F9 03 00 AA MOV X25, X0 .note.gnu.proc:00000071553EB85C .note.gnu.proc:00000071553EB860 ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553EB860 F3 03 02 AA MOV X19, X2 .note.gnu.proc:00000071553EB860 .note.gnu.proc:00000071553EB864 ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553EB864 F5 03 01 AA MOV X21, X1 .note.gnu.proc:00000071553EB864 .note.gnu.proc:00000071553EB868 ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553EB868 A8 83 1F F8 STUR X8, [X29,#-8] .note.gnu.proc:00000071553EB868 .note.gnu.proc:00000071553EB86C ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553EB86C 36 5C 42 29 LDP W22, W23, [X1,#0x10] .note.gnu.proc:00000071553EB86C .note.gnu.proc:00000071553EB870 ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553EB870 38 04 40 F9 LDR X24, [X1,#8] .note.gnu.proc:00000071553EB870 .note.gnu.proc:00000071553EB874 ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553EB874 E0 03 17 AA MOV X0, X23 .note.gnu.proc:00000071553EB874 .note.gnu.proc:00000071553EB878 ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553EB878 6A 64 02 94 BL malloc_sub_7D26D81A20 .note.gnu.proc:00000071553EB878 .note.gnu.proc:00000071553EB87C ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553EB87C E1 03 18 AA MOV X1, X24 .note.gnu.proc:00000071553EB87C .note.gnu.proc:00000071553EB880 ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553EB880 E2 03 17 AA MOV X2, X23 .note.gnu.proc:00000071553EB880 .note.gnu.proc:00000071553EB884 ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553EB884 F4 03 00 AA MOV X20, X0 .note.gnu.proc:00000071553EB884 .note.gnu.proc:00000071553EB888 ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553EB888 BE 63 02 94 BL memcpy_2 ; 拷贝DEX密文 .note.gnu.proc:00000071553EB888 .note.gnu.proc:00000071553EB88C ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553EB88C E0 83 00 91 ADD X0, SP, #0x20 ; ' ' .note.gnu.proc:00000071553EB890 12 59 00 94 BL DecKEY_sub_7155401CD8 .note.gnu.proc:00000071553EB890 .note.gnu.proc:00000071553EB894 21 63 04 91 ADD X1, X25, #0x118 .note.gnu.proc:00000071553EB894 .note.gnu.proc:00000071553EB898 ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553EB898 E0 23 00 91 ADD X0, SP, #8 .note.gnu.proc:00000071553EB898 .note.gnu.proc:00000071553EB89C ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553EB89C F8 23 00 91 ADD X24, SP, #8 .note.gnu.proc:00000071553EB89C .note.gnu.proc:00000071553EB8A0 ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553EB8A0 0C 64 02 94 BL getString_sub_78232118D0 ; 4A7651EA24600BAA .note.gnu.proc:00000071553EB8A0 .note.gnu.proc:00000071553EB8A4 ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553EB8A4 E8 23 40 39 LDRB W8, [SP,#8] .note.gnu.proc:00000071553EB8A8 E9 0F 40 F9 LDR X9, [SP,#0x18] .note.gnu.proc:00000071553EB8A8 .note.gnu.proc:00000071553EB8AC ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553EB8AC EA 13 40 B9 LDR W10, [SP,#0x10] .note.gnu.proc:00000071553EB8B0 0B 03 40 B2 ORR X11, X24, #1 .note.gnu.proc:00000071553EB8B0 .note.gnu.proc:00000071553EB8B4 ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553EB8B4 0C FD 41 D3 LSR X12, X8, #1 .note.gnu.proc:00000071553EB8B4 .note.gnu.proc:00000071553EB8B8 ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553EB8B8 1F 01 00 72 TST W8, #1 .note.gnu.proc:00000071553EB8B8 .note.gnu.proc:00000071553EB8BC ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553EB8BC 61 01 89 9A CSEL X1, X11, X9, EQ .note.gnu.proc:00000071553EB8C0 82 01 8A 1A CSEL W2, W12, W10, EQ .note.gnu.proc:00000071553EB8C4 E0 83 00 91 ADD X0, SP, #0x20 ; ' ' .note.gnu.proc:00000071553EB8C4 .note.gnu.proc:00000071553EB8C8 ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553EB8C8 DE 5A 00 94 BL initkey_sub_7155402440 .note.gnu.proc:00000071553EB8C8 .note.gnu.proc:00000071553EB8CC ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553EB8CC FF 06 40 71 CMP W23, #1,LSL#12 .note.gnu.proc:00000071553EB8D0 08 00 82 52 MOV W8, #0x1000 .note.gnu.proc:00000071553EB8D0 .note.gnu.proc:00000071553EB8D4 ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553EB8D4 E2 32 88 1A CSEL W2, W23, W8, CC .note.gnu.proc:00000071553EB8D4 .note.gnu.proc:00000071553EB8D8 ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553EB8D8 E0 83 00 91 ADD X0, SP, #0x20 ; ' ' .note.gnu.proc:00000071553EB8D8 .note.gnu.proc:00000071553EB8DC ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553EB8DC E1 03 14 AA MOV X1, X20 .note.gnu.proc:00000071553EB8DC .note.gnu.proc:00000071553EB8E0 ; --------------------------------------------------------------------------- .note.gnu.proc:00000071553EB8E0 E3 03 1F 2A MOV W3, WZR .note.gnu.proc:00000071553EB8E4 F9 5A 00 94 BL Dec_DexData_sub_782318F4C8 .note.gnu.proc:00000071553EB8E4 .note.gnu.proc:00000071553EB8E8 FF 02 16 6B CMP W23, W22
解析壳DEX格式,获取加密存放的DEX,循环解密完6个DEX,解密出明文,dump点1,这时dump出来的dex是原始dex。
5.7、加载dex
在android10之前使用DexClassLoader加载的dex文件系统默认会执行dex2oat进行优化。但是android 10之后系统默认不在对使用DexClassLoader加载的dex文件执行dex2oat优化。Android 运行时只接受系统生成的OAT文件。
解密dex后直接调用_ZN3art13DexFileLoader10OpenCommonEPKhmS2_mRKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEjPKNS_10OatDexFileEbbPS9_NS3_10unique_ptrINS_16DexFileContainerENS3_14default_deleteISH_EEEEPNS0_12VerifyResultE 加载DEX,该方法定义如下:
std::unique_ptr<DexFile> DexFile::OpenCommon(const uint8_t* base, size_t size, const std::string& location, uint32_t location_checksum, const OatDexFile* oat_dex_file, bool verify, bool verify_checksum, std::string* error_msg, VerifyResult* verify_result) { if (verify_result != nullptr) { *verify_result = VerifyResult::kVerifyNotAttempted; } std::unique_ptr<DexFile> dex_file(new DexFile(base, size,
OpenCommon这是一个比较好的脱壳点。直接hook可以拿到dex。
接下来创建PathDexList对像,通过PathDexList的成员变量 Element[] dexElements来指向DEX文件,这样DEX就被加载到内存中。
六、脱壳二次打包
6.1、dump后dex重打包
通过上面的分析其实dump点有很多,解密后内存中dump,DexFile::OpenCommon加载dex时。将dump出来的DEX重新打包,
修改入口类就可以运行(com.xiaopeng.mycarinfo.application.tinker.CarApplication),这个入口类在上面己经解密。
加载完所有DEX后反射调用原始入口,如图6-1所示:
图6-1
七、总结
亮点:
Native层so保护技术相对于整体压缩加密的方式它做了sms技术与自定义linker加载so,抹掉elf头,节信息等,能很好的防止内存dump elf。如果要完整脱壳需要根据elf格式重新组合一个完整的so文件。防脱壳的安全度还是有的。
不足点:
虽然native层做了很多反调试,反脱壳等手段,但是最终DEX在内存中出现了完整的明文,很难防止各种脱壳机。
通过本次分析学习了解到高版本系统加载dex流程以及自定义linker相关知识。
样本获取方式,关注公众号,公众号输入框回复“xp” 获取下载链接。