Linux深入探索11-二进制文件查看(hexdump 与 od)


----- 最近更新【2022-01-25】-----

本文目录结构预览:

  • 一、简介
  • 二、规范输出
  • 三、hexdump
  • 四、od
  • 五、参考

一、简介

在计算机科学中,一个 0 或 1 存储的数据称为一个位(bit,代表 binary digit,即二进制数);连续 8 位称为一个字节。

odhexdump 可以以可读的格式显示任何类型的二进制数据。实际上,这两个文件是两个基于文本的查看二进制文件内部的主要工具。

大多数有经验的 Unix 人士倾向于选择一个自己喜欢的程序使用,要么是 od ,要么是 hexdump

二、规范输出

某种特定格式的二进制文件输出格式称为规范输出,如:

[nosee@instance-4 ~]$ hexdump -C day1
00000000  09 09 4a 61 6e 75 61 72  79 09 32 30 32 32 09 09  |..January.2022..|
00000010  0a 53 75 09 4d 6f 09 54  75 09 57 65 09 54 68 09  |.Su.Mo.Tu.We.Th.|
00000020  46 72 09 53 61 0a 09 09  09 09 09 09 20 31 0a 20  |Fr.Sa....... 1. |
00000030  32 09 20 33 09 20 34 09  20 35 09 20 36 09 20 37  |2. 3. 4. 5. 6. 7|
00000040  09 20 38 0a 20 39 09 31  30 09 31 31 09 31 32 09  |. 8. 9.10.11.12.|
00000050  31 33 09 31 34 09 31 35  0a 31 36 09 31 37 09 31  |13.14.15.16.17.1|
00000060  38 09 31 39 09 32 30 09  32 31 09 32 32 0a 32 33  |8.19.20.21.22.23|
00000070  09 32 34 09 32 35 09 32  36 09 32 37 09 32 38 09  |.24.25.26.27.28.|
00000080  32 39 0a 33 30 09 33 31  09 09 09 09 09 09 0a 68  |29.30.31.......h|
00000090  61 68 61 0a 68 61 68 61  0a e6 96 b0 e5 95 8a ef  |aha.haha........|
000000a0  bc 81 ef bc 81 ef bc 81  ef bc 81 ef bc 81 0a 0a  |................|
000000b0  68 61 68 68 61 0a                                 |hahha.|
000000b6
[nosee@instance-4 ~]$ 

其中,左边是十六进制的偏移,中间是十六进制的数据,右边是数据的ASCII字符。

对于二进制文件而言,文件中没有行,因此行号没有意义。作为替代,我们使用偏移(offset)标记每个位置。偏移就是一个数字,告诉离文件开头有多少字节。偏移不属于数据的内容,是 hexdump 程序加上去的,为了方便程序员阅读。

其中,第一个字节的偏移是 0;第二个字节偏移是 1;以此类推。(记住,1字节=8位=2个十六进制数字)

在大多数二进制文件中,有些字节包含的是实际 ASCII 字符。通过查看最右边的一栏可以方便地识别这些字节。根据约定,没有对应可显示 ASCII 字符的字节一律通过用一个.(点号)字符表示。(如上面的例子,最前面的4a,二进制是01001010,十进制是74,在ASCII码中就是字符J )

二进制文件中的大多数字节都不是字符(有一些只是碰巧会对应于某个字符),而是机器指令、数值数据等。

三、hexdump

hexdump — ASCII, decimal, hexadecimal, octal dump.

语法:
hexdump [-bcCdovx] [-e format_string] [-f format_file] [-n length] [-s offset] file ...
hd [-bcdovx] [-e format_string] [-f format_file] [-n length] [-s offset] file ...

其中,hd 可以相当于是 hexdump -C

常用选项:

  • -C,(大写C) 以规范格式显示一个二进制文件
  • -s offset,(skip over 略过) 设置初始偏移量指定在文件开头略过多少字节, offset 可以使用任何进制表示的数字。(如,-s 0x120 表示从偏移0x120处开始显示数据)
  • n length,(number of bytes 字节数量) 设置显示字节数, length 为十进制数。 (如,-n 100表示只显示100个字节的数据)

常用组合语法:hexdump -C [-s offset] [-n length] [file...]

例:

