工具

cpu_rec CPU 指令集统计识别工具

对任意二进制文件(例如来历不明的固件镜像)中的 CPU 指令集进行统计识别:把字节的马尔可夫链统计与默认语料库比较,语料库涵盖数十种架构,从 6502、8051 到 ARM、MIPS、PowerPC、RISC-V、x86-64 和 WebAssembly。它先给出整个文件的匹配结果,再找出与单一架构匹配的最大数据块,并显示熵值,以便排除加密或压缩区域。可独立运行,也可作为 Python 函数或 binwalk 模块使用。

使用条件与局限

  • 审阅时最新版本为 v1.1,发布于 2024-03-19,标签正对应所审阅的提交;该版本新增可选的 pickle 语料缓存以加快启动,并可用 LIEF 代替 elfesteem。没有安装包:只需把 cpu_rec.py 和 cpu_rec_corpus 目录复制到同一目录。
  • 可在 Python 3 或 Python 2 上运行;可移植性工作流在 Ubuntu 和 macOS 上测试 Python 3.10、PyPy 2.7 与 3.9 以及 GraalPy。若没有 lzma 模块,需先解压 .xz 语料文件。可选的 elfesteem 或 LIEF 能提取 ELF、PE、Mach-O 或 COFF 文件的代码段。README 称在作者的笔记本上,每 MB 约需一分钟分析时间,为 70 种架构建立签名需要 1 GB 内存。
  • binwalk 模式需安装到 binwalk 的模块目录,并要求 binwalk 包含 devttys0/binwalk 第 241 号合并请求的补丁;这些说明针对的是早期的 Python 版 binwalk,未核实其与当前基于 Rust 的 v3 是否兼容。
  • 结果属于启发式判断:README 提醒,一个文件可能包含多种架构,小数据块可能被误判,熵值高于 0.9 的数据所得结果大概没有意义。78k 和 TriCore 因许可问题未收入默认语料库,只能由使用者用自有二进制补充。
  • cpu_rec.py 采用 Apache-2.0 许可。README 说明默认语料库是由各自带有许可的代码块组成的复合作品,主要来自 Debian、BusyBox、C-Kermit 和作者自行交叉编译的开源程序,另有少数许可不明的代码块,其中包括 Dell 分发的一个 H8S 二进制;build_default_corpus 记录了每一块的来源。本次未分析任何文件。

关于此条目

类型
工具
类别
固件工具
关联
基础工具
目标
二进制 · 固件

来源复核于

说明已依据一手来源复核;这不代表已运行验证、经过安全审计或确认兼容。

一手来源

  1. README.md GitHub · airbus-seclab/cpu_rec · 修订 6b19239
  2. README.md#L7-L76 GitHub · airbus-seclab/cpu_rec · 修订 6b19239
  3. README.md#L140-L151 GitHub · airbus-seclab/cpu_rec · 修订 6b19239
  4. README.md#L233-L296 GitHub · airbus-seclab/cpu_rec · 修订 6b19239
  5. cpu_rec.py#L329-L516 GitHub · airbus-seclab/cpu_rec · 修订 6b19239
  6. cpu_rec.py#L517-L645 GitHub · airbus-seclab/cpu_rec · 修订 6b19239
  7. .github/workflows/portability.yml GitHub · airbus-seclab/cpu_rec · 修订 6b19239
  8. LICENCE GitHub · airbus-seclab/cpu_rec · 修订 6b19239
  9. https://github.com/airbus-seclab/cpu_rec/releases/tag/v1.1
  10. https://www.sstic.org/2017/presentation/cpu_rec/