使用hexdump查看二进制文件

  • 使用hexdump查看二进制文件已关闭评论
  • 37 views
  • A+
所属分类:linux命令

介绍

hexdumplinux中一个查看二进制文件的指令。实际上所有的普通文件都可以用这个指令来查看,并不限定于非得是二进制文件。可用十六进制、十进制、八进制数或 ASCII 码显示二进制文件内容的工具。它是个用于检查的工具,也可用于数据恢复、逆向工程和编程。

参数

[root@k3s ~]# hexdump -h
hexdump:无效选项 -- h

用法:
 hexdump [选项] 文件 ...

选项:
 -b 单字节八进制显示
 -c 单字节字符显示
 -C 规范化 十六进制+ASCII 显示
 -d 两字节十进制显示
 -o 两字节八进制显示
 -x 两字节十六进制显示
 -e 格式 用于显示数据的格式字符串
 -f 格式文件 包含格式字符串的文件
 -n 长度 只解释输入的指定长度个字节
 -s 偏移 跳过开头指定长度个字节
 -v 显示时不压缩相似的行
 -V 显示此帮助并退出

 

查看图片类型

我们随便找了个图片(line.png),将后面的后缀去掉位line,然后我们用file命令查看其类型,如下:

[root@k3s ~]# file line
line: PNG image data, 41 x 100, 8-bit/color RGBA, non-interlaced

那么这个结果是怎么得来的呢,你可以用 -C 选项将输出结果,或至少是其中可翻译的部分,翻译成更加熟悉的内容,如下:

