TheMaster1127/binpatch
GitHub: TheMaster1127/binpatch
一款集成了查找、修改和反汇编功能的二进制补丁工具,支持虚拟地址自动转换和启发式搜索,旨在简化底层二进制编辑工作。
Stars: 0 | Forks: 0
# `binpatch` – 二进制补丁工具
## 目录
1. [简介](#introduction)
2. [大纲](#synopsis)
3. [选项](#options)
4. [文件偏移与虚拟地址 (`-o` vs `-va`)](#file-offsets-vs-virtual-addresses--o-vs--va)
5. [十六进制输入的灵活性](#hex-input-flexibility)
6. [查找限制与终端刷屏](#find-limits--terminal-flooding)
7. [启发式查找 (`-fh`) – 高级搜索](#heuristic-find--fh--advanced-search)
8. [入口点与主函数解析 (`-e`, `-m`, `-r`)](#entry-point--main-resolution--e--m--r)
9. [退出代码](#exit-codes)
10. [依赖项](#dependencies)
11. [示例](#examples)
12. [许可证](#license)
## 简介
`binpatch` 是一个功能强大且无依赖的命令行实用工具,旨在直接在二进制文件中进行补丁修补、查找和反汇编操作。它将 `dd`、`xxd` 和 `objdump` 的最佳特性整合到一个单一的可脚本化接口中,从而简化了底层二进制编辑工作。
主要功能包括自动时间戳备份、高度灵活的十六进制字符串解析,以及用于查找部分字节匹配的高级启发式搜索引擎。
## 大纲
```
binpatch [OPTIONS]
```
## 选项
| 选项 | 参数 | 描述 |
|--------|----------|-------------|
| `-o`, `--offset` | OFFSET | 用于修补或反汇编的**原始文件偏移量**。(例如 `112b` 或 `0x112b`)。 |
| `-va`, `--vaddr` | VMA | (来自 `objdump`/IDA 的)**虚拟内存地址**。自动转换为正确的文件偏移量。 |
| `-e`, `--entry` | (无) | 自动解析 ELF 文件以定位入口点(`_start`)。替代 `-o`。 |
| `-m`, `--main` | (无) | 在已编译的 C/C++ 二进制文件中自动定位 `main()` 函数。替代 `-o`。 |
| `-h`, `--hex` | HEX_STRING | 要写入文件的十六进制字节(例如 `"cb 10 00 00 05"`)。 |
| `-b`, `--backup` | (无) | 在应用补丁之前创建带有时间戳的文件备份。 |
| `-f`, `--find` | HEX_STRING | 在文件中查找完全匹配的十六进制模式,并打印匹配项的 `xxd` 样式的十六进制转储。 |
| `-fh`, `--find-heuristic`| HEX_STRING | 查找最大的连续子串匹配(启发式搜索)。 |
| `-d`, `--disassemble` | (无) | 反汇编目标偏移量处的指令(x86/AMD64 的 Intel 语法)。 |
| `-s`, `--size` | N | **双重用途:** 要反汇编的指令数量(默认值:1),或要显示的查找结果的最大数量(默认值:5)。 |
| `-r`, `--return` | (无) | 动态反汇编直到遇到返回指令(`ret`、`bx lr`、`pop {pc}` 等)。不能与 `-s` 一起使用。 |
| `-a`, `--all` | (无) | 显示所有查找结果,覆盖 `-s` 的大小限制。 |
| `-q`, `--quiet` | (无) | 脚本模式。禁止所有视觉格式化,并且*仅*打印原始的十六进制偏移量(`0x...`)。 |
| `--version` | (无) | 显示 `binpatch 1.0.0` 版本。 |
| `--help` | (无) | 显示帮助信息并退出。 |
*(注意:`-h` 映射到的是 `--hex`,而不是帮助。请使用 `--help` 查看手册)。*
## 文件偏移与虚拟地址 (`-o` vs `-va`)
逆向工程师经常从 `objdump`、`Ghidra` 或 `IDA Pro` 复制地址。这些工具输出的是**虚拟内存地址 (VMAs)**(例如 `0x4011e0`),而硬盘上的文件是通过**文件偏移量**(例如 `0x11e0`)进行访问的。
- 如果您有通过 `-f` (查找) 获得的准确文件偏移量,请使用 **`-o`**。
- 如果您直接从反汇编输出中复制了内存地址,请使用 **`-va`**。`binpatch` 将原生解析 ELF 头,并在打补丁之前将其完美映射到正确的物理文件偏移量。
## 十六进制输入的灵活性
`-h`、`-f` 和 `-fh` 标志旨在接受几乎从任何逆向工程工具复制过来的十六进制输入。它会通过将字母转换为小写、剥离 `0x` 前缀、移除逗号并忽略空白字符来规范化字符串。
所有这些输入将被视为完全相同的字节序列:
- `"cb 10 00 00 05"` *(以空格分隔)*
- `"cb10000005"` *(无空格)*
- `"0xcb 0x10 0x00 0x00 0x05"` *(带有 0x 前缀)*
- `"CB 10 00 00 05"` *(大写)*
- `"cb, 10, 00, 00, 05"` *(带有逗号)*
## 查找限制与终端刷屏
为了防止在搜索常见字节(如 `00 00`)时终端输出爆炸,`binpatch` 自动将查找结果限制为**前 5 个匹配项**。
如果存在更多匹配项,它将隐藏它们并在输出的底部通知您。
- 使用 `-a` 或 `--all` 强制打印每一个匹配项。
- 使用 `-s N` 将限制更改为特定数字(例如,`-s 20` 显示 20 个结果)。
## 启发式查找 (`-fh`) – 高级搜索
如果二进制文件进行了轻微更新或重新编译,精确的字节签名可能会失效。启发式查找 (`-fh`) 通过生成十六进制模式的所有连续子串并搜索现存的最大块来解决此问题。
*(注意:由于子串搜索方法,您可能会看到相邻的重叠匹配。这对于启发式方法是正常的)。*
## 入口点与主函数解析 (`-e`, `-m`, `-r`)
`binpatch` 包含针对 ELF 二进制文件的高级结构解析功能。
- **`-e` (入口点):** 原生解析 ELF 头以解析 `_start` 的虚拟地址,将其转换为物理文件偏移量,并将其作为目标。
- **`-m` (主函数):** 使用 `objdump` 扫描二进制文件的符号表以查找 `main()` 函数,并将其自动转换为物理文件偏移量。*(在已剥离符号的二进制文件上会优雅地失败)。*
如果将 `-r` 与 `-d` 结合使用,`binpatch` 将逐行流式传输反汇编结果,并在遇到特定架构的返回指令(例如,x86 的 `ret`,ARM 的 `bx lr` 或 `pop {pc}`,MIPS 的 `jr ra`)时自动停止。
## 备份格式
当将 `-b` (`--backup`) 标志与写入操作 (`-h`) 一起使用时,原始文件在进行修改之前会被安全地复制。
**格式:** `backup_YYYYMMDD_HHMMSS_originalfilename`
*示例:* `backup_20260513_141527_my_program`
## 退出代码
| 代码 | 含义 |
|------|---------|
| `0` | 成功。 |
| `1` | 错误(找不到文件、偏移量无效、冲突或未找到匹配项)。 |
## 依赖项
- **Python 3.6+**(仅使用标准库;不需要 `pip` 安装)。
- **`objdump`**(可选)。仅在使用 `-d` (反汇编) 或 `-m` (主函数) 标志时才需要。通常在 Linux 上通过 `binutils` 默认安装。
## 示例
### 1. 空操作化 (NOP) 一条跳转指令 (游戏破解)
直接从 IDA Pro 或 `objdump` 复制指令的虚拟地址,使用 `-va` 安全地转换它,并用 NOP (`90 90`) 覆盖它。
```
binpatch c_binary -va 4011cd -h "90 90"
```
### 2. 反汇编 `main()` 函数
自动解析 `main()` 符号,并反汇编整个函数直到它返回。
```
binpatch c_binary -m -d -r
```
### 3. 带有备份的原始偏移量补丁
将 5 个字节写入文件偏移量 `0x112B`,并首先创建一个带有时间戳的备份。
```
binpatch my_program -o 112B -h "cb 10 00 00 05" -b
```
### 4. 结合查找和修补 (脚本编写)
使用 `--quiet` (`-q`) 标志,`binpatch` 将*仅*输出原始的十六进制地址。
```
OFFSET=$(binpatch my_program -f "cb 10 00 00 05" -q | head -1)
binpatch my_program -o $OFFSET -h "90 90 90 90 90" -b
```
## 许可证
本项目基于 [GNU General Public License v3.0 (GPLv3)](https://www.gnu.org/licenses/gpl-3.0.html) 获得许可。
标签:C/C++, DNS 反向解析, ELF解析, Findomain, Linux工具, objdump替代, 事务性I/O, 二进制分析, 二进制编辑, 二进制补丁工具, 云安全运维, 云资产清单, 底层安全, 文件偏移, 无依赖, 汇编反汇编, 端口探测, 脚本集成, 自动化补丁, 虚拟内存地址, 逆向工程