二进制逆向工具设置Skill binary-re-tool-setup

确保所需的逆向工程工具可用且正确配置,以便进行跨架构分析。关键词包括'安装radare2', '设置ghidra', 'r2未找到', 'qemu缺失', '工具未安装', '配置gdb', '交叉编译器'。

逆向工程 1 次安装 6 次浏览 更新于 3/1/2026

二进制逆向工具设置

目的

确保所需的逆向工程工具可用且正确配置,以便进行跨架构分析。

何时使用

  • 第一次分析会话前
  • 当工具命令失败时
  • 设置新的分析环境时
  • 更新到较新的工具版本时

所需工具

工具 用途 优先级
radare2 静态分析,反汇编 必需
rabin2 快速二进制分类 必需(r2的一部分)
qemu-user 跨架构仿真 必需
gdb-multiarch 跨架构调试 必需
Ghidra 反编译 推荐
GEF GDB增强 推荐
Frida 动态插桩 可选
Unicorn 代码片段仿真 可选
Angr 符号执行 可选

按平台安装

Ubuntu/Debian

# 核心工具
sudo apt update
sudo apt install -y \
  radare2 \
  qemu-user \
  qemu-user-static \
  gdb-multiarch \
  binutils-multiarch \
  jq                    # 技能命令中JSON解析必需

# ARM系统根(QEMU用)
sudo apt install -y \
  libc6-armhf-cross \
  libc6-arm64-cross \
  libc6-dev-armhf-cross \
  libc6-dev-arm64-cross

# 附加工具
sudo apt install -y \
  file \
  binutils \
  elfutils \
  patchelf

Windows (WSL2)

Windows用户应使用WSL2和Ubuntu以获得完整兼容性:

# PowerShell(管理员)- 安装WSL2和Ubuntu
wsl --install -d Ubuntu

# 提示重启计算机后,打开Ubuntu终端

WSL2 Ubuntu内部:

# 安装所有必需工具
sudo apt update && sudo apt install -y \
  radare2 \
  qemu-user \
  qemu-user-static \
  gdb-multiarch \
  binutils-multiarch \
  jq \
  file \
  patchelf

# 修复Windows挂载驱动器的文件权限
sudo tee -a /etc/wsl.conf > /dev/null << 'EOF'
[automount]
options = "metadata,umask=22,fmask=11"
EOF

# 重启WSL以应用更改
# (在PowerShell中:wsl --shutdown)

WSL2提示:

  • 将二进制文件复制到~而不是使用/mnt/c/...路径(权限问题较少)
  • 在PowerShell中使用wsl --shutdown重启WSL配置更改后
  • Docker Desktop与WSL2集成,用于基于容器的分析

macOS (Homebrew)

# 核心工具
brew install radare2 jq

# 注意:Homebrew QEMU可能缺少qemu-user目标
# 验证:qemu-arm --version || echo "qemu-user缺失"
# 如果缺失,使用Docker进行跨架构执行(见下文)

# GDB在macOS上需要特殊处理
brew install gdb
# 注意:调试需要代码签名

# ARM交叉工具(可选,仅用于静态分析)
brew install arm-linux-gnueabihf-binutils

macOS Docker设置动态分析

由于Homebrew不提供qemu-user,使用Docker进行跨架构执行:

# 安装Docker运行时(Colima是Docker Desktop的轻量级替代品)
brew install colima docker

# 启动Colima
colima start

# 注册多架构仿真处理器
docker run --rm --privileged --platform linux/arm64 \
  tonistiigi/binfmt --install arm

# 验证ARM32仿真工作
docker run --rm --platform linux/arm/v7 arm32v7/debian:bullseye-slim uname -m
# 应输出:armv7l

# 验证ARM64仿真工作
docker run --rm --platform linux/arm64 arm64v8/debian:bullseye-slim uname -m
# 应输出:aarch64

# 验证x86-32仿真工作
docker run --rm --platform linux/i386 i386/debian:bullseye-slim uname -m
# 应输出:i686