[nosee@instance-4 ~]$ hexdump -C -s 0x120 -n 100 /usr/bin/ls 
00000120  01 00 00 00 04 00 00 00  00 70 01 00 00 00 00 00  |.........p......|
00000130  00 70 01 00 00 00 00 00  00 70 01 00 00 00 00 00  |.p.......p......|
00000140  10 89 00 00 00 00 00 00  10 89 00 00 00 00 00 00  |................|
00000150  00 10 00 00 00 00 00 00  01 00 00 00 06 00 00 00  |................|
00000160  90 03 02 00 00 00 00 00  90 13 02 00 00 00 00 00  |................|
00000170  90 13 02 00 00 00 00 00  58 12 00 00 00 00 00 00  |........X.......|
00000180  48 25 00 00                                       |H%..|
00000184
[nosee@instance-4 ~]$ hd -s 0x120 -n 100 /usr/bin/ls 
00000120  01 00 00 00 04 00 00 00  00 70 01 00 00 00 00 00  |.........p......|
00000130  00 70 01 00 00 00 00 00  00 70 01 00 00 00 00 00  |.p.......p......|
00000140  10 89 00 00 00 00 00 00  10 89 00 00 00 00 00 00  |................|
00000150  00 10 00 00 00 00 00 00  01 00 00 00 06 00 00 00  |................|
00000160  90 03 02 00 00 00 00 00  90 13 02 00 00 00 00 00  |................|
00000170  90 13 02 00 00 00 00 00  58 12 00 00 00 00 00 00  |........X.......|
00000180  48 25 00 00                                       |H%..|
00000184

四、od

od - dump files in octal and other formats.

语法:
od [OPTION]... [FILE]...
od [-abcdfilosx]... [FILE] [[+]OFFSET[.][b]]
od --traditional [OPTION]... [FILE] [[+]OFFSET[.][b] [+][LABEL][.][b]]

常用选项:

  • A,(address 地址) 指定使用哪一种计数系统表示偏移值。对于规范输出来说,需要将它指定为x,即-Ax,这将以十六进制显示偏移。
  • -t,(type of format 格式类型) 控制数据显示的方式。对于规范输出来说,需要将它指定为x1(以十六进制显示数据,每次一个字节),和 z(在每行末尾加上相应的ASCII值),即-tx1z。(注意,这里的1,是数字1)
  • -j,(jump over 跳过) 指定从文件开头跳过多少字节。(如-j 0x120,表示从偏移0x120处开始显示数据)
  • -N,(number of bytes 字节数量) 设置显示字节数。 (如,-N 96表示只显示96个字节的数据)

常用组合语法:od -Ax -tx1z [-j offset] [-N length] [file...]
经常使用可以考虑创建别名:alias od='od -Ax -tx1z'

例:

[nosee@instance-4 ~]$ od -Ax -tx1z day1
000000 09 09 4a 61 6e 75 61 72 79 09 32 30 32 32 09 09  >..January.2022..<
000010 0a 53 75 09 4d 6f 09 54 75 09 57 65 09 54 68 09  >.Su.Mo.Tu.We.Th.<
000020 46 72 09 53 61 0a 09 09 09 09 09 09 20 31 0a 20  >Fr.Sa....... 1. <
000030 32 09 20 33 09 20 34 09 20 35 09 20 36 09 20 37  >2. 3. 4. 5. 6. 7<
000040 09 20 38 0a 20 39 09 31 30 09 31 31 09 31 32 09  >. 8. 9.10.11.12.<
000050 31 33 09 31 34 09 31 35 0a 31 36 09 31 37 09 31  >13.14.15.16.17.1<
000060 38 09 31 39 09 32 30 09 32 31 09 32 32 0a 32 33  >8.19.20.21.22.23<
000070 09 32 34 09 32 35 09 32 36 09 32 37 09 32 38 09  >.24.25.26.27.28.<
000080 32 39 0a 33 30 09 33 31 09 09 09 09 09 09 0a 68  >29.30.31.......h<
000090 61 68 61 0a 68 61 68 61 0a e6 96 b0 e5 95 8a ef  >aha.haha........<
0000a0 bc 81 ef bc 81 ef bc 81 ef bc 81 ef bc 81 0a 0a  >................<
0000b0 68 61 68 68 61 0a                                >hahha.<
0000b6
[nosee@instance-4 ~]$ od -Ax -tx1z -j 0x120 -N 96 /usr/bin/ls 
000120 01 00 00 00 04 00 00 00 00 70 01 00 00 00 00 00  >.........p......<
000130 00 70 01 00 00 00 00 00 00 70 01 00 00 00 00 00  >.p.......p......<
000140 10 89 00 00 00 00 00 00 10 89 00 00 00 00 00 00  >................<
000150 00 10 00 00 00 00 00 00 01 00 00 00 06 00 00 00  >................<
000160 90 03 02 00 00 00 00 00 90 13 02 00 00 00 00 00  >................<
000170 90 13 02 00 00 00 00 00 58 12 00 00 00 00 00 00  >........X.......<
000180

五、参考

书箱:《Unix & Linux 大学教程》第二十一章 (美)Harley Hahn 著 张杰良 译