graph TB
A[代码保护技术] --> B[VMP虚拟机保护]
A --> C[JSVMP JS保护]
A --> D[OLLVM编译混淆]
A --> E[WASM字节码]
B --> F[运行时保护]
B --> G[动态解密]
B --> H[反调试机制]
C --> I[JS虚拟机]
C --> J[字节码转换]
C --> K[浏览器反调试]
D --> L[编译时混淆]
D --> M[控制流平坦化]
D --> N[指令替换]
E --> O[静态编译]
E --> P[沙箱执行]
E --> Q[跨平台支持]
R[保护强度] --> S[VMP: 高]
R --> T[JSVMP: 高]
R --> U[OLLVM: 中]
R --> V[WASM: 中]
W[性能开销] --> X[VMP: 高]
W --> Y[JSVMP: 中]
W --> Z[OLLVM: 低]
W --> AA[WASM: 低]
二、VMP与JSVMP技术原理
1. VMP虚拟机架构
VMP采用自定义的虚拟机架构,将原始指令转换为虚拟机字节码执行。
a. VMP虚拟机架构图
sequenceDiagram
participant App as 原始应用
participant VMP as VMP保护器
participant VM as 虚拟机引擎
participant Memory as 虚拟内存
App->>VMP: 加载受保护代码
VMP->>VM: 初始化虚拟机
VMP->>Memory: 分配虚拟内存空间
App->>VM: 调用受保护函数
VM->>VM: 解析虚拟机字节码
VM->>Memory: 访问虚拟寄存器
VM->>VM: 执行虚拟机指令
VM->>App: 返回执行结果
Note over VM: 虚拟机指令集
VM->>VM: MOV, ADD, SUB, JMP等
VM->>VM: CALL, RET, PUSH, POP等
虚拟机组件:
指令解码器:解析虚拟机字节码
寄存器模拟:模拟CPU寄存器
内存管理:管理虚拟内存空间
执行引擎:执行虚拟机指令
2. JSVMP虚拟机架构
JSVMP专门为JavaScript代码设计,将JS代码转换为自定义的虚拟机字节码执行。
a. JSVMP虚拟机架构图
sequenceDiagram
participant JS as JavaScript代码
participant Parser as JS解析器
participant VM as JSVMP虚拟机
participant Browser as 浏览器环境
JS->>Parser: 解析JavaScript代码
Parser->>VM: 转换为虚拟机字节码
VM->>Browser: 初始化浏览器环境
Browser->>VM: 调用受保护函数
VM->>VM: 解析虚拟机字节码
VM->>VM: 执行虚拟机指令
VM->>Browser: 返回执行结果
Note over VM: JSVMP指令集
VM->>VM: LOAD, STORE, CALL等
VM->>VM: ADD, SUB, MUL, DIV等
VM->>VM: JMP, JZ, JNZ等
JSVMP组件:
JS解析器:解析JavaScript代码
字节码生成器:生成虚拟机字节码
虚拟机引擎:执行字节码指令
浏览器接口:与浏览器环境交互
3. VMP保护机制
a. 代码加密流程
flowchart TD
A[原始代码] --> B[指令分析]
B --> C[虚拟机指令转换]
C --> D[字节码生成]
D --> E[加密处理]
E --> F[完整性校验]
F --> G[保护后代码]
H[运行时] --> I[动态解密]
I --> J[虚拟机执行]
J --> K[结果返回]
L[反调试检测] --> M[调试器检测]
L --> N[断点检测]
L --> O[内存检测]
保护特点:
动态解密:代码在运行时才解密
完整性校验:检测代码是否被修改
反调试:检测调试器存在
时间检测:检测执行时间异常
4. JSVMP保护机制
a. JSVMP保护流程
flowchart TD
A[JavaScript代码] --> B[语法分析]
B --> C[字节码生成]
C --> D[代码混淆]
D --> E[反调试注入]
E --> F[保护后代码]
G[浏览器执行] --> H[虚拟机初始化]
H --> I[字节码解析]
I --> J[指令执行]
J --> K[结果返回]
L[反调试检测] --> M[DevTools检测]
L --> N[断点检测]
L --> O[时间检测]
graph LR
A[源代码] --> B[LLVM IR]
B --> C[混淆Pass]
C --> D[混淆后IR]
D --> E[目标代码]
F[混淆技术] --> G[控制流平坦化]
F --> H[指令替换]
F --> I[虚假控制流]
F --> J[函数分割]
G --> K[Switch-Case结构]
H --> L[复杂指令替换]
I --> M[虚假分支插入]
J --> N[函数片段化]
混淆Pass:
Flattening Pass:控制流平坦化
Substitution Pass:指令替换
Bogus Control Flow:虚假控制流
Function Splitting:函数分割
2. 控制流平坦化
a. 控制流平坦化原理
flowchart TD
A[原始控制流] --> B[复杂分支结构]
B --> C[条件判断]
C --> D[多个执行路径]
E[平坦化后] --> F[Switch-Case结构]
F --> G[状态变量控制]
G --> H[统一执行流程]
I[状态机] --> J[状态0: 初始化]
I --> K[状态1: 处理A]
I --> L[状态2: 处理B]
I --> M[状态3: 结束]
平坦化特点:
统一入口:所有代码块通过统一入口
状态控制:使用状态变量控制执行流程
跳转表:使用Switch-Case实现跳转
复杂度增加:大幅增加逆向分析难度
6. JSVMP工作机制和原理
a. JSVMP保护流程
flowchart TD
A[JavaScript代码] --> B[语法分析]
B --> C[AST生成]
C --> D[字节码生成]
D --> E[代码混淆]
E --> F[反调试注入]
F --> G[保护后代码]
H[浏览器执行] --> I[虚拟机初始化]
I --> J[字节码解析]
J --> K[指令执行]
K --> L[结果返回]
M[反调试检测] --> N[DevTools检测]
M --> O[断点检测]
M --> P[时间检测]
// OLLVM混淆后(伪代码) intcheckPassword(char* input){ int state = 0; while (1) { switch (state) { case0: if (strlen(input) < 8) { state = 3; } else { state = 1; } break; case1: if (strcmp(input, "password123") == 0) { state = 2; } else { state = 3; } break; case2: return1; case3: return0; } } }
四、WASM技术原理
1. WebAssembly架构
WASM采用栈式虚拟机架构,提供高效的二进制指令格式。
a. WASM执行架构
graph TB
A[WASM模块] --> B[二进制格式]
B --> C[验证器]
C --> D[编译器]
D --> E[机器码]
F[执行环境] --> G[JavaScript引擎]
F --> H[WASM运行时]
F --> I[系统API]
G --> J[V8引擎]
G --> K[SpiderMonkey]
G --> L[JavaScriptCore]
H --> M[线性内存]
H --> N[函数表]
H --> O[全局变量]
WASM组件:
模块系统:独立的编译单元
线性内存:连续的内存空间
函数表:间接函数调用
导入导出:与宿主环境交互
2. 安全特性
a. WASM安全模型
flowchart TD
A[WASM安全模型] --> B[内存安全]
A --> C[控制流完整性]
A --> D[沙箱隔离]
B --> E[边界检查]
B --> F[类型安全]
B --> G[空指针检查]
C --> H[间接调用验证]
C --> I[返回地址保护]
C --> J[栈溢出保护]
D --> K[系统调用限制]
D --> L[文件访问控制]
D --> M[网络访问限制]
安全特点:
内存安全:防止缓冲区溢出
控制流完整性:防止ROP攻击
沙箱隔离:限制系统访问
类型安全:严格的类型检查
8. WASM工作机制和原理
a. WASM执行架构
graph TB
A[WASM模块] --> B[二进制格式]
B --> C[验证器]
C --> D[编译器]
D --> E[机器码]
F[执行环境] --> G[JavaScript引擎]
F --> H[WASM运行时]
F --> I[系统API]
G --> J[V8引擎]
G --> K[SpiderMonkey]
G --> L[JavaScriptCore]
H --> M[线性内存]
H --> N[函数表]
H --> O[全局变量]