# 验证

重要: 在Colima上,始终从~/挂载而不是/tmp/

# ✅ 有效
docker run -v ~/samples:/work ...

# ❌ 可能静默失败
docker run -v /tmp/samples:/work ...

Arch Linux

sudo pacman -S radare2 qemu-user gdb
yay -S arm-linux-gnueabihf-glibc  # 来自AUR

工具特定设置

radare2

# 验证安装
r2 -v
rabin2 -v

# 安装r2ghidra插件(反编译)
r2pm init
r2pm update
r2pm -ci r2ghidra  # -ci = 清洁安装

# 验证r2ghidra是否工作(关键检查)
r2 -qc 'pdg?' - 2>/dev/null | grep -q Usage && echo "r2ghidra OK" || echo "r2ghidra缺失"

# 替代验证
r2 -c 'Ld' /bin/ls | grep -i ghidra

常见r2ghidra问题:

症状 原因 修复
pdg未知命令 插件未加载 r2pm -ci r2ghidra
插件加载但崩溃 版本不匹配 更新r2和插件
反编译挂起 大函数 使用pdf代替,或Ghidra无头

配置(~/.radare2rc):

# 禁用脚本颜色
e scr.color=false

# 增加分析限制
e anal.timeout=120
e anal.maxsize=67108864

# 默认JSON输出脚本
e cfg.json.num=true

Ghidra(无头)

# 从https://ghidra-sre.org/下载
# 解压到/opt/ghidra

# 验证无头脚本
/opt/ghidra/support/analyzeHeadless --help

# 添加到PATH
echo 'export PATH=$PATH:/opt/ghidra/support' >> ~/.bashrc

内存配置(大二进制文件): 编辑/opt/ghidra/support/analyzeHeadless

MAXMEM=4G  # 从默认增加

GEF(GDB增强功能)

# 安装GEF
bash -c "$(curl -fsSL https://gef.blah.cat/sh)"

# 验证
gdb -q -ex "gef help" -ex "quit"

# 对ARM Cortex-M支持,也安装gef-extras
git clone https://github.com/hugsy/gef-extras.git ~/.gef-extras
echo 'source ~/.gef-extras/scripts/checksec.py' >> ~/.gdbinit

Frida

# 安装Frida工具
pip install frida-tools

# 验证
frida --version

# 安装设备调试的frida-server(可选)
# 从https://github.com/frida/frida/releases下载

Unicorn(Python绑定)

pip install unicorn

# 验证
python -c "from unicorn import *; print('OK')"

Angr

# 创建虚拟环境(推荐)
python -m venv ~/angr-venv
source ~/angr-venv/bin/activate

# 安装angr
pip install angr

# 验证
python -c "import angr; print('OK')"

YARA

# Ubuntu/Debian
sudo apt install yara

# 或从源代码获取最新版本
git clone https://github.com/VirusTotal/yara.git
cd yara
./bootstrap.sh
./configure
make && sudo make install

# Python绑定
pip install yara-python

系统根设置

标准Debian/Ubuntu系统根

已通过libc6-*-cross包安装:

# 验证路径
ls /usr/arm-linux-gnueabihf/lib/
ls /usr/aarch64-linux-gnu/lib/

从设备自定义系统根

# 通过SSH从设备拉取
mkdir -p ~/sysroots/device
ssh user@device "tar czf - /lib /usr/lib" | tar xzf - -C ~/sysroots/device

# 或最小提取
ssh user@device "tar czf - /lib/ld-* /lib/libc.* /lib/libpthread.* /lib/libdl.*" \
  | tar xzf - -C ~/sysroots/device

Musl系统根

# 来自Alpine Linux
docker run -it --rm -v ~/sysroots:/out alpine:latest sh -c \
  "apk add musl musl-dev && cp -a /lib /usr /out/alpine-musl"

验证脚本

运行此脚本来验证所有工具是否正常工作:

#!/bin/bash
set -e

echo "=== 二进制RE工具验证 ==="

