hexdump命令详解

阅读 1

21小时前

在这里插入图片描述

下面来深入探讨 Linux 下用于二进制文件分析的瑞士军刀——hexdump 命令。

一、hexdump 命令是什么?

hexdump 是一个命令行工具,用于以用户自定义的格式显示文件的十六进制(hex)、十进制、八进制或 ASCII 内容。它是最经典、最直接的文件"十六进制转储"工具。

简单来说,它就像是一个二进制文件的显微镜,允许你逐字节地检查任何文件(可执行程序、图片、文档、磁盘镜像等)的原始内容,并以可读的格式呈现出来。

核心价值:当文本查看工具(如 cat, less)因为遇到非打印字符而显示乱码时,hexdump 可以准确无误地展示每一个字节的真实值,是程序调试、逆向工程、数据恢复和文件格式分析的必备工具。

二、为什么需要 hexdump?

  1. 逆向工程与调试:分析二进制程序的行为,查看内存布局、魔数、硬编码数据。
  2. 诊断文件问题:查看文件的确切内容,判断文件是否损坏、格式是否正确。
  3. 分析未知文件格式:理解文件头结构,识别文件类型(配合 man 5 magic 查看魔数)。
  4. 检查非文本数据:查看图片、音频、视频等文件的元数据和原始数据。
  5. 数字取证:检查磁盘镜像和内存转储中的原始数据。
  6. 网络编程:检查和调试原始网络数据包。

三、工作原理

hexdump 按顺序读取文件的字节,并根据用户指定的格式字符串将它们转换并格式化为多列输出。默认情况下,它会同时显示每个字节的十六进制值和对应的 ASCII 字符(如果可打印)。

输出通常分为三列:

  1. 偏移量地址:当前行第一个字节在文件中的位置(十六进制)。
  2. 十六进制数据:每行16个字节的十六进制表示。
  3. 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" 换行(引号内是字面量)
"/" 斜杠,常用于分隔

高级示例

  1. 模拟 -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":竖线和换行。
  2. 只显示纯十六进制,无ASCII栏

    hexdump -e '"%07.7_ax " 16/1 "%02x " " \n"' test.txt
    
  3. 每行只显示 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 选项)已经足以应对绝大多数查看二进制文件的需求。

给你的建议

  • 日常快速查看:优先使用 xxdhexdump -C,它们更直观。
  • 脚本或特定格式:当需要精确控制输出格式时,使用 hexdump -e
  • 结合使用:通常先用 filestrings 了解文件概况,再用 hexdumpxxd 深入查看特定偏移量的详细结构。

结束语 Flutter是一个由Google开发的开源UI工具包,它可以让您在不同平台上创建高质量、美观的应用程序,而无需编写大量平台特定的代码。我将学习和深入研究Flutter的方方面面。从基础知识到高级技巧,从UI设计到性能优化,欢饮关注一起讨论学习,共同进入Flutter的精彩世界!

精彩评论(0)

0 0 举报