GKLBB

当你经历了暴风雨,你也就成为了暴风雨

导航

应用安全 ---- 安卓加固 之 DEX VMP

1. 原始代码
 
java
public int compute(int a, int b) {
    int c = a * a;
    int d = a * b;
    int e = a - b;
    int f = a / b;
    int result = c + d + e + f;
    return result;
}


编译为 Smali 字节码92 00 06 06  // mul-int v0, v6, v6  (c = a * a)
92 01 06 07  // mul-int v1, v6, v7  (d = a * b)
91 02 06 07  // sub-int v2, v6, v7  (e = a - b)
93 03 06 07  // div-int v3, v6, v7  (f = a / b)
90 04 00 01  // add-int v4, v0, v1  (v4 = c + d)
b0 24        // add-int/2addr v4, v2 (v4 += e)
b0 34        // add-int/2addr v4, v3 (v4 += f)
0f 04        // return v4


### 3. **VMP 保护后的字节码** (opcode 映射)
```
22 00 06 06  // 0x92 → 0x22 (减去 0x70)
22 01 06 07  // 0x92 → 0x22
21 02 06 07  // 0x91 → 0x21
23 03 06 07  // 0x93 → 0x23
20 04 00 01  // 0x90 → 0x20
b0 24        // 保持不变
b0 34        // 保持不变
0f 04        // return 保持不变
4. 自定义解释器执行
 
c
// 解释器核心循环
while (true) {
    unsigned char op = *opOffset;
    switch (op) {
        case 0x20: {  // 原本的 0x90 ADD
            unsigned char des = *(opOffset + 1);
            unsigned char arg0 = *(opOffset + 2);
            unsigned char arg1 = *(opOffset + 3);
            VREG[des] = VREG[arg0] + VREG[arg1];
            opOffset += 4;
            break;
        }
        case 0x22: {  // 原本的 0x92 MUL
            unsigned char des = *(opOffset + 1);
            unsigned char arg0 = *(opOffset + 2);
            unsigned char arg1 = *(opOffset + 3);
            VREG[des] = VREG[arg0] * VREG[arg1];
            opOffset += 4;
            break;
        }
        // ... 其他指令
    }
}
```

## 完整处理流程图
```
原始 Java 代码
    ↓ [编译]
标准 Smali 字节码 (0x90, 0x91, 0x92...)
    ↓ [VMP 混淆/映射]
自定义字节码 (0x20, 0x21, 0x22...)
    ↓ [存储在 SO 中]
加密的字节码数组
    ↓ [运行时]
自定义解释器读取并执行
    ↓ [switch-case 解析]
根据映射表还原操作
    ↓ [输出]
正确的计算结果

 

posted on 2026-01-30 10:50  GKLBB  阅读(2)  评论(0)    收藏  举报