Hexdump 反向命令

Hexdump reverse command

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

恢复file,只给出hexdump file

的输出

如果只有hexdump file的输出,想恢复原文件,首先注意hexdump's default output depends on the endianness of the system you ran hexdump on!

如果您有权访问创建转储的系统,则可以使用以下命令确定其字节顺序:

[[ "$(printf '' | hexdump)" == *0103* ]] && echo big || echo little

反转小端十六进制转储

这是最常见的情况。所有 x86/x64 系统都是小端。如果你不知道 运行 hexdump file 系统的字节顺序,试试这个。

sed 's/ \(..\)\(..\)/ /g;$d' dump | xxd -r

sed 部分将 hexdump 的格式转换为 xxd 的格式,至少到目前为止 xxd -r 有效。

反转大端十六进制转储

sed '$d' dump | xxd -r

已知错误(见评论部分)

  • 如果原始文件的长度为奇数(例如 1、3、5、7、...、字节长),则会添加尾随空字节。
  • 如果使用 * 对原始文件的重复部分进行 hexdump 编辑,则无法正确还原它们。

您可以通过以下命令 运行 检查您的转储是否存在上述问题:

grep -qE '^\*|^[0-9a-f]*[13579bdf] *$' dump && echo bug || echo ok

首先创建 hexdump 的更好选择

除了非posix(因此不那么便携)xxd还有odoctal dump) 应该在所有类 unix 系统上可用,因为它由 posix:

指定
od -tx1 -An -v

将打印 hex 十进制转储,将数字分组为单个字节 (-tx1),其中 no A地址前缀(-An,类似于xxd -p)并且没有将重复部分缩写为*-v)。您可以使用 xxd -r -p.

反转此类转储

我写了一个简短的 AWK 脚本,它将 hexdump -C 输出反转回 原始数据。像这样使用:

reverse-hexdump.sh hex.txt > data

处理“*”重复标记并生成原始数据(即使是二进制数据)。 hexdump -Creverse-hexdump.sh 构成数据往返对。这是 在这里可用:

有很多更优雅的方法可以完成这项工作,但是当从 hexdump -C some_file.bin 生成的十六进制转储中重新生成二进制文件时,我已经快速破解了一些对我有用的东西 (tm):

sed 's/\(.\{8\}\)  \(..\) \(..\) \(..\) \(..\) \(..\) \(..\) \(..\) \(..\)/:    /g' some_file.hexdump | sed 's/\(.*\)  \(..\) \(..\) \(..\) \(..\) \(..\) \(..\) \(..\) \(..\)  |/      /g' | sed 's/.$//g' | xxd -r > some_file.restored

基本上,使用 2 个 sed 进程,每个进程处理它是每一行的一部分。丑陋,但有人可能会觉得它有用。

作为一个在 bash 上很烂的人,我无法理解已经发布的示例。 以下是我最初搜索时对我有帮助的内容:

将您的文本文件“AYE.TXT”转换为名为“BEE.TXT”的十六进制转储文件“

xxd -p "AYE.TXT" > "BEE.TXT"

获取您的十六进制转储文件 ("BEE.TXT") 并将其转换回 ascii 文件 "CEE.TXT"

xxd -r -p "BEE.TXT" > "CEE.TXT"

现在您已经有了一些简单的工作代码,请随时查看 命令行上的“xxd -help”以解释所有这些标志的作用。 (那部分是容易的部分,难的部分是 bash 语法的细节)

如果您没有 xxd,请使用 hexdumpodperlpython:

以下都给出相同的输出:

# 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{$/=e6} $_=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的一部分——如果没有链接,你可以试试运行ning busybox hexdump或者busybox xxd.

如果xxd无法反转数据,那你可以试试awk

旧时光:Zmodem

过去我们使用 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 支持接收 Zmodem,所以如果你在 screen 会话中:

screen
telnet somehost

然后键入 Ctrl+A:,然后键入 zmodem catchEnter。然后在远程主机的屏幕内,发出:

# sz -b mybinaryfile

看到以“!!!”开头的字符串时按Enter

当您看到“传输完成”时,如果您想要正常继续终端会话,您可能需要 运行 reset