好友
阅读权限10
听众
最后登录1970-1-1
|
🛡️ 开源分享|从零自研 ARM64 虚拟机保护引擎(VMP),2.0 版本已理论覆盖全部 A64 基础指令
分享一个我最近开源的项目 VMPacker —— 一套完整的 ARM64 Linux ELF 虚拟机代码保护系统。
不同于动辄数万的商业 VMP 方案,这个项目完全开源 适合学习和研究 VMP 保护的底层实现原理
2.0 里程碑:121 条 ARM64 指令全覆盖
经过两天的深度适配,2.0 版本总算理论覆盖了所有 ARM64 A64 基础指令集——共 121 条,涵盖:
| 类别 |
指令 |
| 算术/逻辑 |
ADD, SUB, MUL, AND, ORR, EOR, LSL, LSR, ASR, MVN, BIC, ORN, EON... |
| 乘法扩展 |
MADD, MSUB, SMADDL, SMSUBL, UMADDL, UMSUBL, SMULH, UMULH, UDIV, SDIV |
| 数据移动 |
MOV, MOVZ, MOVK, MOVN |
| 内存访问 |
LDR, STR, LDP, STP, LDPSW, LDADD, CAS, LDAR, STLR, LDAXR, STLXR(多宽度 + 多寻址模式) |
| 分支控制 |
B, BL, BR, BLR, RET, B.cond, CBZ/CBNZ, TBZ/TBNZ |
| 条件选择 |
CSEL, CSINC, CSINV, CSNEG, CCMP, CCMN |
| 位域/位操作 |
UBFM, SBFM, BFM, EXTR, CLZ, CLS, RBIT, REV, REV16, REV32 |
| 进位运算 |
ADC, ADCS, SBC, SBCS |
| SIMD |
LD1, ST1 |
| 系统/屏障 |
SVC, MRS, MSR, ADRP/ADR, DMB, DSB, ISB, HLT, BRK, PRFM |
这意味着绝大多数用 C/C++ 编译出的 ARM64 函数都可以被直接保护,不再因为"不支持的指令"而中断。
💡 研究初衷
最初做项目时,仅通过 UPX 魔改加固,防护效果极差,程序频繁被破解,让我束手无策。
后来在网上寻找 ARM64 架构的开源 VMP 虚拟化保护方案,却发现几乎没有成熟可用的项目(付费方案又动辄数万)。
于是我决定从零自研一套 ARM64 指令级虚拟化保护引擎,最终才有了 VMPacker —— 专注于从根源上提升程序的抗逆向、防破解能力。
🏗️ 技术架构
整个系统分为三个核心模块:
1. 指令解码器(Go)
- 基于 ARM Architecture Reference Manual 的 table-driven 模式匹配
- 支持 DP-IMM / DP-REG / Branch / Load-Store 四大指令族
- 解码结果为统一的中间表示(IR)
2. 字节码翻译器(Go)
- 将 ARM64 IR 翻译为 63 条自定义 VM 指令
- 处理 PC 相对地址重定位(ADRP/ADR → 绝对地址计算)
- 分支目标地址修正 + Label 引用解析
3. VM 解释器 Stub(C → flat binary)
- 编译为位置无关的纯二进制(PIC)
- 通过 PT_NOTE 段劫持注入到 ELF
- 运行时在栈上构建间接跳转表
- CRC32 完整性校验
🔐 五层保护机制
| 层级 |
技术 |
作用 |
| Opcode 随机映射 |
每次生成不同的指令编码 |
逆向者无法直接识别语义 |
| OpcodeCryptor |
enc[pc] = op[pc] ^ (key ^ (pc * 0x9E3779B9)) |
静态分析极度困难 |
| 字节码逆序 |
指令倒序存储,解释器反向遍历 |
增加分析复杂度 |
| Token 入口 |
3 指令跳板替换原函数 |
隐藏实际字节码位置 |
| 间接派遣 |
栈上运行时填充函数指针表 |
破坏 IDA 交叉引用分析 |
🧩 可扩展性
项目采用接口驱动设计,Decoder / Translator / Packer 三大接口完全解耦,理论上可扩展支持:
- 其他 ISA:x86_64, RISC-V
- 其他二进制格式:PE (Windows), Mach-O (macOS)
📌 项目地址
GitHub: https://github.com/LeoChen-CoreMind/VMPacker
AGPL-3.0 协议,学习研究随意用。如果觉得有帮助,欢迎点个 ⭐ Star 支持一下! PR 和 Issue 也非常欢迎。
|
免费评分
-
查看全部评分
|