[root@k3s ~]# hexdump -C line 
00000000 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 |.PNG........IHDR|
00000010 00 00 00 29 00 00 00 64 08 06 00 00 00 1b a6 19 |...)...d........|
00000020 44 00 00 00 19 74 45 58 74 53 6f 66 74 77 61 72 |D....tEXtSoftwar|
00000030 65 00 41 64 6f 62 65 20 49 6d 61 67 65 52 65 61 |e.Adobe ImageRea|
00000040 64 79 71 c9 65 3c 00 00 03 28 69 54 58 74 58 4d |dyq.e<...(iTXtXM|
00000050 4c 3a 63 6f 6d 2e 61 64 6f 62 65 2e 78 6d 70 00 |L:com.adobe.xmp.|
00000060 00 00 00 00 3c 3f 78 70 61 63 6b 65 74 20 62 65 |....<?xpacket be|
00000070 67 69 6e 3d 22 ef bb bf 22 20 69 64 3d 22 57 35 |gin="..." id="W5|
00000080 4d 30 4d 70 43 65 68 69 48 7a 72 65 53 7a 4e 54 |M0MpCehiHzreSzNT|
00000090 63 7a 6b 63 39 64 22 3f 3e 20 3c 78 3a 78 6d 70 |czkc9d"?> <x:xmp|
000000a0 6d 65 74 61 20 78 6d 6c 6e 73 3a 78 3d 22 61 64 |meta xmlns:x="ad|
000000b0 6f 62 65 3a 6e 73 3a 6d 65 74 61 2f 22 20 78 3a |obe:ns:meta/" x:|
000000c0 78 6d 70 74 6b 3d 22 41 64 6f 62 65 20 58 4d 50 |xmptk="Adobe XMP|
000000d0 20 43 6f 72 65 20 35 2e 36 2d 63 31 33 38 20 37 | Core 5.6-c138 7|
000000e0 39 2e 31 35 39 38 32 34 2c 20 32 30 31 36 2f 30 |9.159824, 2016/0|
000000f0 39 2f 31 34 2d 30 31 3a 30 39 3a 30 31 20 20 20 |9/14-01:09:01 |
00000100 20 20 20 20 20 22 3e 20 3c 72 64 66 3a 52 44 46 | "> <rdf:RDF|
00000110 20 78 6d 6c 6e 73 3a 72 64 66 3d 22 68 74 74 70 | xmlns:rdf="http|
00000120 3a 2f 2f 77 77 77 2e 77 33 2e 6f 72 67 2f 31 39 |://www.w3.org/19|
00000130 39 39 2f 30 32 2f 32 32 2d 72 64 66 2d 73 79 6e |99/02/22-rdf-syn|
00000140 74 61 78 2d 6e 73 23 22 3e 20 3c 72 64 66 3a 44 |tax-ns#"> <rdf:D|
00000150 65 73 63 72 69 70 74 69 6f 6e 20 72 64 66 3a 61 |escription rdf:a|
00000160 62 6f 75 74 3d 22 22 20 78 6d 6c 6e 73 3a 78 6d |bout="" xmlns:xm|
00000170 70 3d 22 68 74 74 70 3a 2f 2f 6e 73 2e 61 64 6f |p="http://ns.ado|
00000180 62 65 2e 63 6f 6d 2f 78 61 70 2f 31 2e 30 2f 22 |be.com/xap/1.0/"|
00000190 20 78 6d 6c 6e 73 3a 78 6d 70 4d 4d 3d 22 68 74 | xmlns:xmpMM="ht|
000001a0 74 70 3a 2f 2f 6e 73 2e 61 64 6f 62 65 2e 63 6f |tp://ns.adobe.co|
000001b0 6d 2f 78 61 70 2f 31 2e 30 2f 6d 6d 2f 22 20 78 |m/xap/1.0/mm/" x|
000001c0 6d 6c 6e 73 3a 73 74 52 65 66 3d 22 68 74 74 70 |mlns:stRef="http|
000001d0 3a 2f 2f 6e 73 2e 61 64 6f 62 65 2e 63 6f 6d 2f |://ns.adobe.com/|
000001e0 78 61 70 2f 31 2e 30 2f 73 54 79 70 65 2f 52 65 |xap/1.0/sType/Re|
000001f0 73 6f 75 72 63 65 52 65 66 23 22 20 78 6d 70 3a |sourceRef#" xmp:|
00000200 43 72 65 61 74 6f 72 54 6f 6f 6c 3d 22 41 64 6f |CreatorTool="Ado|
00000210 62 65 20 50 68 6f 74 6f 73 68 6f 70 20 43 43 20 |be Photoshop CC |
00000220 32 30 31 37 20 28 4d 61 63 69 6e 74 6f 73 68 29 |2017 (Macintosh)|
00000230 22 20 78 6d 70 4d 4d 3a 49 6e 73 74 61 6e 63 65 |" xmpMM:Instance|
00000240 49 44 3d 22 78 6d 70 2e 69 69 64 3a 38 37 43 44 |ID="xmp.iid:87CD|
00000250 31 32 31 45 43 39 30 44 31 31 45 38 39 37 33 37 |121EC90D11E89737|
00000260 45 36 42 43 30 33 44 32 32 42 31 38 22 20 78 6d |E6BC03D22B18" xm|
00000270 70 4d 4d 3a 44 6f 63 75 6d 65 6e 74 49 44 3d 22 |pMM:DocumentID="|
00000280 78 6d 70 2e 64 69 64 3a 38 37 43 44 31 32 31 46 |xmp.did:87CD121F|
00000290 43 39 30 44 31 31 45 38 39 37 33 37 45 36 42 43 |C90D11E89737E6BC|
000002a0 30 33 44 32 32 42 31 38 22 3e 20 3c 78 6d 70 4d |03D22B18"> <xmpM|
000002b0 4d 3a 44 65 72 69 76 65 64 46 72 6f 6d 20 73 74 |M:DerivedFrom st|
000002c0 52 65 66 3a 69 6e 73 74 61 6e 63 65 49 44 3d 22 |Ref:instanceID="|
000002d0 78 6d 70 2e 69 69 64 3a 34 31 32 43 39 39 46 46 |xmp.iid:412C99FF|
000002e0 43 39 30 44 31 31 45 38 39 37 33 37 45 36 42 43 |C90D11E89737E6BC|
000002f0 30 33 44 32 32 42 31 38 22 20 73 74 52 65 66 3a |03D22B18" stRef:|
00000300 64 6f 63 75 6d 65 6e 74 49 44 3d 22 78 6d 70 2e |documentID="xmp.|
00000310 64 69 64 3a 34 31 32 43 39 41 30 30 43 39 30 44 |did:412C9A00C90D|
00000320 31 31 45 38 39 37 33 37 45 36 42 43 30 33 44 32 |11E89737E6BC03D2|
00000330 32 42 31 38 22 2f 3e 20 3c 2f 72 64 66 3a 44 65 |2B18"/> </rdf:De|
00000340 73 63 72 69 70 74 69 6f 6e 3e 20 3c 2f 72 64 66 |scription> </rdf|
00000350 3a 52 44 46 3e 20 3c 2f 78 3a 78 6d 70 6d 65 74 |:RDF> </x:xmpmet|
00000360 61 3e 20 3c 3f 78 70 61 63 6b 65 74 20 65 6e 64 |a> <?xpacket end|
00000370 3d 22 72 22 3f 3e 13 ed 64 f8 00 00 00 80 49 44 |="r"?>..d.....ID|
00000380 41 54 78 da ec db b1 0d c0 20 0c 00 41 8c d2 66 |ATx...... ..A..f|
00000390 31 06 61 a8 0c 92 c5 32 80 33 00 5d 44 01 d1 7d |1.a....2.3.]D..}|
000003a0 6f e9 24 57 2e 1c 99 59 56 af 96 0d 82 84 84 84 |o.$W...YV.......|
000003b0 84 84 84 84 84 84 84 84 fc 13 f2 f8 3a f8 dc 7d |............:..}|
000003c0 ea 99 79 b6 2b ac 1b 12 12 12 12 12 12 12 12 12 |..y.+...........|
000003d0 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 |................|
000003e0 12 12 12 12 12 12 12 12 72 4a e1 8b 04 12 12 12 |........rJ......|
000003f0 12 12 12 12 12 12 12 12 12 72 e8 15 60 00 af 9c |.........r..`...|
00000400 0a c3 d6 e1 da 56 00 00 00 00 49 45 4e 44 ae 42 |.....V....IEND.B|
00000410 60 82 |`.|
00000412

