大家好,又见面了,我是你们的朋友全栈君。 hexdump可以自定义显示格式, 不过要理解其中format unit以及一些概念才能灵活使用.
在hexdump中使用format string的方式如下:
代码语言:javascript复制$ hexdump -e '<format string>' <filename>
format unit
format string由format unit组成, 而format unit由如下部分组成:
- iteration count,可选, 一个整数, 表示每个这个format unit被应用的次数, 默认值1
- byte count,可选, 整数, 表示一次iteration处理的字节数, 默认值1
- format, 必选, 是
fprintf
风格的字符串, 必须使用双引号括起来
其中iteration count和byte count使用/
分隔.
举例:
代码语言:javascript复制$ hexdump -n 16 /bin/ls -e '16/1 "%c"'
ELF
$ hexdump -n 16 /bin/ls -e '16/ "%c"'
ELF
$ hexdump -n 16 /bin/ls -e '16 "%c"'
ELF
上面三个命令的功能和输出都是一样的, 功能是读取/bin/ls
的前16个字节, 然后依次按照他们的字符含义打印出来.
可以看出当只有iteration count的时候, /
和byte count都是可以省略的.
iteration count & byte count
下面来说说我对iteration count和byte count的理解.
使用伪代码描述如下:
代码语言:javascript复制while there is data to process:
for unit in format_string:
for i: 1->unit.iteration_count:
consume unit.byte_count byte
output like unit.format
iteration count是这个unit中的format被应用的次数
byte count是这个unit中format处理的字节数.
举例:
代码语言:javascript复制$ hexdump -n 16 /bin/ls -e '4/1 "%c" 12/1 " X"'
ELF 02 01 01 00 00 00 00 00 00 00 00 00
上面这个例子中的format string可以分为两个format unit: 4/1 "%c"
和12/1 " X"
所以就是先处理第一个unit, 意为一次处理1个byte, 当作字符输出, 处理4次.
然后处理第二个unit, 意为一次处理1个byte, 输出为16进制整数, 处理12次.
为了更好地理解byte count, 再看一个例子:
代码语言:javascript复制$ hexdump -n 16 /bin/ls -e '3/4 " x"'
464c457f 00010102 00000000 00000000
从例子中看出, 3/4
确实是一次处理4个byte, 然后把这4个byte作为一个整体, 应用x
进行输出, 结合字节序, 原来的02 01 01 00
作为16进制输出就是00010102
.
但是3/4
不是表明iteration count为3吗? 怎么出现了4个部分呢?
这是因为处理完3次之后, 发现没有其它的format string了, 再次应用format string来处理接下来的内容.
高级用法
多个format string
当有多个format string的时候, 是顺序应用每个format string的, 并且每轮处理, 每个format string的偏移是相同的:
代码语言:javascript复制$ hexdump -n 128 -e '16/1 " X" "n"' -e '"offset: %_adn"' /bin/ls
7F 45 4C 46 02 01 01 00 00 00 00 00 00 00 00 00
offset: 0
02 00 3E 00 01 00 00 00 A0 49 40 00 00 00 00 00
offset: 16
40 00 00 00 00 00 00 00 38 E7 01 00 00 00 00 00
offset: 32
00 00 00 00 40 00 38 00 09 00 40 00 1D 00 1C 00
offset: 48
06 00 00 00 05 00 00 00 40 00 00 00 00 00 00 00
offset: 64
40 00 40 00 00 00 00 00 40 00 40 00 00 00 00 00
offset: 80
F8 01 00 00 00 00 00 00 F8 01 00 00 00 00 00 00
offset: 96
08 00 00 00 00 00 00 00 03 00 00 00 04 00 00 00
offset: 112
hexdump格式控制符
处理fprintf
风格中的各种输出格式控制符之外, hexdump还有其它的控制符.
%_a[dos]
输出当前位置离起始位置的偏移, dos
表示输出的进制.
$ hexdump -n 1 -s 40 -e '1/1 "%_ad"' /bin/ls
40
%_A[dos]
类似上面的, 不过这个是在处理完数据之后的偏移.
代码语言:javascript复制$ hexdump -n 5 -s 40 -e '1/1 "%_Ad" 2/1 "%x" 2/1 " x"' /bin/ls
45
上面的format string明明有3个format unit, 却只有一个输出, 再次试验:
代码语言:javascript复制$ hexdump -n 5 -s 40 -e '2/1 " x" 1/1 "%_Ad" 2/1 " x"' /bin/ls
38 e745
发现凡是%_Ad
之后的内容都没有输出, 取而代之的是输出这个format string处理之后的偏移量.
%_c
显示字符, 对于ascii码对应的转义字符, 比如ascii为0, 则显示