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 解析]
根据映射表还原操作
↓ [输出]
正确的计算结果