xqzme69/Amice-Deobfuscator

GitHub: xqzme69/Amice-Deobfuscator

一款针对 amice 代码保护方案的静态 LLVM IR 去虚拟化与字符串解密工具,通过零执行方式还原被保护的逻辑与加密字符串。

Stars: 0 | Forks: 0

# amice-devirt 用于 [fuqiuluo/amice](https://github.com/fuqiuluo/amice) 的静态 LLVM IR 去虚拟化和字符串解密器。适用于由 Rust、C 和 C++ 生成的 IR。零执行。 解码器遵循 Amice 自身的描述符、字节码、配置文件和 StringEncryption 代码。当 guard、范围、opcode 或 key 无法验证时,它不会推断出看似合理的结果。 ## 安装 直接从源码构建: ``` git clone https://github.com/xqzme69/Amice-Deobfuscator.git cd Amice-Deobfuscator cargo build --release ``` 二进制文件将位于 `target/release/amice-devirt`(Windows 上为 `.exe`)。 你不需要 LLVM 检出来构建或运行去虚拟化器。LLVM 仅在保护端用于生成输入的 `.ll` 文件时需要。 ## 功能 - 紧凑的 VMP 字节码 blob 和加密描述符表解码 - 从标记名称或存活的 VM wrapper 自动恢复描述符 seed - 支持无标记的生产环境 IR - `AMICEVMP` package 全局解码和重定位检查 - 内置官方 `amice-simple-vmp` profile,并支持自定义 profile package - 支持 `global`、`lazy`、`stack` 和 `inline` 模式下的 XOR 和 SIMD XOR 字符串恢复 - C++ 带引号符号和 struct 字符串解析 - 常量池、命名操作数、原生 target 和 guard 报告 - 可读的 VM 列表、JSONL 记录,以及带有覆盖率统计的忠实伪提升 ## 用法 解码普通的紧凑 VMP blob。当 Amice 使用其默认 profile 时,profile 标志是可选的: ``` amice-devirt decode \ --ll protected.ll \ --out devirt_out ``` 当受保护的文件未使用 Amice 默认设置时,请使用保护该文件时所用的 profile: ``` amice-devirt decode \ --ll protected.ll \ --profile path/to/profile-package \ --out devirt_out ``` 对于 wrapper 名称已丢失且经过大量转换的无标记 IR,请提供已知的描述符 seed: ``` amice-devirt decode \ --ll protected.ll \ --descriptor-seed 0xf9e60352f5b5e4ba \ --out devirt_out ``` 无需运行 target 即可恢复字符串: ``` amice-devirt strings --ll protected.ll --out strings_out ``` 解码随 Amice 标记发出的 debug/package 全局变量: ``` amice-devirt package --ll protected.ll --out package_out ``` 首先检查候选全局变量和可用的 seed 证据: ``` amice-devirt discover --ll protected.ll ``` ## 示例输出 这是一个使用 `VmVirtualize` 保护的无标记 C++ 固定测试。描述符 seed 来自 wrapper,而不是 debug 标记: ``` [*] Profile: built-in amice-simple-vmp [+] Descriptors: 1 [+] VM records: 38 [+] String algorithm: plain [+] Recovered strings: 2 [+] Lift coverage: 18/18 (100.00%) [+] Descriptor seed: 0xde5c44bfebdb8222 ======================================================================================================== DECODED FUNCTIONS ======================================================================================================== fn[0] _cpp_vm_math__YAHH_Z records=38 consts=1 native=0 guard=valid ======================================================================================================== RECOVERED STRINGS ======================================================================================================== cpp_note[0] algorithm=plain "cpp deobf" cpp_meme[0] algorithm=plain "cpp static gang" ``` ## 输出文件 - `descriptors.json`:解密后的描述符字段、guard 状态、常量池和原生范围 - `vm.jsonl`:每行一条解码后的 VM 指令 - `vm.txt`:按函数分组的紧凑列表 - `lift.ll.txt`:该工具能理解的 profile 语义的伪 IR - `lift-coverage.json`:精确的提升和 `vm_unknown` 计数 - `strings.json` / `strings.txt`:恢复的文本、原始十六进制、算法和证据 - `packages.json`:来自 `package` 命令的 package 头和重定位 `algorithm=plain` 表示 LLVM 已经折叠了解密器或实例化了一个栈字符串。报告将此情况与实际使用 XOR 或 SIMD XOR 解码的字节区分开来。 ## 已知限制 当前的输入是经过 Amice 处理后的文本 LLVM IR,而不是 PE、ELF、Mach-O、目标文件或 bitcode 文件。此版本中没有 IDA/Ghidra 加载器。 `lift.ll.txt` 是一种逆向工程辅助工具,不是重构的源代码,也不是完整的 SSA 反编译器。不支持的 profile 语义保留显示为 `vm_unknown`;`lift-coverage.json` 会指出它们,而不是隐藏这一差距。 如果后续的 pass 同时移除了描述符标记和原始的 wrapper 顺序,则无法仅从该 IR 中推导出 seed。在这种情况下,请使用 `--descriptor-seed` 或 `--safe-names`。 Amice 依赖项固定在 [`2c019b0`](https://github.com/fuqiuluo/amice/commit/2c019b01679717657e820c9220342a0a19f214a9)。未来的 Amice 版本可能会更改格式,在更新此固定版本之前,应对照其源码进行检查。 请在你自己拥有或已获授权的制品上使用它。 ## 验证 最新的本地发布门控测试通过了 31 项测试,包括默认被忽略的受保护语料库。它涵盖了 Rust 的 stage1/stage3 等价性、C 和 C++ 的标记/无标记 VMP、两种字符串算法,以及所有四种 StringEncryption 的时序/分配形式。 命令、哈希值以及每个矩阵的统计详情见 [TEST_RESULTS.md](TEST_RESULTS.md)。
标签:LLVM IR, Rust, 代码混淆, 反混淆, 可视化界面, 字符串解密, 网络流量审计, 逆向分析, 通知系统