RadonCoding/binsafe

GitHub: RadonCoding/binsafe

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

Stars: 11 | Forks: 0

![](https://static.pigsec.cn/wp-content/uploads/repos/cas/1e/1eb37ff2d25af4d40790568dd802357d176ba81c4eda395f196ed43dcdeb521e.gif) 用于已编译的 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, 二进制保护, 代码混淆, 反逆向工程, 可视化界面, 虚拟化执行, 通知系统