下面来深入探讨 Linux 下用于二进制文件分析的瑞士军刀——hexdump
命令。
一、hexdump 命令是什么?
hexdump
是一个命令行工具,用于以用户自定义的格式显示文件的十六进制(hex)、十进制、八进制或 ASCII 内容。它是最经典、最直接的文件"十六进制转储"工具。
简单来说,它就像是一个二进制文件的显微镜,允许你逐字节地检查任何文件(可执行程序、图片、文档、磁盘镜像等)的原始内容,并以可读的格式呈现出来。
核心价值:当文本查看工具(如 cat
, less
)因为遇到非打印字符而显示乱码时,hexdump
可以准确无误地展示每一个字节的真实值,是程序调试、逆向工程、数据恢复和文件格式分析的必备工具。
二、为什么需要 hexdump?
- 逆向工程与调试:分析二进制程序的行为,查看内存布局、魔数、硬编码数据。
- 诊断文件问题:查看文件的确切内容,判断文件是否损坏、格式是否正确。
- 分析未知文件格式:理解文件头结构,识别文件类型(配合
man 5 magic
查看魔数)。 - 检查非文本数据:查看图片、音频、视频等文件的元数据和原始数据。
- 数字取证:检查磁盘镜像和内存转储中的原始数据。
- 网络编程:检查和调试原始网络数据包。
三、工作原理
hexdump
按顺序读取文件的字节,并根据用户指定的格式字符串将它们转换并格式化为多列输出。默认情况下,它会同时显示每个字节的十六进制值和对应的 ASCII 字符(如果可打印)。
输出通常分为三列:
- 偏移量地址:当前行第一个字节在文件中的位置(十六进制)。
- 十六进制数据:每行16个字节的十六进制表示。
- ASCII 表示:同一行16个字节的ASCII字符表示,不可打印的字符显示为点号
.
。
四、基本语法与常用参数
基本语法:
hexdump [选项] [文件...]
常用选项
选项 | 作用 |
---|---|
-C |
规范十六进制+ASCII 显示。这是最常用的选项。输出包含偏移量、十六进制字节和ASCII字符三部分。 |
-b |
单字节八进制显示。每个字节显示为3位八进制数。 |
-c |
单字节字符显示。显示为默认字符集的字符,不可打印字符显示为3位八进制转义序列(如 \377 )。 |
-d |
双字节十进制显示。每2个字节显示为一个无符号十进制数。 |
-e <格式字符串> |
指定自定义格式。这是 hexdump 最强大的功能,允许完全自定义输出格式。 |
-f <格式文件> |
从指定文件中读取格式字符串。 |
-n <长度> |
只转储指定长度的字节。例如 -n 100 只显示前100个字节。 |
-s <偏移量> |
从文件的指定偏移量开始转储。偏移量可以是十进制,或以 0x 开头的十六进制。 |
-v |
显示所有数据。默认情况下,连续相同的行会被缩写为 * ,此选项强制显示每一行。 |
五、使用示例
假设我们有一个简单的文本文件 test.txt
,内容为:
Hello
World!
示例 1:经典用法,规范显示 (-C
)
这是最常用、最推荐的用法,输出清晰易读。
hexdump -C test.txt
输出:
00000000 48 65 6c 6c 6f 0a 57 6f 72 6c 64 21 0a |Hello.World!.|
0000000d
解读:
00000000
:偏移量,表示这行数据从文件第 0 字节开始。48 65 6c 6c 6f 0a ...
:中间部分是16个字节的十六进制值。48
= 'H',65
= 'e',6c
= 'l',6c
= 'l',6f
= 'o'0a
= 换行符\n
(LF)57
= 'W',6f
= 'o', ... ,21
= '!',0a
=\n
|Hello.World!.|
:右边是这些字节对应的ASCII字符。不可打印字符(如0x0a
)显示为点.
,所以Hello\n
显示为Hello.
。
示例 2:查看文件开头部分 (-n
)
只查看文件的前 32 个字节,非常适合检查文件头。
hexdump -C -n 32 tvconfig.img
示例 3:从指定偏移开始查看 (-s
)
跳过文件开头的 512 个字节(例如跳过MBR)开始查看。
hexdump -C -s 512 tvconfig.img
# 使用十六进制偏移量
hexdump -C -s 0x200 tvconfig.img
示例 4:查看二进制程序,识别魔数和字符串
分析一个 ELF 可执行文件。
hexdump -C -n 64 /bin/ls
输出开头几行:
00000000 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 |.ELF............|
00000010 02 00 3e 00 01 00 00 00 a8 63 5d 00 00 00 00 00 |..>......c].....|
可以看到著名的 ELF 魔数:7f 45 4c 46
(即 0x7f 'E' 'L' 'F'
)。
示例 5:默认格式(无选项)
不使用 -C
选项的默认输出格式,可读性较差,不推荐。
hexdump test.txt
输出:
0000000 6548 6c6c 0a6f 6f57 6c72 2164 000a
000000d
注意:默认格式使用双字节十六进制,并且是小端序(Little-endian),所以 48 65
变成了 0x6548
。这容易造成混淆。
六、高级用法:自定义格式 (-e
)
-e
选项是 hexdump
的强大之处,允许你完全控制显示格式。格式字符串由一系列迭代单位组成。
格式说明符
说明符 | 含义 |
---|---|
%_c |
显示为默认字符集的字符 |
%_p |
显示为默认字符集的字符,非打印字符显示为 . |
%_u |
显示为 US-ASCII 字符,非打印字符显示为 . |
%02x |
显示为 2 位十六进制数(小写) |
%02X |
显示为 2 位十六进制数(大写) |
%03o |
显示为 3 位八进制数 |
%03u |
显示为 3 位无符号十进制数 |
%4d |
显示为有符号十进制数 |
"%c" |
显示为字符(引号内是字面量) |
"\n" |
换行(引号内是字面量) |
"/" |
斜杠,常用于分隔 |
高级示例
-
模拟
-C
选项的输出:hexdump -e '"%07.7_ax " 8/1 "%02x " " " 8/1 "%02x " " |" 16/1 "%_p" "|\n"' test.txt
"%07.7_ax "
:7位宽的十六进制偏移量,后跟空格。8/1 "%02x "
:处理8个字节,每个字节格式化为2位十六进制数。" "
:两个空格分隔。8/1 "%02x "
:再处理8个字节。" |"
:空格和竖线。16/1 "%_p"
:处理16个字节,显示为可打印字符或点。"|\n"
:竖线和换行。
-
只显示纯十六进制,无ASCII栏:
hexdump -e '"%07.7_ax " 16/1 "%02x " " \n"' test.txt
-
每行只显示 4 个双字节十进制数:
hexdump -e '4/2 "%6d " "\n"' test.txt
七、与其他工具对比
工具 | 特点 | 适用场景 |
---|---|---|
hexdump |
经典、灵活、格式可控。自定义格式复杂。 | 通用二进制分析,需要自定义输出格式时。 |
xxd |
输出格式更直观,默认就是 hexdump -C 的样式。支持将十六进制转回二进制。 |
更现代、更常用。快速查看二进制文件,制作补丁。 |
od |
最古老的转储工具,POSIX 标准。输出格式多样(八进制、十六进制等)。 | 需要高度可移植脚本时。 |
bvi |
十六进制编辑器,可交互式修改文件。 | 需要编辑二进制文件时。 |
**xxd
基本用法(推荐)**:
xxd test.txt # 默认输出,类似 hexdump -C
xxd -g 1 test.txt # 每字节用空格分隔,更清晰
xxd -l 32 test.txt # 只显示前32字节
xxd -s 0x200 test.txt # 从偏移量0x200开始显示
总结
hexdump
是一个强大的底层诊断工具,它赋予了用户直接与文件原始字节对话的能力。虽然它的自定义格式有些复杂,但其默认格式(尤其是 -C
选项)已经足以应对绝大多数查看二进制文件的需求。
给你的建议:
- 日常快速查看:优先使用
xxd
或hexdump -C
,它们更直观。 - 脚本或特定格式:当需要精确控制输出格式时,使用
hexdump -e
。 - 结合使用:通常先用
file
和strings
了解文件概况,再用hexdump
或xxd
深入查看特定偏移量的详细结构。
结束语 Flutter是一个由Google开发的开源UI工具包,它可以让您在不同平台上创建高质量、美观的应用程序,而无需编写大量平台特定的代码。我将学习和深入研究Flutter的方方面面。从基础知识到高级技巧,从UI设计到性能优化,欢饮关注一起讨论学习,共同进入Flutter的精彩世界!