RadonCoding/binsafe
GitHub: RadonCoding/binsafe
一款用于已编译 64 位 PE 文件的代码混淆器,通过指令虚拟化、加密、反调试等多重机制保护二进制代码免受逆向分析。
Stars: 11 | Forks: 0

用于已编译的 64 位可移植可执行文件(portable executables)的代码混淆器。
## 工作原理
### 1. 混淆器
#### 分析
- **反汇编**:二进制文件的代码段会被反汇编,并通过追踪所有可达的控制流(包括 switch 表和异常处理程序边界)划分为基本块。
#### 虚拟化
- **提升**:指令被翻译为自定义的栈机器字节码,由 runtime 进行解释。
- **窥孔优化**:通过多趟扫描字节码来简化指令序列并消除冗余操作。
- **置换**:通过依赖图将操作重新排序为语义等价的序列。
- **打乱**:将操作以随机的物理布局放置,并通过遵循其原始执行顺序的跳转指令进行连接。
- **变异**:将操作重写为逻辑等价的形式,且其结构在不同构建版本间有所变化。
- **加密**:立即数通过与滚动密钥进行掩码处理来加密。每个块的密钥由前一个块的密文尾部派生,因此一旦被篡改,就会静默破坏后续所有的块。
- **修补**:虚拟化后的块被替换为存根,将控制权转移到 VM。
### 2. Runtime
#### 引导
- **汇编**:VM 直接以 x86 机器码的形式组装到输出的二进制文件中,函数和数据在每次构建时都会被打乱为随机布局。
- **导入**:在 runtime 通过遍历 PEB 来解析导入,依据是以 nonce 为种子的模块名和导出名的哈希值,而不是通过导入表。
#### 执行
- **调度**:存根将 CPU 状态转移到 VM,VM 通过间接调度对字节码进行解密和解释。
- **隔离**:线程在线程本地存储中维护隔离的上下文,并为嵌套执行提供子上下文。
- **异常**:向量化处理程序捕获 VM 内部的错误,并为外部处理程序重建 CPU 上下文。
#### 保护
- **校验**:反调试和完整性检查作为 VM 字节码运行,并直接参与到块的解密过程中,在遭受篡改或调试时会静默破坏代码执行。
## 测试
`tests` crate 会启动一个经过插桩的 VM,并将其行为与 CPU 的实际执行结果进行比较。
- **指令**:每条指令都会通过 VM 执行,并将得到的寄存器和向量状态与原生执行结果进行比较。
- **置换**:对每个指令序列的依赖图进行穷举枚举,每一个有效的排序都会通过 VM 执行并进行验证。
## 用法
`cargo run --release --bin obfuscator -- --virtualization`
## 贡献
1. Fork 它
2. 创建你的分支 (`git checkout -b my-change`)
3. 提交你的更改 (`git commit -m "changed something"`)
4. 推送到该分支 (`git push origin my-change`)
5. 创建新的 pull request
标签:x86-64, 二进制保护, 代码混淆, 反逆向工程, 可视化界面, 虚拟化执行, 通知系统