linux Hexdump反向命令

kyxcudwk  于 2023-01-08  发布在  Linux
关注(0)|答案(8)|浏览(288)

hexdump命令可将任何文件转换为十六进制值。
但是如果我有十六进制的值,我想把这个过程反过来,这可能吗?

gdrx4gfi

gdrx4gfi1#

有一个类似的工具叫做xxd,如果你只使用一个文件名运行xxd,它会以一个相当标准的十六进制转储格式转储数据:

# xxd bdata
0000000: 0001 0203 0405
......

现在,如果使用-r选项将输出通过管道传回xxd,并将其重定向到一个新文件,则可以将十六进制转储转换回二进制:

# xxd bdata | xxd -r >bdata2
# cmp bdata bdata2
# xxd bdata2
0000000: 0001 0203 0405
laawzig2

laawzig22#

我编写了一个简短的AWK脚本,它将hexdump -C输出反转为原始数据。

reverse-hexdump.sh hex.txt > data

处理'*'重复标记并生成原始数据(即使是二进制)。hexdump -Creverse-hexdump.sh构成数据往返对。可从以下位置获得:

wgeznvg7

wgeznvg73#

还原file,仅给定hexdump file的输出

如果您只有hexdump file的输出,并且想要恢复原始文件,首先注意hexdump's default output depends on the endianness of the system you ran hexdump on
如果您有权访问创建转储的系统,则可以使用以下命令确定其字节序:

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

反向小端十六进制转储

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

sed 's/ \(..\)\(..\)/ \2\1/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(因此不那么可移植)之外,还有odoctaldump),它应该可以在所有类Unix系统上使用,因为posix指定了它:

od -tx1 -An -v

将打印一个x十进制转储,将数字分组为单个字节(-tx1),带有noA地址前缀(-An,类似于xxd -p),并且不将重复部分缩写为*-v)。您可以使用xxd -r -p反转此类转储。

vfh0ocws

vfh0ocws4#

作为一个在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语法的细节)。

7ajki6be

7ajki6be5#

有很多更优雅的方法可以实现这一点,但我很快就找到了一个方法,当从hexdump -C some_file.bin生成的十六进制转储文件中重新生成二进制文件时,它可以为我工作(tm):

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进程,每个进程处理每行的一部分。很难看,但有人可能会发现它很有用。

pokxtpni

pokxtpni6#

如果没有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{$/=\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 hexdumpbusybox xxd
如果xxd不可用于反转数据,则可以尝试awk

过去的日子:Z调制解调器

在过去,我们使用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
当您看到“Transfer Complete”时,如果您希望正常继续终端会话,您可能希望运行reset

ar7v8xwq

ar7v8xwq7#

此程序将hexdump -C输出反转为原始数据。

Usage:

make
make test
./unhexdump -i inputfile -o outputfile

参见https://github.com/zhouzq-thu/unhexdump

8wtpewkr

8wtpewkr8#

我找到了更简单解决办法:
二进制十六进制
第一个月
己二苯
echo -n "616263" | grep -Eo ".{2}" | sed 's/\(.*\)/\\x\1/' | tr -d '\n' | xargs -0 echo -ne

相关问题