g0vguy/RustPEek

GitHub: g0vguy/RustPEek

逐字节对比两个 Windows PE 文件并在交互式终端中展示差异区域的 RVA、VA、偏移量和原始字节的 CLI 工具。

Stars: 0 | Forks: 0

# RustPEek 一款 CLI 工具,用于逐字节对比两个 Windows PE 文件,并在交互式终端 UI 中展示差异。每个改动区域都会显示其 RVA、VA、文件偏移量、原始字节和节区名称。 ## 构建 **前置条件:** 通过 [rustup](https://rustup.rs) 安装 Rust 1.86+ ``` git clone https://github.com/g0vguy/RustPEek cd RustPEek cargo build --release # 二进制文件: target/release/RustPEek.exe ``` ## 用法 ``` RustPEek [OPTIONS] ``` | 标志 | 描述 | |------|-------------| | `-f, --format ` | 输出格式(默认:`table`) | | `-o, --output ` | 将报告写入文件,而不是打开 TUI | | `-s, --section ` | 过滤特定的节区,例如 `.text` | | `-b, --min-bytes ` | 仅显示有 ≥ N 个字节改动的差异 | ## 交互式 TUI 不带 `--output` 运行会打开全屏终端 UI。 ``` RustPEek original.exe patched.exe ``` ``` ┌ RustPEek ──────────────────────────────────────────────────────────────────┐ │ Original : original.exe Modified : patched.exe Diffs: 3 │ └────────────────────────────────────────────────────────────────────────────┘ ┌ Diff Results ──────────────────────────────────────────────────────────────┐ │ RVA VA File Offset Original Bytes Modified ... │ │─────────────────────────────────────────────────────────────────────────── │ │▶ 0144C99C 00018144C99C 0144BD9C 0F 84 28 0F 00 90 90 90 ... │ │ 0144CA10 00018144CA10 0144BE10 74 05 90 90 │ │ 00A3F120 000180A3F120 00A3E520 8B 45 08 83 C0 B8 01 00 ... │ └────────────────────────────────────────────────────────────────────────────┘ ↑↓ navigate y copy row q / Esc quit ``` ### 快捷键 | 按键 | 操作 | |-----|--------| | `↑` / `k` | 向上移动 | | `↓` / `j` | 向下移动 | | `g` / `Home` | 跳转到第一行 | | `G` / `End` | 跳转到最后一行 | | `y` | 复制选中行到剪贴板 | | `q` / `Esc` | 退出 | 按下 `y` 会将选中行作为制表符分隔的值复制——可以直接干净地粘贴到 Excel、Notepad 或 IDA 中。 ## 文件导出 跳过 TUI 并直接写入文件: ``` # JSON RustPEek orig.exe patched.exe --format json --output report.json # CSV RustPEek orig.exe patched.exe --format csv --output report.csv # 纯文本表格 RustPEek orig.exe patched.exe --output report.txt ``` ## 过滤 ``` # 仅 .text 内的差异 RustPEek orig.exe patched.exe --section .text # 仅 4 个及以上连续改变的字节 RustPEek orig.exe patched.exe --min-bytes 4 # 两者结合 RustPEek orig.exe patched.exe --section .text --min-bytes 4 ``` ## 输出字段 | 字段 | 描述 | 示例 | |-------|-------------|---------| | RVA | 相对虚拟地址 | `0144C99C` | | VA | 虚拟地址 (ImageBase + RVA) | `00018144C99C` | | File Offset | 距文件起始处的原始字节偏移量 | `0144BD9C` | | Original Bytes | 原始文件的十六进制字节 | `0F 84 28 0F 00 00` | | Modified Bytes | 修改后文件的十六进制字节 | `90 90 90 90 90 90` | | Section | 从 1 开始的索引和名称 | `1\|.text` | 位于任何已知节区之外的地址将显示为 `?|unknown`。 ## 项目结构 ``` src/ ├── main.rs — CLI (clap v4), orchestration ├── pe_parser.rs — PE loading via goblin, section table extraction ├── address.rs — FileOffset ↔ RVA ↔ VA conversions, section lookup ├── differ.rs — byte comparison, contiguous run grouping └── output.rs — ratatui TUI, CSV, JSON formatters ``` ## 支持的 PE 格式 - PE32 (32位) - PE32+ / PE64 (64位) ## 待办事项 - [ ] `--context ` — 显示每个差异区域前后各 N 个字节 - [ ] `--ignore-section ` — 排除干扰节区,如 `.rsrc` 或 `.reloc` - [ ] 补丁模式检测 — 自动标记常见模式(`NOP sled`、`JMP patch`、`ret stub`) - [ ] Hex dump 详情面板 — 分屏显示,带有内联高亮改动字节的所选区域的十六进制转储 - [ ] `/` 搜索 — 在不离开 TUI 的情况下按节区名称或字节模式过滤行 - [ ] `e` 导出 — 从 TUI 内部将当前过滤后的视图保存到文件 - [ ] 每个差异区域的熵值变化 — 标记补丁看起来是 shellcode 还是简单的 NOP - [ ] PDB 提示 — 如果 PE 中嵌入了 PDB 路径,将其显示出来,以便用户知道有可用的符号 - [ ] `--diff-only-headers` — 仅对比 PE 头,跳过节区数据
标签:DAST, PE文件比较, PE格式, Rust, RVA, TUI, URL发现, VA, 二进制审计, 二进制差异分析, 云资产清单, 交互式终端, 代码分析, 凭证管理, 可视化界面, 安全检测, 恶意软件分析, 文件偏移, 文件对比, 漏洞分析, 网络流量审计, 补丁对比, 路径探测, 逆向工程, 通知系统