Hexdump 命令可以将任何文件转换为十六进制值。
但是如果我已经有了十六进制值并且想要反向这个过程,这可能吗?
有一个类似的工具叫做xxd
。如果你只用文件名运行xxd
,它会以相当标准的十六进制转储格式转储数据:
# xxd bdata
0000000: 0001 0203 0405
......
如果您使用-r
选项将输出作为管道传递回 xxd
,并将其重定向到新文件,则可以将十六进制转储转换回二进制:
# xxd bdata | xxd -r >bdata2
# cmp bdata bdata2
# xxd bdata2
0000000: 0001 0203 0405
我写了一个简短的 AWK 脚本,可以将 hexdump -C
输出的结果反向转换为原始数据。使用方法如下:
reverse-hexdump.sh hex.txt > data
处理'*'重复标记,即使是二进制数据也能生成原始数据。hexdump -C
和reverse-hexdump.sh
可以构成一个数据往返对。具体可以在以下地址获取:
hexdump -C
在没有-v
选项的情况下产生的*
重复标记。自述文件中的示例显示了它的工作原理。有5个单元测试用例证实了这一点。如果您真的遇到了无法正常工作的情况,请在GitHub存储库中提出问题。 - Mike Fleetwood文件
,仅提供hexdump file
的输出如果您只有hexdump file
的输出并且想要恢复原始文件,请首先注意hexdump默认输出取决于运行hexdump的系统的数据字节序(endian)!
如果您可以访问创建转储的系统,则可以使用下面的命令确定其字节序:
[[ "$(printf '\01\03' | hexdump)" == *0103* ]] && echo big || echo little
这是最常见的情况。所有的x86/x64系统都是小端模式。如果你不知道运行hexdump file
的系统的字节序,可以尝试以下方法。
sed 's/ \(..\)\(..\)/ \2\1/g;$d' dump | xxd -r
sed
部分将hexdump
的格式转换为xxd
的格式,至少目前为止,xxd -r
可以正常工作。
sed '$d' dump | xxd -r
*
进行hexdump
,则无法正确恢复原始文件的重复部分。您可以通过运行以下命令检查上述问题:
grep -qE '^\*|^[0-9a-f]*[13579bdf] *$' dump && echo bug || echo ok
除了非posix(因此不太可移植)的xxd
之外,还有od
(八进制 转储),它应该在所有类unix系统上都可用,因为它是由posix指定的:
od -tx1 -An -v
将以十六进制转储方式打印,将数字按单个字节分组(-tx1
),不带地址前缀 (-An
,类似于xxd -p
),不缩写重复部分为 *
(-v
)。您可以使用 xxd -r -p
反转此类转储。
hexdump
命令的-v
选项运行它,就可以避免*
错误。 - David Knipexxd -p -r mydump
:hexdump -ve '1/1 "%.2x"' mybinaryfile > mydump
。 - dagelfxdd -r
可以单独处理 hexdump
的默认输出。 - Socowixxd -p "AYE.TXT" > "BEE.TXT"
xxd -r -p "BEE.TXT" > "CEE.TXT"
xxd
,可以使用hexdump
、od
、perl
或python
:以下所有方法都会产生相同的输出:
# If you only have hexdump
hexdump -ve '1/1 "%.2x"' mybinaryfile > mydump
# This gives exactly the same output as:
xxd -p mybinaryfile > mydump
# Or, much slower:
od -v -t x1 -An < mybinaryfile | tr -d "\n " > mydump
# Or, the fastest:
perl -pe 'BEGIN{$/=\1e6} $_=unpack "H*"' < mybinaryfile > mydump
# Or, if you somehow have Python, and not Perl:
python -c "print(open('mybinaryfile','rb').read().hex())" > mydump
然后您可以复制粘贴或使用管道输出,并使用以下命令进行转换:
xxd -r -p mydump mybinaryfileagain
# Or
xxd -r -p < mydump > mybinaryfileagain
hexdump
命令几乎可以在任何地方使用,并且通常是默认的busybox
的一部分 - 如果没有链接,您可以尝试运行busybox hexdump
或busybox xxd
。
如果xxd
不可用于反转数据,则可以尝试使用awk。
在旧时代,我们曾经使用X/Y/Zmodem,它包含在lrzsz
软件包中,可以容忍有损通信 - 但它是双向协议,因此二进制文件需要同时运行,并且需要双向通信:
# Demo on local machine, using FIFOs
mkfifo /tmp/fifo-in
mkfifo /tmp/fifo-out
sz -b mybinaryfile > /tmp/fifo-out < /tmp/fifo-in
mkdir out; cd out
rz -b < /tmp/fifo-out > /tmp/fifo-in
screen
telnet somehost
然后输入Ctrl+A
,然后:
,然后zmodem catch
和Enter
。然后在远程主机的屏幕内,输入:
# sz -b mybinaryfile
当你看到以 "!!!" 开头的字符串时,请按 Enter
键。
当你看到 "Transfer Complete" 时,如果想要正常继续终端会话,可以运行 reset
命令。
这个程序可以将 hexdump -C
命令的输出结果反转回原始数据。
Usage:
make
make test
./unhexdump -i inputfile -o outputfile
有很多更优雅的方法来完成这个任务,但是在重新生成由hexdump -C some_file.bin
生成的十六进制转储文件时,我已经快速地把一些东西拼凑在一起,对我很有效(商标):
sed 's/\(.\{8\}\) \(..\) \(..\) \(..\) \(..\) \(..\) \(..\) \(..\) \(..\)/\1: \2\3 \4\5 \6\7 \8\9/g' some_file.hexdump | sed 's/\(.*\) \(..\) \(..\) \(..\) \(..\) \(..\) \(..\) \(..\) \(..\) |/\1 \2\3 \4\5 \6\7 \8\9 /g' | sed 's/.$//g' | xxd -r > some_file.restored
基本上,使用2个sed
进程,每个进程处理每行的一部分。虽然不太美观,但某些人可能会发现它有用。
xxd -r
还可以接受hexdump
输出作为输入。 - tripleee[0-9A-F]*
直到文件结束,那我该怎么办? - Aaron Franke