3、十六进制编辑器:Hex Fiend、010 Editor、HxD 的使用
工欲善其事,必先利其器。做二进制分析,编辑器就是你的手术刀。
市面上十六进制编辑器不少,但我真正长期使用的就三款:Hex Fiend、010 Editor 和 HxD。它们各有脾气,也各有绝活。今天我就把这几把刀怎么用、什么时候用、有什么坑,一次性说清楚。
3.1 三款编辑器速览
先给个总览,方便你快速定位该用哪个。
| 编辑器 | 平台 | 核心优势 | 适合场景 |
|---|---|---|---|
| Hex Fiend | macOS | 轻量、极快、支持超大文件 | 日常查看、快速编辑、大文件分析 |
| 010 Editor | Windows / macOS | 模板脚本、结构解析、脚本化 | 逆向工程、格式逆向、批量处理 |
| HxD | Windows | 免费、磁盘编辑、内存编辑 | 快速修改、磁盘扇区编辑、应急修复 |
我个人习惯是:日常用 Hex Fiend,深度分析用 010 Editor,Windows 下快速改东西用 HxD。三把刀换着用,效率最高。
3.2 Hex Fiend:macOS 下的瑞士军刀
Hex Fiend 是我在 Mac 上打开频率最高的工具。它有多快?我试过打开一个 4GB 的磁盘镜像,几乎秒开。这得益于它的内存映射机制——不把整个文件读进内存,而是按需加载。
基本操作
- 打开文件:直接拖入窗口,或者
Cmd+O。 - 跳转地址:
Cmd+G,输入偏移量(支持十六进制和十进制)。 - 字节编辑:直接在十六进制区域双击,输入新值。右侧 ASCII 区域也能直接改字符。
- 查找与替换:
Cmd+F,支持十六进制和 ASCII 两种模式。
??。比如你找 FF D8 ?? ?? 00,它会匹配任意两个字节。我在分析 JPEG 文件头时经常用这个。
查找与替换实战
假设你要把 PNG 文件里的某个颜色值全部替换掉。原始颜色是 FF 00 00(红色),要改成 00 FF 00(绿色)。
查找:FF 00 00
替换:00 FF 00
模式:十六进制
范围:整个文件
点「全部替换」,一秒搞定。但注意——替换前一定要备份。我曾经手滑把文件头里的魔数给替换了,结果文件直接报废。嗯,血的教训。
3.3 010 Editor:模板脚本的王者
010 Editor 是我做逆向分析时的主力。它的杀手锏是模板脚本(Template Script)。你可以为任意二进制格式写一个模板,编辑器会自动解析并展示结构化的字段。
模板脚本示例
比如我们要解析一个简单的 BMP 文件头。写个模板:
// BMP 文件头模板
struct BMPFILEHEADER {
char bfType[2]; // 魔数 "BM"
uint32 bfSize; // 文件大小
uint16 bfReserved1; // 保留
uint16 bfReserved2; // 保留
uint32 bfOffBits; // 数据偏移
};
BMPFILEHEADER header;
Printf("魔数: %c%c\n", header.bfType[0], header.bfType[1]);
Printf("文件大小: %d 字节\n", header.bfSize);
Printf("数据偏移: 0x%X\n", header.bfOffBits);
加载模板后,编辑器会自动把二进制数据映射成结构体。你点一下字段,对应的字节就会高亮。这比人眼去数偏移量靠谱多了。
查找与替换的高级用法
010 Editor 的查找功能支持正则表达式和通配符。比如你要找所有以 0x1A 开头、后面跟 4 个任意字节、再跟 0x2B 的模式:
查找模式:1A ?? ?? ?? ?? 2B
范围:整个文件
选项:通配符匹配
另外,010 Editor 还支持批量替换脚本。你可以写一段脚本,对多个文件执行相同的替换操作。我在分析固件时经常用这个——批量修改设备 ID 或版本号。
uint32 是小端序,如果你要解析大端序数据,得用 uint32 BE。我第一次用的时候没注意,解析出来的数据全是反的,排查了半天。
3.4 HxD:Windows 下的免费利器
HxD 是我在 Windows 上最常用的十六进制编辑器。它免费、轻量、功能却一点不含糊。最让我佩服的是它支持直接编辑磁盘扇区和内存——这在调试和应急修复时简直是救命功能。
磁盘编辑
假设你的 U 盘 MBR 被破坏了,想手动修复。打开 HxD,选择「额外功能」→「打开磁盘」,选中你的 U 盘。你会看到从扇区 0 开始的原始数据。找到 MBR 的引导代码区,直接修改。
查找与替换
HxD 的查找替换功能很直观。支持三种模式:
- 十六进制值:直接输入
FF D8 FF E0找 JPEG 文件头。 - 文本字符串:输入
Hello找 ASCII 字符串。 - 浮点数:输入
3.14找对应的 IEEE 754 表示。
替换时可以选择「全部替换」或「逐个确认」。我个人习惯用逐个确认,避免误伤。
3.5 字节编辑的核心技巧
不管用哪款编辑器,字节编辑的核心操作都差不多。这里总结几个我常用的技巧。
插入 vs 覆盖
大多数编辑器默认是覆盖模式——你输入新字节,旧字节被替换。但有时候你需要插入字节(比如在文件中间加一段数据)。
- Hex Fiend:
Cmd+I切换插入模式。 - 010 Editor:
Insert键切换。 - HxD:
Insert键切换。
插入操作会改变文件大小,后面的数据会整体后移。如果你在编辑一个结构固定的文件(比如 ELF 或 PE),插入字节可能会破坏偏移量计算。这时候要格外小心。
字节序处理
二进制文件里,多字节数值的存储方式有两种:小端序(Little-Endian)和大端序(Big-Endian)。
| 字节序 | 存储方式 | 常见场景 |
|---|---|---|
| 小端序 | 低位字节在前 | x86 架构、Windows PE 文件 |
| 大端序 | 高位字节在前 | 网络协议、Java 类文件、某些嵌入式固件 |
比如数值 0x12345678:
- 小端序存储:
78 56 34 12 - 大端序存储:
12 34 56 78
010 Editor 的模板脚本可以自动处理字节序,但 Hex Fiend 和 HxD 需要你手动判断。我的经验是:先看文件头部的魔数。如果魔数是 4D 5A(MZ),那就是小端序;如果是 CA FE BA BE(Java 类文件),那就是大端序。
3.6 知识体系图
下面这张图总结了本章的核心知识点和工具选择逻辑。
3.7 避坑指南
最后,分享几个我踩过的坑,希望能帮你省点时间。
我曾经在分析一个固件时,想批量替换设备 ID。结果正则写错了,把整个文件头给覆盖了。固件直接变砖。从那以后,我每次替换前都会先复制一份
.bak 文件。
有一次我解析一个网络协议的数据包,怎么看怎么不对。折腾了两小时才发现,协议用的是大端序,而我默认用小端序去读。嗯,从那以后我第一件事就是确认字节序。
HxD 的磁盘编辑功能很强大,但也很危险。我建议在操作前先用
dd 或 WinHex 做个完整镜像。这样就算搞砸了,也能恢复。
好了,三款编辑器的核心用法就这些。工具是死的,人是活的。多练、多试、多备份,你很快就能上手。