命令行查看二进制文件

Last Updated: 2023-06-04 07:48:37 Sunday

-- TOC --

xxd命令

在命令行显示十六进制数据,个人感觉xxd命令比hexdump要好用一些。

xxd命令默认显示:

$ xxd rand.bin
00000000: 5e2a 9217 e397 3545 0fc0 945a d354 e327  ^*....5E...Z.T.'
00000010: f70a b540 53a6 7daf fd43 f33c a2bf ec0e  ...@S.}..C.<....
00000020: 0ccd b603 aa05 e1e0 6119 06ad 5161 244b  ........a...Qa$K
00000030: 70e9 5002 8c99 46ce 941f 3c27 71ab 5fb0  p.P...F...<'q._.
00000040: 5909 9df7 8829 9c9d 6c35 4f21 06f5 9c37  Y....)..l5O!...7
00000050: e66a 2b3f 8f62 526c 760b b8d7 228a 65bb  .j+?.bRlv...".e.
00000060: 0bb7 d206 0ad6 3317 787c 463b 223b 1025  ......3.x|F;";.%
00000070: 6a36 cfea 1029 9ff2 749b 5a5b 243f c03c  j6...)..t.Z[$?.<
00000080: 1805 1ea7 6551 82cd 9d7e 1594 4024 64a6  ....eQ...~..@$d.
00000090: 6ffd 2cf2 7e26 a31b 3f07 f147 6abf d666  o.,.~&..?..Gj..f
000000a0: 58f5 eab8 396e 9bbc 92d5 cc55 bedf 0aac  X...9n.....U....
000000b0: ac12 903f cd1b c637 95c9 8fb7 4a7d bab5  ...?...7....J}..
000000c0: 96b6 17c2 29b6 d2ee 96ad 78b3 1118 ba2a  ....).....x....*
000000d0: ec0e 933b cd89 c260 d0a4 586f 0c71 335b  ...;...`..Xo.q3[
000000e0: 871d 5f07 03c1 1798 0366 184b e777 249c  .._......f.K.w$.
000000f0: dc23 fa1e 8191 734d 10d3 b8e3 64fe a821  .#....sM....d..!

xxd命令不存在字节序问题,默认按顺序显示,而hexdump如果不加-C参数,小心字节序!xxd命令默认会在右边显示byte的ASCII编码,如果可显示的话,不可显示用.占位,这是标准的处理方式。

-b,按二进制显示

-s,设置skip字节数

-l,设置length

-c,设置一个column显示多少byte

$ xxd -b -s8 -l8 -c4 rand.bin
00000008: 00001111 11000000 10010100 01011010  ...Z
0000000c: 11010011 01010100 11100011 00100111  .T.'

-a,autoskip,如果遇到大块全0的情况,仅用一个*表示,让显示更紧凑。

-u,使用大写。

如果我们知道两个offset,要查看这两个offset之间的内容,可以直接在命令行进行数值计算:

$ xxd -s<offset1> -l$((offset2-offset1)) <filename>

还可以用这个技巧,直接在命令输入十六进制数:

$ xxd -s$((0x0230)) ...

hexdump命令

小心,hexdump命令默认显示存在字节序问题:

$ hexdump rand.bin
0000000 2a5e 1792 97e3 4535 c00f 5a94 54d3 27e3
0000010 0af7 40b5 a653 af7d 43fd 3cf3 bfa2 0eec
0000020 cd0c 03b6 05aa e0e1 1961 ad06 6151 4b24
0000030 e970 0250 998c ce46 1f94 273c ab71 b05f
0000040 0959 f79d 2988 9d9c 356c 214f f506 379c
0000050 6ae6 3f2b 628f 6c52 0b76 d7b8 8a22 bb65
0000060 b70b 06d2 d60a 1733 7c78 3b46 3b22 2510
0000070 366a eacf 2910 f29f 9b74 5b5a 3f24 3cc0
0000080 0518 a71e 5165 cd82 7e9d 9415 2440 a664
0000090 fd6f f22c 267e 1ba3 073f 47f1 bf6a 66d6
00000a0 f558 b8ea 6e39 bc9b d592 55cc dfbe ac0a
00000b0 12ac 3f90 1bcd 37c6 c995 b78f 7d4a b5ba
00000c0 b696 c217 b629 eed2 ad96 b378 1811 2aba
00000d0 0eec 3b93 89cd 60c2 a4d0 6f58 710c 5b33
00000e0 1d87 075f c103 9817 6603 4b18 77e7 9c24
00000f0 23dc 1efa 9181 4d73 d310 e3b8 fe64 21a8
0000100
$ hexdump -C rand.bin
00000000  5e 2a 92 17 e3 97 35 45  0f c0 94 5a d3 54 e3 27  |^*....5E...Z.T.'|
00000010  f7 0a b5 40 53 a6 7d af  fd 43 f3 3c a2 bf ec 0e  |...@S.}..C.<....|
00000020  0c cd b6 03 aa 05 e1 e0  61 19 06 ad 51 61 24 4b  |........a...Qa$K|
00000030  70 e9 50 02 8c 99 46 ce  94 1f 3c 27 71 ab 5f b0  |p.P...F...<'q._.|
00000040  59 09 9d f7 88 29 9c 9d  6c 35 4f 21 06 f5 9c 37  |Y....)..l5O!...7|
00000050  e6 6a 2b 3f 8f 62 52 6c  76 0b b8 d7 22 8a 65 bb  |.j+?.bRlv...".e.|
00000060  0b b7 d2 06 0a d6 33 17  78 7c 46 3b 22 3b 10 25  |......3.x|F;";.%|
00000070  6a 36 cf ea 10 29 9f f2  74 9b 5a 5b 24 3f c0 3c  |j6...)..t.Z[$?.<|
00000080  18 05 1e a7 65 51 82 cd  9d 7e 15 94 40 24 64 a6  |....eQ...~..@$d.|
00000090  6f fd 2c f2 7e 26 a3 1b  3f 07 f1 47 6a bf d6 66  |o.,.~&..?..Gj..f|
000000a0  58 f5 ea b8 39 6e 9b bc  92 d5 cc 55 be df 0a ac  |X...9n.....U....|
000000b0  ac 12 90 3f cd 1b c6 37  95 c9 8f b7 4a 7d ba b5  |...?...7....J}..|
000000c0  96 b6 17 c2 29 b6 d2 ee  96 ad 78 b3 11 18 ba 2a  |....).....x....*|
000000d0  ec 0e 93 3b cd 89 c2 60  d0 a4 58 6f 0c 71 33 5b  |...;...`..Xo.q3[|
000000e0  87 1d 5f 07 03 c1 17 98  03 66 18 4b e7 77 24 9c  |.._......f.K.w$.|
000000f0  dc 23 fa 1e 81 91 73 4d  10 d3 b8 e3 64 fe a8 21  |.#....sM....d..!|
00000100

加上-C参数后,按顺序显示。

-C参数,Canonical,标准十六进制显示方式!

-c参数,char,直接打印出char:

$ hexdump -c update_time.sh
0000000   g   i   t       s   t   a   t   u   s       |   &       \  \n
0000010                   g   r   e   p       '   m   o   d   i   f   i
0000020   e   d   .   *   c   o   n   t   e   n   t   .   m   d   '    
0000030   |       \  \n                   a   w   k       '   {   p   r
0000040   i   n   t       $   2   }   '       |       \  \n            
0000050       x   a   r   g   s       -   I   {   }       d   i   r   n
0000060   a   m   e       {   }       |       \  \n                   x
0000070   a   r   g   s       -   I   {   }       p   y   t   h   o   n
0000080   3       l   a   s   t   _   u   p   d   a   t   e   .   p   y
0000090       {   }                                                    
0000093

-n,设置显示的byte长度

-s,skip

$ hexdump -C -s16 -n8 rand.bin
00000010  f7 0a b5 40 53 a6 7d af                           |...@S.}.|
00000018

hexdump命令如果遇到一段内容全是一样的0,默认会采用省略的方式来显示,如果加上-v参数,就不会省略,全部显示:

 dd if=/dev/zero of=./zero.bin bs=1024 count=1
1+0 records in
1+0 records out
1024 bytes (1.0 kB, 1.0 KiB) copied, 8.0446e-05 s, 12.7 MB/s
$ hexdump zero.bin
0000000 0000 0000 0000 0000 0000 0000 0000 0000
*
0000400

看到*,就表示有内容被省略了。

本文链接:https://cs.pynote.net/sf/linux/shell/202201062/

-- EOF --

-- MORE --