美文网首页Linux终极玩家
Linux深入探索11-二进制文件查看(hexdump 与 od

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

作者: 四月不见 | 来源:发表于2022-01-18 00:06 被阅读0次

    一、简介

    在计算机科学中,一个 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 著 张杰良 译

    相关文章

      网友评论

        本文标题:Linux深入探索11-二进制文件查看(hexdump 与 od

        本文链接:https://www.haomeiwen.com/subject/duzxhrtx.html