SkillAgentSearch skills...

Amice

A Rust implementation of Obfuscator-LLVM (OLLVM) passes

Install / Use

/learn @fuqiuluo/Amice

README

Amice

English | 简体中文

Amice 是一个基于 llvm-plugin-rs 构建的 LLVM Pass 插件项目,可通过 clang -fpass-plugin 方式注入到编译流程中。


快速上手

  1. 构建插件

    export LLVM_SYS_211_PREFIX=/usr/lib64/llvm21  # Fedora,其他发行版按实际路径调整
    # export RUST_LOG=debug  # 需要调试日志时取消注释
    cargo build --release
    # 生成的动态库位于 target/release/libamice.so
    
  2. 编译并注入 Pass

    clang -fpass-plugin=libamice.so your_source.c -o your_source
    

支持的混淆

| 混淆 | C/C++ | Rust | ObjC | |:---------------|:-----:|:----:|:----:| | 字符串加密 | ✅ | ✅ | ⏳ | | 间接调用混淆 | ✅ | ✅ | ❌ | | 间接跳转混淆 | ✅ | ✅ | ❌ | | 切割基本块 | ✅ | ✅ | ❌ | | switch 降级 | ✅ | ✅ | ❌ | | 扁平化控制流 (VM) | ✅ | ✅ | ❌ | | 控制流平坦化 | ✅ | ✅ | ❌ | | MBA 算术混淆 | ✅ | ✅ | ❌ | | 虚假控制流混淆 | ✅ | ✅ | ❌ | | 函数包装 | ✅ | ✅ | ❌ | | 常参特化克隆混淆 | ✅ | ✅ | ❌ | | 别名访问混淆 | ✅ | ✅ | ❌ | | 自定义调用约定 | ⏳ | ⏳ | ❌ | | 延时偏移加载 (AMA) | ✅ | ⏳ | ❌ | | 反Class导出 | ❌ | ❌ | ⏳ | | 参数结构化混淆 (PAO) | ✅ | ⏳ | ❌ | | 指令虚拟化 | ⏳ | ⏳ | ❌ | | 函数分片 (BB2FUNC) | ✅ | ⏳ | ❌ |

说明:

  • ✅ 已支持
  • ⏳ 进行中 / 计划中 / 未测试
  • ❌ 暂未规划

运行时环境变量

详细说明请参阅:
https://github.com/fuqiuluo/amice/blob/master/docs


构建指南

1. Linux

当前默认 feature 为 llvm21-1,需要 LLVM 21 开发包。 也可通过 --no-default-features --features llvm<版本> 切换其他 LLVM 版本(支持范围:llvm11-0 ~ llvm21-1),对应调整 LLVM_SYS_<大版本号>_PREFIX

amice 构建时会自动在 $PATH 中搜索 llvm-configllvm-config-<N> 等,若系统包管理器安装的 llvm-config 已在 PATH 中,则无需手动设置 LLVM_SYS_*_PREFIX

  • Fedora / RHEL

    sudo dnf install llvm llvm-devel
    cargo build --release
    
  • Debian / Ubuntu(LLVM 官方源)

    # 安装 LLVM 21(https://apt.llvm.org/)
    sudo apt install llvm-21 llvm-21-dev clang-21
    # Ubuntu 的 llvm-config-21 不一定在 PATH,可显式指定
    # export LLVM_SYS_211_PREFIX=/usr/lib/llvm-21
    cargo build --release
    
  • 非默认版本(以 LLVM 18 为例)

    # feature 名 llvm18-1,对应 LLVM_SYS_181_PREFIX
    export LLVM_SYS_181_PREFIX=/path/to/llvm18
    cargo build --release --no-default-features --features llvm18-1
    
  • 自定义路径(通用)

    # LLVM_SYS_<大版本号>_PREFIX 指向 llvm-config 所在目录的上级
    export LLVM_SYS_211_PREFIX=/path/to/llvm21
    cargo build --release
    

问题排查 | LLVM 安装指南

2. macOS

brew install llvm@21
export LLVM_SYS_211_PREFIX=$(brew --prefix llvm@21)
cargo build --release

3. Windows

官方预编译的 LLVM 无法启用动态插件,需自行编译或使用社区版本: https://github.com/jamesmth/llvm-project/releases

setx LLVM_SYS_211_PREFIX “C:\llvm21”
cargo build --release

4. Android NDK

Android 自带 clang 支持动态加载 Pass,但缺少 opt。可采用“未精简版 clang”方案,参考:
Ylarod:NDK 加载 LLVM Pass

# 以下示例基于 r522817 (NDK 25c)
export CXX="/path/to/unstripped-clang/bin/clang++"
export CXXFLAGS="-stdlib=libc++ -I/path/to/unstripped-clang/include/c++/v1"
export LDFLAGS="-stdlib=libc++ -L/path/to/unstripped-clang/lib"

# llvm-plugin-rs 18.1,对应 NDK clang 18.0
export LLVM_SYS_181_PREFIX=/path/to/unstripped-clang

# cargo build --release 
# ndk 25c is llvm-18-1
cargo b --release --no-default-features --features llvm-18-1

# 如遇找不到 libLLVM.so,可指定 LD_LIBRARY_PATH
export LD_LIBRARY_PATH=/path/to/unstripped-clang/lib

/path/to/ndk/toolchains/llvm/prebuilt/linux-x86_64/bin/clang \
  -fpass-plugin=../target/release/libamice.so \
  -Xclang -load -Xclang ../target/release/libamice.so \
  luo.c -o luo

Download: android-ndk-r25c Linux X64


TODO

  • [ ] 内联模式(Inline)支持
  • [ ] 更多 Pass 示例
  • [ ] CI / CD

鸣谢


© 2025-2026 Fuqiuluo & Contributors.
使用遵循本仓库 LICENSE。

Related Skills

View on GitHub
GitHub Stars105
CategoryDevelopment
Updated1d ago
Forks18

Languages

Rust

Security Score

100/100

Audited on Mar 25, 2026

No findings