最近给团队搭逆向分析环境又一次卡在pip install angr上屏幕上飘着一堆红字什么build failed、Cannot install packages、No matching distribution found看得人脑子嗡嗡的。这已经不是第一次了新同事第一次装 angr 基本都会被这些环境问题劝退。但实际走通一遍之后你会发现所谓“缺少环境”其实就集中在几个点上花二十分钟把这些点理顺angr 就能安安静静地跑起来。这篇文章不是官方文档翻译是我自己踩完坑之后的记录从问题成因讲到完整操作步骤再补充一些报错排查经验。不管你是要做 CTF 逆向、二进制自动化分析还是想在课程作业里用符号执行照着这套流程走基本能省下半天瞎折腾的时间。1. 项目概述与需求拆解1.1 angr 到底是什么为什么值得装angr 是一个基于 Python 的二进制分析框架核心能力是符号执行、动态污点分析、程序路径探索、漏洞挖掘等等。它能读入一个二进制文件自动构建程序的状态空间然后顺着条件分支去探索各种可能的执行路径最后帮你算出某个特定路径上需要什么样的输入。举个例子CrackMe 类题目里那种“输入一个序列号程序内部做一堆校验对了一次才打印 flag”的场景用 angr 可以跳过人工逐步分析直接让它搜索到“打印 flag”的路径然后把输入约束交给 z3 求解器几秒钟就能得到答案。对于逆向工程师和安全研究员来说angr 还能用来做二进制批量分析、函数调用约定识别、反混淆、patch 自动化验证等工作。虽然它的执行效率不如原生调试器但“自动化”和“可编程”这两个特性让它成为工具箱里不可替代的角色。1.2 所谓“缺少环境”到底缺什么很多同学在终端里敲下pip install angr看到的错误五花八门但归类后无非是这么几类Python 版本与依赖包不兼容。angr 依赖 claripy、z3-solver、pyvex 等一堆底层包这些包对 Python 版本有明确要求版本太老或太新都可能失败。系统缺少编译工具链。angr 的部分核心组件在 PyPI 上没有预编译的 wheel 包需要从源码构建此时系统里必须有 gcc、make、Python 头文件等。缺少动态链接库。比如 libffi、libssl、zlib 这些缺少了会导致构建过程报错。网络连接不稳定下载超时或源地址太远导致包下载失败。环境中已经存在互相干扰的包例如旧版本的 z3 或 unicorn 与 angr 依赖冲突。这些问题的本质不是 angr 本身有多难装而是我们没有一个干净、完整、可预期的 Python 环境。1.3 这篇文章适合谁参考如果你是刚接触 angr 的新手准备在自己的电脑上配置开发环境那么这篇里的每一步你都可以直接照做如果你已经装了一半卡在某个报错上可以直接跳到第 4 节对照错误提示找解决方案如果你在用的是 Windows、macOS、Linux 中的某一类系统我在每个关键步骤里会标注不同系统的差异省得你再到处查。2. 环境问题成因深度解析2.1 Python 版本与 angr 的兼容性angr 官方对 Python 版本的支持范围不是无限宽。以当前的主要版本来看angr 9.x 和 10.x 都要求 Python 3.9 以上不过实际上从 Python 3.8 到 3.11 都能正常安装运行。Python 3.12 在某些依赖包上可能存在 wheel 缺失的问题Python 3.6 及以下版本更是早就被抛在支持列表外了。如果你用的是系统自带的 Python先确认版本号python3 --version如果版本低于 3.8我建议不要折腾系统 Python而是直接去装一个 Anaconda 或者 Miniconda用它来建立独立的环境。为什么要强调这一点因为 angr 的依赖关系比较敏感尤其是 z3-solver 这个库它在 conda 和 pip 两套体系下的版本差异特别容易导致导入失败。如果系统 Python 被全局安装了一堆其他包那 angr 的依赖树很容易被莫名打乱常见表现就是import angr时报ModuleNotFoundError或奇怪的 API 缺失。所以核心原则是永远不要直接用系统全局 Python 来装 angr除非你能保证这个环境是全新的、最小化的。对于大多数认真使用 angr 的场景新建一个虚拟环境是唯一的稳妥方案。2.2 系统级编译依赖的缺失angr 不是一个纯 Python 实现的框架它以原生代码为核心例如pyvex负责将 VEX 中间表示转换成 Python 可调用的接口底层需要 C 语言编译。unicorn是一个 CPU 模拟器内核同样需要编译原生组件。z3-solver是微软出品的约束求解器PyPI 上的预编译 wheel 基本够用但在某些平台上仍可能触发编译流程。在 Linux 上如果缺少gcc、g、make和 Python 开发头文件构建过程会直接失败错误信息里通常会出现gcc: command not found或Python.h: No such file or directory。macOS 上则常见xcrun: error: invalid active developer path提示我们没有安装 Xcode Command Line Tools。Windows 上常见的报错是Microsoft Visual C 14.0 is required意味着缺少 VC 编译工具链。很多人的第一反应是去查 angr 的语法却忽略了这个最基础的“缺少环境”问题。说难听点这些编译依赖比你 Python 里少了什么包重要得多因为它们是所有二进制组件能否构建的底座。2.3 包管理器与镜像源的影响另一个容易被忽视的点是网络环境。pip install angr需要从 PyPI 拉取大量依赖包默认源在海外如果不做任何配置下载过程可能频繁超时或者卡在某个大文件上。这时 pip 重试几次之后直接放弃用户看到的报错就是Could not find a version that satisfies the requirement angr看起来像是包不存在实际上根本没下载成功。解决方式就是配置国内镜像源或者缩短超时时间。国内常用清华 PyPI 镜像或者阿里云镜像。注意这里说的完全是正常的软件源配置不涉及任何特殊网络手段。配置后下载速度通常能提升一个数量级时间从十几分钟缩短到一两分钟。另外pip自身的版本也值得检查。老版本的 pip 解析依赖的策略比较僵硬推荐升级到最新版python -m pip install --upgrade pip3. 完整解决流程与实操步骤3.1 第一步创建干净的虚拟环境我个人的习惯是使用 Anaconda 来管理 angr 环境因为 conda 本身对 z3 等二进制库有预编译包支持环境隔离也比 venv 更彻底。当然你也可以直接用 Python 自带的venv只要能保证环境干净即可。下面两种方式任选其一。方式一使用 venv适合不想装 Anaconda 的人cd ~/tools python3 -m venv angr-env source angr-env/bin/activateWindows 下激活命令是angr-env\Scripts\activate。注意这一步之后你的 shell 前缀会变成(angr-env)后续所有命令都要在虚拟环境里执行否则装到系统环境里后面又乱了。方式二使用 condaconda create -n angr python3.9 -y conda activate angr为什么建议用 conda因为 angr 的依赖里面有个经常让人崩溃的包叫claripy它与z3-solver的组合在纯 pip 下偶尔需要手动调整版本。而 conda 在创建环境时会把满足 angr 要求的 z3 版本一并解决掉后续报错概率低不少。如果你之前在别的环境里装过 angr务必清理掉避免跨环境干扰。3.2 第二步安装系统级依赖虚拟环境创建好后先别急着pip install angr。我强烈建议先检查编译工具链。LinuxDebian/Ubuntu 系sudo apt update sudo apt install -y build-essential python3-dev libffi-dev libssl-devbuild-essential包含 gcc、g、makepython3-dev提供 Python 头文件libffi-dev和libssl-dev是 pyvex 和 cryptography 等组件的依赖。如果是 CentOS/RHEL对应命令是yum install gcc gcc-c make python3-devel libffi-devel openssl-devel。macOSxcode-select --install这会安装 Apple 的 Command Line Tools其中包含编译器和 make。如果之前装过 Xcode可能已经存在执行后提示not installed也没关系再确认一下编译环境。brew install libffiWindows关键一步是安装 Visual C Build Tools。可以直接安装 Visual Studio 2019/2022 Community 版本并在组件里勾选“使用 C 的桌面开发”。不想装整个 VS 的话也可以单独下载 Build Tools 安装程序选中“C 构建工具”那一项。这些依赖装好之后最好重启一下终端或者重新激活虚拟环境让新安装的工具链生效。我在 Ubuntu 上遇到过装完build-essential后终端还报gcc not found就是因为当前 shell 没有刷新 PATH。3.3 第三步使用 pip 安装 angr现在进入正题。先用镜像源安装 angrpip install angr -i https://pypi.tuna.tsinghua.edu.cn/simple如果不想每次加-i参数可以写入 pip 配置。Linux/macOS 配置文件在~/.pip/pip.confWindows 在%APPDATA%\pip\pip.ini内容如下[global] index-url https://pypi.tuna.tsinghua.edu.cn/simple timeout 60安装过程中pip 会自动解析依赖。正常情况下会拉取claripy9.0、z3-solver、pyvex、archinfo、unicorn、capstone、networkx等一组包。如果是首次安装建议盯住屏幕重点观察有没有某个包开始“编译”而不是直接下载 wheel。一旦看到大量Building wheel for pyvex (setup.py)以及gcc相关的编译输出说明编译工具链正常耐心等待即可。如果看到ERROR: Could not build wheels for pyvex, which is required to install pyproject.toml-based projects说明编译失败回到 3.2 检查系统依赖。安装完成的标志是Successfully installed angr-...以及一堆依赖包的版本列表。到此angr 本体已经安装好了。3.4 第四步验证安装并运行一个简单示例安装完成后第一时间验证导入是否正常python -c import angr; print(angr.__version__)如果能输出版本号比如10.1.0.0说明导入成功。接下来跑一个经典例子确认整个符号执行链路没有损坏。假设当前目录下有一个编译好的二进制test我们需要利用 angr 判断输入哪些字符可以让程序打印SUCCESS。import angr project angr.Project(test, auto_load_libsFalse) initial_state project.factory.entry_state() simgr project.factory.simulation_manager(initial_state) simgr.explore(findlambda s: bSUCCESS in s.posix.dumps(1), avoidlambda s: bFAIL in s.posix.dumps(1)) if simgr.found: solution_state simgr.found[0] print(Found input:, solution_state.posix.dumps(0)) else: print(No solution found)这段代码的意思是从程序入口开始探索所有路径找到一个输出包含SUCCESS的状态然后把该状态下标准输入的内容打印出来。如果结果输出了一串字符串说明 angr 的核心自动化分析流程没有环境问题环境配置正式完成。4. 常见问题与排查技巧实录我在装 angr 的过程中以及帮同事排查时遇到过很多重复的报错。这里把高频问题整理成一张表方便你直接对照找解法。报错提示根本原因解决方法ModuleNotFoundError: No module named angr当前 Python 环境不是安装 angr 的那个虚拟环境检查是否激活了虚拟环境which python确认路径Could not build wheels for pyvex缺少编译工具链或 Python 头文件安装 build-essential/python3-dev/libffi-devWindows 装 VC Build Toolsgcc: command not found编译器未安装Linux 装 gcc/gmacOS 执行 xcode-select --installPython.h: No such file or directory缺少 Python 开发头文件Linux 安装 python3-devWindows 安装 Python 开发头需要勾选“下载开发工具”error: Microsoft Visual C 14.0 is requiredWindows 缺少 C 编译组件安装 vs_buildtools勾选 C 桌面开发TimeoutError/Connection refused网络下载失败配置国内镜像源或增大 pip 超时时间ImportError: cannot import name get_archangr 依赖包版本不匹配例如 archinfo 与其他包版本不一致重新升级 angr 全部子组件pip install --upgrade angrDependency conflict: angr 10 requires z3-solver4.8.x, but you have ...环境中存在不兼容的 z3 版本删除现有环境用 conda 创建新环境并重新安装AttributeError: module claripy has no attribute solvers旧版本的 claripy 残留卸载重装pip uninstall angr claripy pyvex archinfo然后重装Killed: 9macOS安装过程中内存不足或 Python 崩溃换用 conda 环境安装尽量少同时运行大型程序下面对其中几个比较隐蔽的问题多说几句。4.1 环境激活到底验没验证我见过很多次“明明装上了却 import 不了”的情况罪魁祸首就是没有激活虚拟环境。在命令行里敲python之前先敲which python。如果路径是/usr/bin/python说明你根本没在虚拟环境里。正确的路径应该类似于/home/user/tools/angr-env/bin/python或者/opt/anaconda3/envs/angr/bin/python。4.2 编译失败后怎么看到真正的错误原因当pip install angr报错时输出末尾往往只有一行总结真正的错误藏在前面很长一段编译日志里。你需要向上滚动找到类似stdout、stderr的段落里包含的第一个error:或fatal error:。比如 Linux 下如果看到这样一段pyvex/src/pyvex/head.rs: some error...那可能不是 C 依赖问题而是 Rust 工具链缺失。angr 的部分新组件例如 thetacore用 Rust 编写但大多数情况下 pip 会自动下载 Rust 工具如果你的网络差就会在这里卡住。解决方式是先单独安装rustcurl https://sh.rustup.rs -sSf | sh然后重新安装。这个点比较特殊只有少数版本会遇到。4.3 升级 angr 后旧环境彻底崩了angr 更新非常频繁有时一周发一个版本依赖的 API 变化很快。有个同事从 8.x 直接升级到 10.x 之后原来的angr.Project用不了了报各种缺失属性。这种情况最省事的做法不是去一个一个 pip 降级而是直接把环境删了重建。conda remove -n angr --all conda create -n angr python3.9 -y conda activate angr pip install angr唯一需要记住的是先自己把原来写的分析脚本保存好环境重建后脚本里的部分 API 可能需要小改但那属于代码兼容性问题不是环境问题了。4.4 使用官方 Docker 镜像的无脑方案如果你不关心安装过程只希望立刻有一个能跑 angr 的环境官方其实提供了 Docker 镜像angr/angr。拉取并进入交互式 shelldocker pull angr/angr docker run -it --rm -v $(pwd):/workdir angr/angr在容器里python直接就能 import angr而且镜像里还预装了大量逆向工具比如 binutils、gdb、radare2。这个方案带来的另一个好处是所有依赖都是官方适配的永远不会出现环境不匹配问题。缺点就是容器启动和磁盘占用稍高但对大多数分析任务来说这个代价完全值得。5. 实操心得与几个小建议angr 的环境问题解决起来不算复杂但需要你有一个“环境洁癖”的心态。我后来自己在日常使用里形成了一套固定流程创建 conda 环境、装系统依赖、用镜像源安装、跑一圈示例确定没问题然后再写代码。这套流程在 Ubuntu、Windows WSL、macOS 上都成功复现过基本没有额外意外。最后分享三个小技巧都是我实际用的时候总结出来的。第一个安装的时候不要一次性装太多版本相关的东西angr 本身就带有一堆子包你手动再装一个指定版本的z3很容易把依赖树弄乱。让 pip 或 conda 自己决定版本是最好的。第二个如果用的不是 Docker 镜像而是本地环境建议在写脚本时保留一个常用的Project构造函数参数默认值比如auto_load_libsFalse。很多人发现 angr 分析运行时系统库 libc 被加载后产生大量符号路径让求解变得超级慢这一步其实和环境关系不大但对用户体验影响很大。第三个多对照官方文档。angr 的 API 文档就像一个字典装好环境之后没事翻一翻。尤其是state、simgr、solver这三大件很多东西不用看博客直接看函数签名就能明白。环境问题只是一次性的门槛跨过之后真正值得投入时间的是怎么把 angr 用在具体问题上那才是这个框架的威力所在。按照上面的流程从零开始装一个能正常工作的 angr 环境快的话十分钟分钟左右就能结束。装好后试着用 angr 分析一个简单的 crackme感受一下符号执行自动化找输入的流程比单纯跑通安装命令更有成就感。
阅读完成 · 觉得有帮助?