10.05.2020

Linux的hexdump指令

這一次要記錄的是Linux下一個非常實用的指令:hexdump。Dump的意思是指「頃倒拋棄」;但在電腦的相關領域則是翻譯成「轉儲」。但自己覺得若是翻譯成「解譯解析」其實也挺貼切的 (還有另一個單字也翻譯做"解譯"、"解析":Parser,這個單字更貼切的翻譯是─語法分析程序)。在Linux的指令工具中,有許多這種類似的指令:hexdumpobjdumptcpdumpzdump等等。

hexdump指令工具,可以把檔案以16進制的方式給呈現出來。這個工具對一些*.ko, *.o, *.bin, *.hex的檔案分析非常有用。因為並不是所有的檔案都可以用cat指令完美的呈現,因為檔案之中若是有一些控制字元文字編輯軟體是無法正確地顯示。當然,為了展現這個指令工具的用法,會先編輯一個簡單的文字檔來操作:
[root@localhost ~]# 
[root@localhost ~]# cat -n ./hexdump.TXT
     1  ABCDEFGHIJKLMNOP
     2  QRSTUVWXYZ012345
     3  6789abcdefghijkl
     4  mnopqrstuvwxyz~!
     5  @#$%^&*()_+{}[]
[root@localhost ~]# 
首先,要看得懂這種格式表示法,最左上方的"0000000"是指開始的位置每一行是以16 Bytes做為單位來表示,所以到了第2行,就是原本的"0000000"再加上16,即16進位的"0000010"。以此類推。

