一、簡介
在計(jì)算機(jī)科學(xué)中,一個(gè) 0 或 1 存儲(chǔ)的數(shù)據(jù)稱為一個(gè)位(bit棍辕,代表 binary digit暮现,即二進(jìn)制數(shù));連續(xù) 8 位稱為一個(gè)字節(jié)痢毒。
od
和 hexdump
可以以可讀的格式顯示任何類型的二進(jìn)制數(shù)據(jù)送矩。實(shí)際上,這兩個(gè)文件是兩個(gè)基于文本的查看二進(jìn)制文件內(nèi)部的主要工具哪替。
大多數(shù)有經(jīng)驗(yàn)的 Unix 人士傾向于選擇一個(gè)自己喜歡的程序使用,要么是 od 菇怀,要么是 hexdump
二凭舶、規(guī)范輸出
某種特定格式的二進(jìn)制文件輸出格式稱為規(guī)范輸出,如:
[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 ~]$
其中爱沟,左邊是十六進(jìn)制的偏移帅霜,中間是十六進(jìn)制的數(shù)據(jù),右邊是數(shù)據(jù)的ASCII字符呼伸。
對(duì)于二進(jìn)制文件而言身冀,文件中沒有行,因此行號(hào)沒有意義括享。作為替代搂根,我們使用偏移(offset)標(biāo)記每個(gè)位置。偏移就是一個(gè)數(shù)字铃辖,告訴離文件開頭有多少字節(jié)剩愧。偏移不屬于數(shù)據(jù)的內(nèi)容,是 hexdump 程序加上去的娇斩,為了方便程序員閱讀仁卷。
其中,第一個(gè)字節(jié)的偏移是 0犬第;第二個(gè)字節(jié)偏移是 1锦积;以此類推。(記住歉嗓,1字節(jié)=8位=2個(gè)十六進(jìn)制數(shù)字)
在大多數(shù)二進(jìn)制文件中丰介,有些字節(jié)包含的是實(shí)際 ASCII 字符。通過查看最右邊的一欄可以方便地識(shí)別這些字節(jié)遥椿。根據(jù)約定基矮,沒有對(duì)應(yīng)可顯示 ASCII 字符的字節(jié)一律通過用一個(gè).(點(diǎn)號(hào))字符表示。(如上面的例子冠场,最前面的4a家浇,二進(jìn)制是01001010,十進(jìn)制是74碴裙,在ASCII碼中就是字符J )
二進(jìn)制文件中的大多數(shù)字節(jié)都不是字符(有一些只是碰巧會(huì)對(duì)應(yīng)于某個(gè)字符)钢悲,而是機(jī)器指令点额、數(shù)值數(shù)據(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
可以相當(dāng)于是 hexdump -C
。
常用選項(xiàng):
-
-C
惭等,(大寫C) 以規(guī)范格式顯示一個(gè)二進(jìn)制文件 -
-s offset
珍手,(skip over 略過) 設(shè)置初始偏移量指定在文件開頭略過多少字節(jié), offset 可以使用任何進(jìn)制表示的數(shù)字。(如辞做,-s 0x120
表示從偏移0x120處開始顯示數(shù)據(jù)) -
n length
琳要,(number of bytes 字節(jié)數(shù)量) 設(shè)置顯示字節(jié)數(shù), length 為十進(jìn)制數(shù)。 (如秤茅,-n 100
表示只顯示100個(gè)字節(jié)的數(shù)據(jù))
常用組合語法: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]]
常用選項(xiàng):
-
A
,(address 地址) 指定使用哪一種計(jì)數(shù)系統(tǒng)表示偏移值框喳。對(duì)于規(guī)范輸出來說课幕,需要將它指定為x
,即-Ax
五垮,這將以十六進(jìn)制顯示偏移乍惊。 -
-t
,(type of format 格式類型) 控制數(shù)據(jù)顯示的方式拼余。對(duì)于規(guī)范輸出來說污桦,需要將它指定為x1
(以十六進(jìn)制顯示數(shù)據(jù),每次一個(gè)字節(jié))匙监,和z
(在每行末尾加上相應(yīng)的ASCII值)凡橱,即-tx1z
。(注意亭姥,這里的1
稼钩,是數(shù)字1) -
-j
,(jump over 跳過) 指定從文件開頭跳過多少字節(jié)达罗。(如-j 0x120
坝撑,表示從偏移0x120處開始顯示數(shù)據(jù)) -
-N
,(number of bytes 字節(jié)數(shù)量) 設(shè)置顯示字節(jié)數(shù)粮揉。 (如巡李,-N 96表示只顯示96個(gè)字節(jié)的數(shù)據(jù))
常用組合語法:od -Ax -tx1z [-j offset] [-N length] [file...]
經(jīng)常使用可以考慮創(chuàng)建別名: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 大學(xué)教程》第二十一章 (美)Harley Hahn 著 張杰良 譯