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 两种模式。
小技巧:Hex Fiend 的查找支持通配符 ??。比如你找 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 的模板脚本支持条件判断、循环、甚至自定义函数。你可以用它解析复杂的嵌套结构,比如 ELF 文件、PE 文件、甚至数据库文件格式。

查找与替换的高级用法

010 Editor 的查找功能支持正则表达式和通配符。比如你要找所有以 0x1A 开头、后面跟 4 个任意字节、再跟 0x2B 的模式:

查找模式:1A ?? ?? ?? ?? 2B
范围:整个文件
选项:通配符匹配

另外,010 Editor 还支持批量替换脚本。你可以写一段脚本,对多个文件执行相同的替换操作。我在分析固件时经常用这个——批量修改设备 ID 或版本号。

注意:010 Editor 的模板脚本语法是 C 风格的,但有些细节不同。比如 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 知识体系图

下面这张图总结了本章的核心知识点和工具选择逻辑。

十六进制编辑器知识体系 十六进制编辑器 Hex Fiend 010 Editor HxD 特性 • 超大文件支持 • 内存映射加载 • 通配符查找 特性 • 模板脚本解析 • 正则查找替换 • 批量脚本处理 特性 • 磁盘扇区编辑 • 内存编辑 • 免费轻量 核心操作:查找 · 替换 · 字节编辑 插入模式 vs 覆盖模式 小端序 vs 大端序处理 选择工具的关键:文件大小、平台、是否需要结构化解析

3.7 避坑指南

最后,分享几个我踩过的坑,希望能帮你省点时间。

坑一:替换前不备份
我曾经在分析一个固件时,想批量替换设备 ID。结果正则写错了,把整个文件头给覆盖了。固件直接变砖。从那以后,我每次替换前都会先复制一份 .bak 文件。
坑二:忽略字节序
有一次我解析一个网络协议的数据包,怎么看怎么不对。折腾了两小时才发现,协议用的是大端序,而我默认用小端序去读。嗯,从那以后我第一件事就是确认字节序。
坑三:磁盘编辑不先做镜像
HxD 的磁盘编辑功能很强大,但也很危险。我建议在操作前先用 dd 或 WinHex 做个完整镜像。这样就算搞砸了,也能恢复。

好了,三款编辑器的核心用法就这些。工具是死的,人是活的。多练、多试、多备份,你很快就能上手。