前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Hexdump如何工作【Linux-Command line】

Hexdump如何工作【Linux-Command line】

作者头像
QRosie
修改2019-11-26 10:09:08
2.2K0
修改2019-11-26 10:09:08
举报
文章被收录于专栏:Opensource翻译专栏

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

了解hexdump的工作原理吧。

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

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

了解基础

Hexdump可以以很少的工作量提供输出,根据你正在查看的文件的大小,可能会有很多输出。 为实现本文目的,创建一个1x1 PNG文件。 可以使用GIMPMtpaint等图形应用程序来执行此操作,也可以使用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,例如lsrsync或要检查的任何二进制格式。

用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。 你无法预料自己会发现什么样的信息,也料想不到何时能收获实用信息。

本文系外文翻译,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系外文翻译前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 了解基础
  • 提取熟悉的字符串
  • 用hexdump实现cat
  • 控制输出
  • Hexdumping --为了乐趣与利益
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档