encounter/objdiff
GitHub: encounter/objdiff
objdiff 是一款用于反编译项目的本地二进制差异对比工具,帮助开发者比较重构源码与原始目标文件的差异。
Stars: 438 | Forks: 60
# objdiff [![Build Status]][actions]
一款用于反编译项目的本地差异对比工具。灵感源自 [decomp.me](https://decomp.me) 和 [asm-differ](https://github.com/simonlindholm/asm-differ)。
功能特性:
- 对比整个对象文件:函数和数据
- 内置 C++ 符号 demangling(GCC, MSVC, CodeWarrior, Itanium)
- 源文件更改时自动重新构建
- 通过[配置文件](#configuration)集成项目
- 搜索和过滤对象,支持快速切换
- 点击高亮显示数值和寄存器
- 详细的进度报告(为 [decomp.dev](https://decomp.dev) 提供支持)
- WebAssembly API、[Web 界面](https://github.com/encounter/objdiff-web) 和 [Visual Studio Code 扩展](https://marketplace.visualstudio.com/items?itemName=decomp-dev.objdiff)(WIP)
支持平台:
- ARM (GBA, DS, 3DS)
- ARM64 (Switch)
- MIPS (N64, PS1, PS2, PSP)
- PowerPC (GameCube, Wii, PS3, Xbox 360)
- SuperH (Saturn, Dreamcast)
- x86, x86_64 (PC)
更多信息请参见[用法](#usage)。
## 下载
如需从源代码构建,请参见[构建](#building)。
### GUI
- [Windows (x86_64)](https://github.com/encounter/objdiff/releases/latest/download/objdiff-windows-x86_64.exe)
- [Linux (x86_64)](https://github.com/encounter/objdiff/releases/latest/download/objdiff-linux-x86_64)
- [macOS (arm64)](https://github.com/encounter/objdiff/releases/latest/download/objdiff-macos-arm64)
- [macOS (x86_64)](https://github.com/encounter/objdiff/releases/latest/download/objdiff-macos-x86_64)
对于 Linux 和 macOS,请运行 `chmod +x objdiff-*` 以使二进制文件可执行。
### CLI
CLI 二进制文件可在[发布页面](https://github.com/encounter/objdiff/releases)获取。
## 屏幕截图


## 用法
objdiff 对比两个可重定位对象文件(`.o`)。其工作原理如下:
1. **创建一个 `objdiff.json` 配置文件**,放在您的项目根目录下(或通过构建脚本生成)。
此文件列出了**项目中的所有对象**及其 target(“预期”)和 base(“当前”)路径。
2. **加载项目**到 objdiff 中。
3. **选择一个对象**,从侧边栏开始进行差异对比。
4. **objdiff 会自动:**
- 执行构建系统以编译 base 对象(从当前源代码)
- 对比两个对象并显示差异
- 监视源文件更改,并在检测到更改时重新构建
配置文件允许项目结构具有完全的灵活性——只要路径指定正确,您的构建目录可以具有任何布局。
详情请参见[配置](#configuration)。
## 配置
项目可以添加一个 `objdiff.json` 文件来自动配置该工具。配置文件必须位于
根项目目录。
如果您的项目有生成器脚本(例如 `configure.py`),强烈建议同时生成 objdiff 配置
文件。然后您可以将 `objdiff.json` 添加到 `.gitignore` 以防止其被提交。
```
{
"$schema": "https://raw.githubusercontent.com/encounter/objdiff/main/config.schema.json",
"custom_make": "ninja",
"custom_args": [
"-d",
"keeprsp"
],
"build_target": false,
"build_base": true,
"watch_patterns": [
"*.c",
"*.cc",
"*.cp",
"*.cpp",
"*.cxx",
"*.c++",
"*.h",
"*.hh",
"*.hp",
"*.hpp",
"*.hxx",
"*.h++",
"*.pch",
"*.pch++",
"*.inc",
"*.s",
"*.S",
"*.asm",
"*.py",
"*.yml",
"*.txt",
"*.json"
],
"ignore_patterns": [
"build/**/*"
],
"units": [
{
"name": "main/MetroTRK/mslsupp",
"target_path": "build/asm/MetroTRK/mslsupp.o",
"base_path": "build/src/MetroTRK/mslsupp.o",
"metadata": {}
}
]
}
```
### 模式
#### 构建配置
**`custom_make`** _(可选,默认值:`"make"`)_
如果项目使用不同的构建系统(例如 `ninja`),请在此处指定。构建命令将为 `[custom_make] [custom_args] path/to/object.o`。
**`custom_args`** _(可选)_
在对象路径之前传递给构建命令的附加参数。
**`build_target`** _(默认值:`false`)_
如果为 true,objdiff 将在对比之前构建 target 对象(例如 `make path/to/target.o`)。如果 target 对象默认不构建或可能根据项目配置发生变化,这非常有用。需要正确的构建系统配置。
**`build_base`** _(默认值:`true`)_
如果为 true,objdiff 将在对比之前构建 base 对象(例如 `make path/to/base.o`)。除非使用外部工具重新构建 base 对象,否则您不太可能需要禁用此选项。
#### 文件监视
**`watch_patterns`** _(可选,默认值:如上所列)_
要监视更改的 glob 模式列表([支持的语法](https://docs.rs/globset/latest/globset/#syntax))。当这些文件发生更改时,objdiff 会自动重新构建并重新比较对象。
**`ignore_patterns`** _(可选,默认值:如上所列)_
监视更改时要明确忽略的 glob 模式列表([支持的语法](https://docs.rs/globset/latest/globset/#syntax))。
#### 单元(对象)
**`units`** _(可选)_
如果指定,objdiff 会在侧边栏中显示一个对象列表以便于导航。每个单元包含:
- **`name`** _(可选)_ - UI 中的显示名称。默认为对象的 `path`。
- **`target_path`** _(可选)_ - “target”或“预期”对象的路径(**预期结果**)。
- **`base_path`** _(可选)_ - “base”或“当前”对象的路径(由**当前源代码**构建)。如果尚无源对象,请省略。
- **`metadata.auto_generated`** _(可选)_ - 从侧边栏隐藏对象,但将其包含在进度报告中。
- **`metadata.complete`** _(可选)_ - 当为 `true` 时将对象标记为“完成”(已链接),当为 `false` 时标记为“未完成”。
## 构建
通过 [rustup](https://rustup.rs) 安装 Rust。
```
git clone https://github.com/encounter/objdiff.git
cd objdiff
cargo run --release
```
或者直接使用 cargo 安装:
```
cargo install --locked --git https://github.com/encounter/objdiff.git objdiff-gui objdiff-cli
```
二进制文件将作为 `objdiff` 和 `objdiff-cli` 安装到 `~/.cargo/bin`。
## 贡献
安装 `pre-commit` 以自动运行 linting 和格式化:
```
rustup toolchain install nightly # Required for cargo fmt/clippy
cargo install --locked cargo-deny # https://github.com/EmbarkStudios/cargo-deny
uv tool install pre-commit # https://docs.astral.sh/uv, or use pipx or pip
pre-commit install
```
## 许可证
根据以下任一许可证授权
- Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) 或 )
- MIT license ([LICENSE-MIT](LICENSE-MIT) 或 )
由您选择。
### 贡献
除非您明确声明,否则根据 Apache-2.0 许可证定义,由您有意提交以包含在作品中的任何贡献,
均应按上述方式双重许可,无需任何附加条款或条件。
标签:3DS, AI工具, C++, Dreamcast, DS, GameCube, GBA, GUI, Hakrawler, MIPS, N64, Objdump, PowerPC, PS1, PS2, PSP, Rust, Saturn, Switch, URL提取, Visual Studio Code 扩展, WebAssembly, Wii, x86, Xbox 360, 二进制分析, 二进制发布, 云安全监控, 云安全运维, 云资产清单, 代码比对, 反编译, 可视化界面, 对象文件, 嵌入式安全, 差异分析, 开发辅助, 开源工具, 快速连接, 数据擦除, 汇编语言, 游戏逆向, 符号还原, 系统运维工具, 网络流量审计, 逆向工程, 通知系统, 静态分析