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, 代码混淆, 反混淆, 可视化界面, 字符串解密, 网络流量审计, 逆向分析, 通知系统