Anvill 项目使用教程
1. 项目介绍
Anvill 是一个用于将原始机器码转换为高质量 LLVM 位码的开源工具。其主要目标是生成与 Clang 编译器在语义上等价的 C 函数所产生的位码相似的高质量位码。Anvill 通过使用 Remill 实现简单的机器码提升原语,从而实现这一目标。
Anvill 的核心功能包括:
- 将原始机器码转换为 LLVM 位码。
- 生成高质量的位码,便于进一步反编译为 C 代码。
- 支持多种平台,特别是 Linux 系统。
2. 项目快速启动
2.1 环境准备
在开始之前,确保你的系统已经安装了以下依赖:
- CMake 3.14+
- Clang 12.0+
- Remill(最新版本)
- Python 3.9
- Ghidra(最新版本)
2.2 安装步骤
-
克隆 Anvill 仓库
git clone https://github.com/lifting-bits/anvill.git
-
更新子模块
git submodule update --init --recursive
-
创建并进入构建目录
mkdir anvill-build && cd anvill-build
-
配置 CMake
CC=clang cmake ../anvill
-
编译项目
make -j 5
-
安装 Anvill
sudo make install
2.3 运行测试
在配置 CMake 时,添加以下参数以启用测试:
cmake -DANVILL_ENABLE_TESTS=true ../anvill
然后运行测试:
cmake --build build_folder --target test
3. 应用案例和最佳实践
3.1 案例一:反编译二进制文件
Anvill 可以用于将二进制文件中的机器码转换为 LLVM 位码,然后使用 Rellic 进一步反编译为 C 代码。这对于分析和理解复杂的二进制文件非常有用。
3.2 案例二:生成函数规范
Anvill 还提供了一个工具 anvill-specify-bitcode
,用于生成 LLVM 位码模块中所有函数的规范。这对于创建常用函数的规范数据库非常有用,特别是在使用 McSema 提升二进制文件时。
3.3 最佳实践
- 使用 Docker 进行构建:为了简化环境配置,可以使用 Docker 进行构建。例如,使用以下命令构建 Anvill:
ARCH=amd64 UBUNTU_VERSION=20.04 LLVM=14 \ docker build -t anvill-llvm$[LLVM]-ubuntu$[UBUNTU_VERSION]-$[ARCH] \ -f Dockerfile \ --build-arg UBUNTU_VERSION=$[UBUNTU_VERSION] \ --build-arg ARCH=$[ARCH] \ --build-arg LLVM_VERSION=$[LLVM] .
4. 典型生态项目
4.1 Remill
Remill 是一个用于将机器码转换为 LLVM 位码的框架。Anvill 依赖于 Remill 来实现其核心功能,因此 Remill 是 Anvill 生态中的关键项目。
4.2 Rellic
Rellic 是一个用于将 LLVM 位码反编译为 C 代码的工具。Anvill 生成的 LLVM 位码可以通过 Rellic 进一步转换为可读的 C 代码,从而便于分析和理解。
4.3 Ghidra
Ghidra 是一个开源的逆向工程工具,Anvill 使用 Ghidra 生成的规范来提升机器码。Ghidra 的插件可以生成 Anvill 所需的 protobuf 规范,从而实现高质量的位码生成。
通过这些生态项目的协同工作,Anvill 能够提供强大的二进制分析和反编译能力。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考