1. "-b":把所要呈現的資料以8進制來表示。'A'的16進制值是0x41,轉換成8進制就是101。
[root@localhost ~]# 
[root@localhost ~]# hexdump -b ./hexdump.TXT
0000000 101 102 103 104 105 106 107 110 111 112 113 114 115 116 117 120
0000010 012 121 122 123 124 125 126 127 130 131 132 060 061 062 063 064
0000020 065 012 066 067 070 071 141 142 143 144 145 146 147 150 151 152
0000030 153 154 012 155 156 157 160 161 162 163 164 165 166 167 170 171
0000040 172 176 041 012 100 043 044 045 136 046 052 050 051 137 053 173
0000050 175 133 135 012
0000054
[root@localhost ~]# 
2. "-c":把每1個Byte,以ASCII碼來顯示。
[root@localhost ~]# 
[root@localhost ~]# hexdump -c ./hexdump.TXT
0000000   A   B   C   D   E   F   G   H   I   J   K   L   M   N   O   P
0000010  \n   Q   R   S   T   U   V   W   X   Y   Z   0   1   2   3   4
0000020   5  \n   6   7   8   9   a   b   c   d   e   f   g   h   i   j
0000030   k   l  \n   m   n   o   p   q   r   s   t   u   v   w   x   y
0000040   z   ~   !  \n   @   #   $   %   ^   &   *   (   )   _   +   {
0000050   }   [   ]  \n
0000054
[root@localhost ~]# 
3. "-C":把每1個Byte,除了以16進制表示之外,還同時顯示相對應的ASCII碼
[root@localhost ~]# 
[root@localhost ~]# hexdump -C ./hexdump.TXT
00000000  41 42 43 44 45 46 47 48  49 4a 4b 4c 4d 4e 4f 50  |ABCDEFGHIJKLMNOP|
00000010  0a 51 52 53 54 55 56 57  58 59 5a 30 31 32 33 34  |.QRSTUVWXYZ01234|
00000020  35 0a 36 37 38 39 61 62  63 64 65 66 67 68 69 6a  |5.6789abcdefghij|
00000030  6b 6c 0a 6d 6e 6f 70 71  72 73 74 75 76 77 78 79  |kl.mnopqrstuvwxy|
00000040  7a 7e 21 0a 40 23 24 25  5e 26 2a 28 29 5f 2b 7b  |z~!.@#$%^&*()_+{|
00000050  7d 5b 5d 0a                                       |}[].|
00000054
[root@localhost ~]# 
4. "-d":以每2個Bytes為單位,顯示出相對應的10進制值。'A'是0x41,'B'是0x42,所以合起來就是0x4241,轉換成10進制就是16961。
[root@localhost ~]# 
[root@localhost ~]# hexdump -d ./hexdump.TXT
0000000   16961   17475   17989   18503   19017   19531   20045   20559
0000010   20746   21330   21844   22358   22872   12378   12849   13363
0000020   02613   14134   14648   25185   25699   26213   26727   27241
0000030   27755   27914   28526   29040   29554   30068   30582   31096
0000040   32378   02593   09024   09508   09822   10282   24361   31531
0000050   23421   02653
0000054
[root@localhost ~]# 
5. "-o":以每2個Bytes為單位,顯示出相對應的8進制值。10進制的16961,轉換成8進制就是041101 (固定6碼,不足補0)。
[root@localhost ~]# 
[root@localhost ~]# hexdump -o ./hexdump.TXT
0000000  041101  042103  043105  044107  045111  046113  047115  050117
0000010  050412  051522  052524  053526  054530  030132  031061  032063
0000020  005065  033466  034470  061141  062143  063145  064147  065151
0000030  066153  066412  067556  070560  071562  072564  073566  074570
0000040  077172  005041  021500  022444  023136  024052  057451  075453
0000050  055575  005135
0000054
[root@localhost ~]# 
6. "-v":嗯....這個參數的用途....仔細看,它並不是以0x41, 0x42, 0x43, 0x44,而是以每2 Bytes為單位,後面的排在前面; 這種排列方示,是跟系統的位元組順序 (Byte Order)有關。
[root@localhost ~]# 
[root@localhost ~]# hexdump -v ./hexdump.TXT
0000000 4241 4443 4645 4847 4a49 4c4b 4e4d 504f
0000010 510a 5352 5554 5756 5958 305a 3231 3433
0000020 0a35 3736 3938 6261 6463 6665 6867 6a69
0000030 6c6b 6d0a 6f6e 7170 7372 7574 7776 7978
0000040 7e7a 0a21 2340 2524 265e 282a 5f29 7b2b
0000050 5b7d 0a5d
0000054
[root@localhost ~]# 
7. "-x":嗯....此一參數的功能和"-v"非常類似....
[root@localhost ~]# 
[root@localhost ~]# hexdump -x ./hexdump.TXT
0000000    4241    4443    4645    4847    4a49    4c4b    4e4d    504f
0000010    510a    5352    5554    5756    5958    305a    3231    3433
0000020    0a35    3736    3938    6261    6463    6665    6867    6a69
0000030    6c6b    6d0a    6f6e    7170    7372    7574    7776    7978
0000040    7e7a    0a21    2340    2524    265e    282a    5f29    7b2b
0000050    5b7d    0a5d
0000054
[root@localhost ~]# 
8. "-n":只顯示前n個Bytes的資料。
[root@localhost ~]# 
[root@localhost ~]# hexdump -C -n 24 ./hexdump.TXT
00000000  41 42 43 44 45 46 47 48  49 4a 4b 4c 4d 4e 4f 50  |ABCDEFGHIJKLMNOP|
00000010  0a 51 52 53 54 55 56 57                           |.QRSTUVW|
00000018
[root@localhost ~]# 
9. "-s":從偏移量 (Offset)開始輸出;例如:我要從第8個Byte開始輸出,只輸出24個Bytes的資料:
[root@localhost ~]# 
[root@localhost ~]# hexdump -C -s 8 -n 24 ./hexdump.TXT
00000008  49 4a 4b 4c 4d 4e 4f 50  0a 51 52 53 54 55 56 57  |IJKLMNOP.QRSTUVW|
00000018  58 59 5a 30 31 32 33 34                           |XYZ01234|
00000020
[root@localhost ~]# 
以上,是hexdump指令工具的基礎用法;而[-e format_string][-f format_file]是比較高階的用法,這一部份我還沒研究,不過上述的9個參數,應該就可以滿足大部份程式員工作上的需求。

沒有留言:

張貼留言