Hexdump如何工作【Linux-Command line】

2019-11-26 10:09:08 浏览数 (1)

Hexdump可帮助查证二进制文件的内容。

了解hexdump的工作原理吧。

图片来源:Lewis Cowles, CC BY-SA 4.0图片来源:Lewis Cowles, CC BY-SA 4.0

Hexdump是一种实用程序,可以以十六进制,十进制,八进制或ASCII显示二进制文件的内容。 它是一种检查工具,可用于数据恢复,逆向工程和编程。

了解基础

Hexdump可以以很少的工作量提供输出,根据你正在查看的文件的大小,可能会有很多输出。 为实现本文目的,创建一个1x1 PNG文件。 可以使用GIMP或Mtpaint等图形应用程序来执行此操作,也可以使用ImageMagick在终端中创建它。

这是使用ImageMagick生成1x1像素PNG的命令:

可以使用file命令确认此文件是PNG:

你可能想知道file命令如何确定文件类型。 巧合的是,这就是Hexdump所揭示的。 目前,你可以在所选的图像查看器中查看一个像素的图形(它看起来像是“.”),也可以使用hexdump查看文件中的内容:

你所看到的是通过以前从未使用过的lens得到的示例PNG文件的内容。 这些数据与你在图像查看器中看到的数据完全相同,并且以你可能不熟悉的方式进行了编码。

提取熟悉的字符串

仅仅因为默认数据转储似乎毫无意义,并不意味着它就没有有价值的信息。 你可以使用“--canonical”选项将此输出或至少实际翻译的部分转换为更熟悉的字符集:

在右列中,你会看到与左侧相同但以ASCII形式显示的数据。 如果仔细看,可以发现一些有用的信息,例如文件的格式(PNG),以及文件创建和最后修改的日期和时间(从最底部开始)。 点表示ASCII字符集中不存在的符号,这是可以预期的,因为二进制格式不限于普通的字母和数字。

file命令从前8个字节知道该文件是什么。 libpng specification警示程序员寻找什么。 可以看到,在此图像文件的前8个字节内,特别是字符串PNG。 这很重要,因为它揭示了file命令如何知道要报告的文件类型。

你还可以控制hexdump显示多少字节,这对于大于一个像素的文件很有用:

你不必将hexdump限制为PNG或图形文件。 你还可以针对每天运行的二进制文件运行hexdump,例如ls,rsync或要检查的任何二进制格式。

用hexdump实现cat

如果阅读了PNG规范,你可能会注意到前8个字节中的数据看起来与hexdump提供的数据有所不同。 实际上,它们是相同的数据,但是使用不同的转换来显示。 因此,hexdump的输出是真实的,但对你而言并不总是直接可用,这取决于你要查找的内容。 因此,hexdump具有用于格式化和转换其转储的原始数据的选项。

转换选项可能会变得很复杂,因此先进行一些琐碎的练习很有用。 这里是通过重新实现cat命令格式化hexdump输出格式的简短介绍。 首先,在文本文件上运行hexdump以查看其原始数据。 通常,你可以在硬盘驱动器上的某个位置找到GNU General Public License(GPL)许可证的副本,也可以使用任何方便的文本文件。 你的输出可能会有所不同,但是以下是在系统上(或至少部分系统上)查找GPL副本的方法:

对它运行hexdump:

如果文件的输出很长,请使用“--length“(或“-n”缩写)使其易于管理。

原始数据可能对你没有任何意义,但是你已经知道如何将其转换为ASCII:

该输出很有帮助,但笨拙且难以阅读。 要格式化hexdump的输出超出其自身选项所提供的范围,请使用“--format”(或“-e”)以及专门的格式化代码。 用于格式化的简写类似于printf命令使用的简写,因此,如果你熟悉printf语句,你可能会发现hexdump格式化更容易学习。

在hexdump中,字符序列%_p告诉hexdump在系统的默认字符集中打印字符。“ --format”选项的所有格式符号必须用单引号引起来:

代码语言:javascript复制
$ hexdump -e'"%_p"' /usr/share/doc/libblkid-devel/COPYING
This library is fre*
 software; you can redistribute it and/or.modify it under the terms of the GNU Les*
er General Public.License as published by the Fre*
 Software Foundation; either.version 2.1 of the License, or (at your option) any later.version..*
The complete text of the license is available in the..*
/Documentation/licenses/COPYING.LGPL-2.1-or-later file..

此输出更好,但仍不方便阅读。 传统上,UNIX文本文件采用80个字符的输出宽度(因为很久以前,监视器往往只能容纳80个字符)。

尽管此输出不受格式限制,但可以通过附加选项强制hexdump一次处理80个字节。 具体来说,通过将80除以1,可以告诉hexdump将80字节视为一个单位:

代码语言:javascript复制
$ hexdump -e'80/1 "%_p"' /usr/share/doc/libblkid-devel/COPYING
This library is free software; you can redistribute it and/or.modify it under the terms of the GNU Lesser General Public.License as published by the Free Software Foundation; either.version 2.1 of the License, or (at your option) any later.version...The complete text of the license is available in the.../Documentation/licenses/COPYING.LGPL-2.1-or-later file..

现在,文件已以80字节的块进行处理,但失去了换行的感觉。 可以使用“ n”字符添加自己的字符,该字符在UNIX中代表新行:

你现在(大致)已使用hexdump格式实现了cat命令。

控制输出

实际上,格式化是使hexdump有用的方式。 现在,至少在原则上已经熟悉hexdump格式,可以使hexdump -n 8的输出与官方libpng规范所述的PNG标头的输出匹配。

首先,你知道要hexdump以8字节的块形式处理PNG文件。 此外,通过整数识别,你可能知道PNG规范以十进制表示,根据hexdump文档,它由“%d”表示:

可以通过在每个整数后面添加一个空格来使输出完美:

现在,输出与PNG规范完美匹配。

Hexdumping --为了乐趣与利益

Hexdump是一个引人入胜的工具,不仅可以教你更多有关计算机如何处理和转换信息的知识,而且还可以教你文件格式和已编译二进制文件的功能。你可以在工作期间全天随机尝试对文件运行hexdump。 你无法预料自己会发现什么样的信息,也料想不到何时能收获实用信息。

0 人点赞