-
图 1 VMPP原理
Figure 1.
-
图 2 示例源代码及其生成的LLVM IR文件
Figure 2.
-
图 3 转化后的指令示例
Figure 3.
-
图 4 外部函数调用表(上)与解释器的外部函数调用代码(下)
Figure 4.
-
图 5 加固后的源文件示例
Figure 5.
-
图 6 加固之前源代码生成的可执行文件反汇编结果
Figure 6.
-
图 7 加固之后源代码生成的可执行文件反汇编结果
Figure 7.
-
指令类型 典型指令 1* 2 3 4 5 6 7 8 指令示例 示例含义 R add 0x51 Dst Size – – – Src1 Src2 51 01 04 0000 00 02 03 r1=r2+r3 I addi 0x30 Dst Src Size Immediate 30 01 02 0400 00 00 01 r1 = r2+1 B jmp 0x22 Flag – PC 22 00 00 0000 00 00 04 jmp 4 CMP cmp 0xc0 Dst Mode Src1 Src2 – – – c0 01 00 0203 00 00 00 r1=r2>r3 W load 0xe4 Dst Size Src – – – – e4 01 04 0200 00 00 00 r1=[r2] C call 0x90 Num – – – – – – 90 01 00 0000 00 00 00 call 01 M malloc 0xa0 Dst – Immediate a0 01 00 0000 00 00 08 r1=malloc(8) E throw 0x11 Type – – ExceptionPC 11 01 00 0000 00 00 06 throw 01 表 1 VMPP虚拟指令格式
-
序号 APP包名 本地代码主要功能 代码行数 运行时间(ms) 二进制体积(kB) 加固前 加固后 加固前 加固后 用例A com.zizuzi.verificationdemo 通过设备ID等生成加密密钥 123 6 7 10 285 用例B com.masonliu.testndk 计算SHA1值验证签名 230 5 6 18 297 用例C com.chenneyu.security 反射获取APP签名并校验 221 3 4 11 241 用例D com.panxw.aes 实现AES算法加密字符串 2301 2 29 20 308 用例E com.ss.jni 反射Java函数修改界面UI 174 37 42 10 237 用例F com.dean.vmp01 字符串运算操作 57 <1 <1 6 103 用例G com.dean.vmp02 多维数组的运算 96 <1 <1 6 92 表 2 VMPP有效性测试结果
-
分析人员 逆向所需时间(min):加固前 / 加固后 加固后、加固前逆向时间比值 用例A 用例B 用例C 用例E 用例F 用例G 合计 A 3 / 35 6 / 65 8 / 71 9 / 92 7 / 78 7 / 82 40 / 423 10.6 B 5 / 40 9 / 59 7 / 80 10 / 112 8 / 75 9 / 96 48 / 462 9.6 C 5 / 58 7 / 82 7 / 134 8 / 165 7 / 117 9 / 122 43 / 678 15.8 表 3 VMPP防逆向效果实验
-
序号 设备名称 系统版本 手机架构 是否兼容 1 Nexus 5 Android 5.0 arm32 是 2 Samsung S7 Android 6.0 arm64 是 3 Pixel 2XL Android 8.1 arm64 是 4 Samsung S9+ Android 9.0 arm64 是 5 Genymotion Emulator Android 8.0 x86 是 表 4 VMPP兼容性测试
-
序号 APP包名 加固前运行时间(ms) 加固后运行时间(ms) 加固前体积(kB) 加固后体积(kB) VMPP 几维加固 VMPP 几维加固 用例D com.panxw.aes 2 29 4 20 308 583 用例E com.ss.jni 37 42 38 10 237 553 表 5 VMPP加固和几维加固运行时开销对比
图共
7 个 表共
5 个