Cyifer007/x64lens
GitHub: Cyifer007/x64lens
x64lens 是一个汇编优先的 ELF64 x86_64 二进制分析工具,通过 gadget 发现、语义分类和缓解机制评估帮助研究人员判断二进制文件的可利用性和硬化姿态。
Stars: 3 | Forks: 0
# x64lens
**x64lens 是一个汇编优先的 ELF64 x86_64 二进制分析工具,用于识别与漏洞利用相关的代码原语,对其进行语义有用性分类,评估缓解机制上下文,并为攻击性研究、防御性分类和二进制硬化评估生成可复现的报告。**
## 项目存在的原因
x64lens 起源于一个狭隘但深思熟虑的前提:从汇编层向上构建二进制可利用性分析的热点路径。其初始目标并非完全取代 ROPgadget、Ropper、radare2、Ghidra、angr 或其他成熟的框架。相反,其目标是构建一个专注、透明、快速且可供研究测量的分析器,执行以下操作:
1. ELF64 x86_64 解析。
2. 可执行区域发现。
3. Gadget 候选项扫描。
4. 语义原语分类。
5. 结合缓解机制的可利用性解释。
6. 可复现的文本和 JSON 报告。
7. 与现有工具的基准对比。
该设计有意将**速度优先的扫描引擎**与**语义可利用性价值层**分离开来。
## 研究框架
该项目评估了一个轻依赖、汇编优先的分析器是否能改善网络基础设施软件的静态二进制可利用性分类、安全构建验证以及二进制硬化评估。
主要研究问题:
1. **性能:** 汇编优先的 ELF64 x86_64 gadget 发现引擎能否在运行时间和内存效率上超越现有的 ROP gadget 工具,同时保持相当的 gadget 发现覆盖率?
2. **语义价值:** 语义原语分类和缓解感知评分能否提供比仅进行原始 gadget 枚举更具可操作性的二进制可利用性分类?
3. **企业采用:** 静态、轻依赖、汇编优先的二进制分析器能否集成到 CI/CD 或漏洞管理工作流中,从而帮助根据硬化姿态和 exploit 原语可用性来确定二进制文件的优先级?
## 初始范围
`0.1.x` 版本的目标:
- ELF64。
- x86_64。
- Linux。
- 静态本地二进制分析。
- NASM 优先实现。
- 基于模式的 gadget 发现。
- 人类可读和 JSON 输出。
- 受控的基准比较。
## 初始研究原型的明确非目标
第一阶段的实现**不**尝试提供:
- 完整的 exploit 生成。
- Payload 生成。
- 远程目标交互。
- 恶意软件部署或执行。
- 完整的 x86_64 指令解码器。
- 符号执行。
- 多架构支持。
- 动态追踪。
- 自动漏洞发现。
这些可能成为未来的研究方向,但不属于初始实现契约的一部分。
## 工具名称决定
在第一个主要阶段,`x64lens` 这个名称有意保持狭隘。该工具最初是作为深入了解 x86_64 ELF 二进制文件的镜头。如果该项目以后发展成为一个多架构平台,可以在同一个代码库下添加特定架构的引擎,或者该项目以后可以采用更广泛的统称。目前,`x64lens` 使最初的研究贡献保持精确、易于搜索且在技术上诚实。
参见 [`docs/adr/0001-tool-name.md`](docs/adr/0001-tool-name.md)。
## 当前实现进度检查点
Patch 017 将已实现的 pipeline 推进到评分和初始 JSON 输出;Patch 018 加强了围绕该 pipeline 的验证:
```
ELF64 validation -> program-header analysis -> executable-region mapping -> raw gadget scanner -> exact suffix pattern matcher -> semantic classifier -> scoring -> text/JSON reporting
```
当前的 `gadgets` 命令报告以原始终止符为中心的字节窗口、精确的后缀模式标签、保守的语义分类、受控寄存器位图、堆栈增量、启发式评分、原语覆盖计数以及初始基于 schema 版本的 JSON。这仍然不是完整的指令解码,并且不会输出可利用性结论。
参见 [`docs/roadmap-12-sprints.md`](docs/roadmap-12-sprints.md) 以获取扩展的学期路线图。
## 面向评审者的设计姿态
当前计划将常见的评审者异议视为设计输入,而不是后期的意外情况。
关键的规划承诺:
- NASM 是经过评估的实现选择,而不是假设的优越性证明。
- 解析器安全性是强制性的设计约束,因为该工具会解析不受信任的二进制文件。
- 精确后缀匹配是 Sprint 3 阶段的特性,而不是完整的指令解码器。
- 原始候选项计数、精确模式计数、语义原语计数和已评分的 gadget 计数是独立的指标。
- 外部工具首先是基准比较的基线,而不是必需的 runtime 依赖项。
- ARM64、PE、Mach-O、完全解码和嵌入式解码器支持仍然是未来的接缝,而不是近期的范围蔓延。
参见 [`docs/design/`](docs/design/) 和 [`docs/adr/0005-reviewer-readiness-and-future-seams.md`](docs/adr/0005-reviewer-readiness-and-future-seams.md) 下的规划说明。
## 当前 CLI 契约
计划的早期命令:
```
x64lens info
x64lens mitigations
x64lens gadgets [--format text|json] [--max-depth N]
x64lens analyze
x64lens bench
x64lens version
```
计划的早期全局标志:
```
--format text|json
--max-depth
--badbytes
--quiet
--verbose
--no-color
--schema-version
```
参见 [`docs/cli-contract.md`](docs/cli-contract.md)。
## 构建
### 要求
- Linux x86_64。
- `make`。
- `nasm`。
- 来自 binutils 的 GNU `ld`。
- `gcc`,仅用于测试语料库编译。
### 构建命令
```
make
```
### 运行当前实现
```
./build/x64lens version
./build/x64lens help
make samples
./build/x64lens info ./tests/bin/minimal_nopie
./build/x64lens info /bin/ls
./build/x64lens mitigations ./tests/bin/minimal_nopie
./build/x64lens mitigations ./tests/bin/minimal_pie_canary
./build/x64lens gadgets ./tests/bin/gadgets
./build/x64lens gadgets --max-depth 4 ./tests/bin/gadgets
./build/x64lens gadgets --format json --max-depth 4 ./tests/bin/gadgets > /tmp/x64lens-gadgets.json
python3 -m json.tool /tmp/x64lens-gadgets.json >/dev/null
make semantic-smoke
make json-smoke
make system-smoke
make validation-smoke
```
`info` 命令以只读方式映射目标文件,验证 ELF64 x86_64 身份,并打印基本的 ELF header 元数据。`mitigations` 命令在该路径的基础上构建,通过解析程序头、识别可执行的 `PT_LOAD + PF_X` 区域,并报告基本的缓解指标,例如 PIE、NX stack、RELRO 的存在、RWX load 段以及动态链接。`gadgets` 命令扫描可执行区域以查找原始的 `ret` 和 `ret imm16` 候选项,报告有边界的字节窗口,标记精确的字节模板模式(如 `pop rdi; ret`、`leave; ret` 和 `syscall; ret`),然后将支持的精确模式映射到首轮语义原语类和启发式分数中。`--format json` 输出机器可读的记录,包含明确的计数、原语覆盖范围、已评分的候选项和局限性。
### 运行测试
```
make test
```
### 夹具、JSON、系统二进制验证和基准冒烟测试
Sprint 3 增加了一个解释性的夹具验证器和首个扫描器冒烟基准测试。这些独立于 `make test`,以便它们可以在不减慢默认回归路径的情况下保留更丰富的证据。
```
make validate-gadget-fixture
make arena-smoke
make semantic-smoke
make json-smoke
make system-smoke
make validation-smoke
RUNS=5 MAX_DEPTH=4 make bench-scanner-smoke
```
夹具验证器将 `tests/bin/gadgets` 的 `x64lens gadgets` 输出与 `objdump -d -Mintel` 进行比较,现在还会验证首轮语义分类器事实。冒烟基准测试将 TSV 结果和元数据写入 `benchmarks/results/` 下,包括原始候选项计数、精确模式计数、语义原语计数、已评分候选项计数和未知候选项计数。除非有意将其提升为有文档记录的基准工件,否则这些生成的结果会被 Git 忽略。
冒烟基准测试仅供开发证据使用。在没有完整的基准测试方法论、基线工具、语料库清单、重复试验和环境元数据的情况下,请勿将其用作发表声明。
## Docker 和 devcontainer 工作流
首选的日常开发环境是 WSL2 Ubuntu 24.04。Docker 是用于评审者设置、CI 冒烟测试和未来 benchmark harness 验证的复现层。
构建开发镜像:
```
make docker-build
```
打开一个 shell,而不会在绑定挂载的代码库中创建 root 拥有的文件:
```
make docker-shell
```
检查 Docker 可用性并运行完整的容器冒烟测试:
```
make docker-available-check
make docker-test
```
如果 `docker-available-check` 失败,请在将 `docker-test` 视为实现失败之前,修复 Docker Desktop WSL 集成或 Docker Engine 的可用性。
如果在 `build/` 下执行 `make clean` 因 `Permission denied` 而失败,可能是由于 Docker 容器以 root 用户身份对绑定挂载的代码库运行了操作。使用以下命令修复本地生成工件的所有权:
```
sudo chown -R "$(id -u):$(id -g)" build tests/bin tests/toy-src
make clean
```
参见 [`docs/troubleshooting.md`](docs/troubleshooting.md)。
## 开发节奏
该项目在初始研究和实现阶段遵循两周一次的 sprint 节奏。
1. Sprint 1:代码库、构建系统、CLI 骨架、文件映射、ELF64 验证和基本的 `info` 报告。
2. Sprint 2:程序头、可执行区域和基本缓解措施。已完成并在本地验证。
3. Sprint 3:原始 gadget 候选扫描器、扫描器冒烟基准测试、由 arena 支持的候选项存储以及精确的字节模板模式匹配。
4. Sprint 4:语义原语分类器和原语覆盖摘要。已完成至 Patch 015 验证。
5. Sprint 5:评分、JSON 输出、语义夹具强化、验证强化、benchmark harness、比较工具。Patch 017 实现了首个评分和 JSON 切片;Patch 018 加强了围绕它的验证。
6. Sprint 6:最终分析器、文档、基准测试结果、研究论文大纲。
参见 [`docs/sprints/`](docs/sprints/)。
## 目标输出示例
当前 `info` 的输出专注于 ELF 元数据:
```
x64lens 0.1.0-dev
Target: ./tests/bin/minimal_nopie
Format:
Type: ELF64
Endian: little
Machine: x86_64
ELF Type: ET_EXEC
Entry: 0x0000000000401050
Program header offset: 0x0000000000000040
Program header entry size: 0x0000000000000038
Program header count: 0x000000000000000d
Section header offset: 0x0000000000003640
Section header entry size: 0x0000000000000040
Section header count: 0x000000000000001f
File size: 0x0000000000003e00
```
当前 `mitigations` 的输出专注于程序头和加载器映射:
```
x64lens 0.1.0-dev
Target: ./tests/bin/minimal_nopie
Mitigations:
PIE: disabled
NX stack: enabled
RELRO: present
RWX load segment: no
Dynamic linking: yes
Program header count: 0x000000000000000d
LOAD segments: 0x0000000000000004
Executable LOAD regions: 0x0000000000000001
Executable regions:
- VA 0x0000000000401000, file offset 0x0000000000001000, file size 0x0000000000000161, mem size 0x0000000000000161, perms R-X
```
当前 Sprint 5 的 `gadgets` 输出将原始、精确、语义和已评分的事实分开:
```
x64lens 0.1.0-dev
Target: ./tests/bin/gadgets
Raw gadget candidates:
Max depth: 0x0000000000000008
Candidate capacity: 0x0000000000001000
Candidate count: ...
ret count: ...
ret imm16 count: ...
Exact pattern count: ...
Semantic primitive count: ...
unknown_candidate count: ...
arg_control count: ...
syscall_num_control count: ...
syscall_trigger count: ...
stack_pivot count: ...
alignment count: ...
Scored candidate count: ...
Register coverage: rax|rcx|rdx|rsi|rdi|rsp|r8|r9
- VA ..., file offset ..., window start ..., len ..., terminator: ret, pattern: pop rdi; ret, semantic: arg_control, regs: rdi, stack delta: 0x0000000000000010, score: 90, bytes: ...
```
模式标签仍然是精确的后缀标签,而不是完全解码的指令序列。语义分类和评分是保守的。结合缓解机制的可利用性解释和完整的解码器支持验证仍然是后续 sprint 的目标。
## 道德与安全
x64lens 旨在用于教育研究、防御性二进制分类、安全构建验证和授权的逆向工程。它不包含 exploit 投递、payload 生成、远程扫描或未经授权的目标交互。
参见 [`docs/ethics-and-safety.md`](docs/ethics-and-safety.md)。
## 许可证
Apache License 2.0。参见 [`LICENSE`](LICENSE)。
## Sprint 3 arena 分配器说明
Sprint 3 Patch 010 为分析记录引入了一个小型的由 mmap 支持的 bump allocator。第一个使用者是 `x64lens gadgets` 使用的原始 gadget 候选缓冲区。候选项容量仍然限制在 4096 条记录,但现在其存储由命令生命周期的 arena 拥有,而不是静态的 `.bss` 数组。这使得扫描器接口保持稳定,同时为后续 sprint 中处理更大的内部记录、JSON 暂存和基准工件做好准备。
## Sprint 3 模式匹配器说明
Sprint 3 Patch 011 将精确的字节模板模式标签添加到了原始 gadget 候选项中。这是一个模式匹配层,而不是语义分类器。该匹配器可识别小型后缀模板,如 `pop rdi; ret`、`pop rsi; ret`、`pop rdx; ret`、`pop rax; ret`、`leave; ret`、`syscall; ret` 和 `ret imm16`。
## Sprint 4 语义分类器说明
Sprint 4 Patch 015 添加了首轮分类器处理。`classifier.asm` 使用 `PATTERN_*` ID 并填充语义类、受控寄存器位图、堆栈增量、副作用标志、各类摘要计数和寄存器覆盖范围。不支持的模式仍为 `unknown_candidate`。
## Patch 14 规划说明
Patch 14 是一个规划和文档对齐补丁。它不会更改扫描器引擎。它记录了针对 NASM 实现、解析器安全性、解码器集成、指标边界、贡献者可维护性和长期路线图规划的面向评审者的基本原理和未来接缝。
## Sprint 4 验证说明
Patch 015 已在 WSL2 和 Docker 中使用受控的 `tests/bin/gadgets` 夹具、`make validate-gadget-fixture`、`make semantic-smoke`、扫描器冒烟基准测试以及 `/bin/ls` 真实二进制抽查进行了本地验证。语义分类器仍然基于精确后缀,不应将其描述为完整的指令解码。
已知的近期后续工作:
- 为 `pop rcx; ret`、`pop r8; ret`、`pop r9; ret` 和 `pop rsp; ret` 添加夹具覆盖,
- 在 JSON 以及可能的文本输出中更明确地表示未知的堆栈增量,
- 保持分数和 JSON 生成源自内部记录,而不是文本输出。
## Sprint 5 评分、JSON 和验证说明
Sprint 5 Patch 017 添加了首轮启发式评分和源自内部记录的基于 schema 版本的 `gadgets --format json` 输出。Patch 018 通过以下方式加强了验证:
- 通过 `tools/validate-json-report.py` 进行可重用的 JSON 报告验证,
- 通过 `make system-smoke` 进行真实的系统二进制冒烟验证,
- 通过 `make validation-smoke` 进行本地聚合验证,
- 通过 ` docker-available-check` 进行 Docker 环境分类,
- 通过 `make patch-bundle-hygiene` 进行补丁 ZIP 卫生验证。
补丁包应排除 `.git/`、`.local/`、`build/`、`tests/bin/`、生成的基准测试结果以及私人/课程文件。本地项目上下文应与公共源代码补丁分开分发。
标签:DNS 反向解析, ELF, ROP, x86_64, 二进制分析, 云安全运维, 云资产清单, 安全报告生成, 请求拦截, 逆向工程