# radare2
echo -n "radare2: "
r2 -v | head -1

# rabin2
echo -n "rabin2: "
rabin2 -v | head -1

# QEMU
echo -n "qemu-arm: "
qemu-arm --version | head -1

echo -n "qemu-aarch64: "
qemu-aarch64 --version | head -1

# GDB
echo -n "gdb-multiarch: "
gdb-multiarch --version | head -1

# Ghidra(可选)
if command -v analyzeHeadless &> /dev/null; then
  echo -n "Ghidra: "
  analyzeHeadless 2>&1 | head -1 || echo "可用"
else
  echo "Ghidra: 未安装(可选)"
fi

# Frida(可选)
if command -v frida &> /dev/null; then
  echo -n "Frida: "
  frida --version
else
  echo "Frida: 未安装(可选)"
fi

# 系统根
echo ""
echo "=== 系统根 ==="
[ -d /usr/arm-linux-gnueabihf ] && echo "ARM硬浮点:OK" || echo "ARM硬浮点:缺失"
[ -d /usr/aarch64-linux-gnu ] && echo "ARM64:OK" || echo "ARM64:缺失"

echo ""
echo "=== 验证完成 ==="

故障排除

常见问题快速参考

症状 原因 修复
Docker中的exec format error binfmt未注册 docker run --privileged tonistiigi/binfmt --install arm
ld-linux.so.3未找到 链接器路径不匹配 ln -sf /lib/ld-linux-armhf.so.3 /lib/ld-linux.so.3
libXXX.so未找到 缺少依赖 容器中apt install(检查rabin2 -l
r2 pdg未知命令 r2ghidra未安装 r2pm -ci r2ghidra
axtj的空xrefs 浅层分析 使用aa; aac或手动af @addr
Docker挂载为空 Colima//tmp问题 使用~/path而不是/tmp/path
容器中strace失败 ptrace未实现 使用LD_DEBUG=files,libs

r2 “无法打开文件”

# 检查权限
ls -la binary

# 尝试使用显式格式
r2 -b 32 binary

QEMU “无效的ELF图像”

# 验证架构匹配
file binary

# 检查QEMU变体
qemu-arm --help | grep -i "target"

Docker “exec format error”

# 注册binfmt处理器(一次性设置)
docker run --rm --privileged --platform linux/arm64 \
  tonistiigi/binfmt --install arm

# 验证注册
cat /proc/sys/fs/binfmt_misc/qemu-arm

GDB “无法执行二进制文件”

# 使用QEMU作为gdbserver
qemu-arm -g 1234 ./binary &
gdb-multiarch -ex "target remote :1234" ./binary

Ghidra “内存不足”

# 在analyzeHeadless脚本中增加堆
# 或明确传递:
analyzeHeadless ... -max-cpu 4 -analysisTimeoutPerFile 600

QEMU中缺少ARM库

# 在QEMU环境中设置LD_LIBRARY_PATH
qemu-arm -E LD_LIBRARY_PATH=/lib:/usr/lib -L /sysroot ./binary

# 或使用patchelf修改二进制文件的rpath
patchelf --set-rpath /lib:/usr/lib ./binary

Docker容器找不到库

# 容器内,安装常见依赖
apt-get update && apt-get install -y libcap2 libacl1

# 检查二进制文件需要什么
# (在主机上运行rabin2 -l之前进入容器)

版本建议

工具 最低 推荐
radare2 5.8.0 最新
QEMU 7.0 8.0+
GDB 12.0 14.0+
Ghidra 10.3 11.0+
Frida 16.0 最新

环境变量

添加到~/.bashrc~/.zshrc

# Ghidra
export GHIDRA_HOME=/opt/ghidra
export PATH=$PATH:$GHIDRA_HOME/support

# QEMU的默认系统根
export QEMU_LD_PREFIX=/usr/arm-linux-gnueabihf

# Angr虚拟环境
alias angr-activate='source ~/angr-venv/bin/activate'