在右侧的列中,你看到的是和左侧一样的数据,但是以 ASCII 码展现的。如果你仔细看,你可以从中挑选出一些有用的信息,如文件格式(PNG)以及文件创建、修改日期和时间(向文件底部寻找一下)。

file 命令通过头 8 个字节获取文件类型。程序员会参考 libpng 规范 来知晓需要查看什么。具体而言,那就是你能在该图像文件的头 8 个字节中看到的字符串 PNG。这个事实显而易见,因为它揭示了 file 命令是如何知道要报告的文件类型。

你也可以控制 hexdump 显示多少字节,这在处理大于一个像素的文件时很实用,如下:

[root@k3s ~]# hexdump -C -n 8 line 
00000000 89 50 4e 47 0d 0a 1a 0a |.PNG....|
00000008

你可以让 hexdump -n 8 的输出结果跟 libpng 官方规范中描述的 PNG 文件头相匹配,如下:

[root@k3s ~]# hexdump -n8 -e '30/1 "%d ""\n"' line 
137 80 78 71 13 10 26 10

hexdump 不只限于查看 PNG 或图像文件。你也可以用 hexdump 查看你日常使用的二进制文件,如 lsrsync,或你想检查的任何二进制文件。

 

查看文件

源文件如下:

[root@k3s ~]# cat max.c 
#include <stdio.h>
int main()
{
 int a = 100;
 int b = 200;
 int ret;
 ret = max(a, b);
 return ret;
}
int max(int num1, int num2)
{
 /* 局部变量声明 */
 int result;

if (num1 > num2)
 result = num1;
 else
 result = num2;

return result;
}

hexdump通过-e格式化文件内容,如下:

[root@k3s ~]# hexdump -e '"%_p"' max.c 
#include <stdio.h>.int main().{. *
int a = 10*
;. *
int b = 20*
;. *
int ret;. *
ret = max(a, b);. return ret;.}.int max(int num1, int num2).{. *
/* .................. */. *
int result;.*
 *
if (num1 > num2). *
result = num1;. *
else. *
result = num2;.*
 *
return result;.}.

 

字符串 %_p 告诉 hexdump 用你系统的默认字符集输出字符。-e 选项的所有格式符号必须以单引号包括起来.你也可以用附加选项强制 hexdump 一次处理 30 字节。具体而言,通过 30 除以 1 这种形式,你可以告诉 hexdump将 30 字节作为一个单元对待,如下:

[root@k3s ~]# hexdump -e '30/1 "%_p""\n"' max.c 
#include <stdio.h>.int main().
{. int a = 100;. int b = 20
0;. int ret;. ret = max(a,
 b);. return ret;.}.int max(in
t num1, int num2).{. /* ....
.............. */. int resul
t;.. if (num1 > num2). 
result = num1;. else. r
esult = num2;.. return resul
t;.}.

 

 

 

  • 安卓客户端下载
  • 微信扫一扫
  • weinxin
  • 微信公众号
  • 微信公众号扫一扫
  • weinxin
avatar