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
还有od
(octal 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 -C
和 reverse-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
,请使用 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{$/=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 catch
和 Enter
。然后在远程主机的屏幕内,发出:
# sz -b mybinaryfile
看到以“!!!”开头的字符串时按Enter
。
当您看到“传输完成”时,如果您想要正常继续终端会话,您可能需要 运行 reset
。
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
还有od
(octal 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 -C
和 reverse-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
,请使用 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{$/=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 catch
和 Enter
。然后在远程主机的屏幕内,发出:
# sz -b mybinaryfile
看到以“!!!”开头的字符串时按Enter
。
当您看到“传输完成”时,如果您想要正常继续终端会话,您可能需要 运行 reset
。