【发布时间】:2017-09-29 03:59:02
【问题描述】:
hexdump 命令将任何文件转换为十六进制值。
但是如果我有十六进制值并且我想反转这个过程,这可能吗?
【问题讨论】:
标签: linux reverse-engineering hexdump
hexdump 命令将任何文件转换为十六进制值。
但是如果我有十六进制值并且我想反转这个过程,这可能吗?
【问题讨论】:
标签: linux reverse-engineering 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
【讨论】:
xxd -r 也接受hexdump 输出作为输入。
[0-9A-F]* 的流,我该怎么办?跨度>
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
hexdumped 使用*,原始文件的重复部分将无法正确恢复。您可以通过运行以下命令来检查您的转储是否存在上述问题:
grep -qE '^\*|^[0-9a-f]*[13579bdf] *$' dump && echo bug || echo ok
除了非posix(因此不那么便携)xxd 还有od(octal dump)应该在所有unix上都可用- 由 posix 指定的类似系统:
od -tx1 -An -v
将打印一个他x十进制转储,将数字分组为单个字节(-tx1),带有no A地址前缀( -An,类似于xxd -p) 并且没有将重复部分缩写为* (-v)。您可以使用xxd -r -p 反转此类转储。
【讨论】:
hexdump 可以使用* 隐藏重复的部分。该命令也无法正确恢复这些部分。示例:yes | head -n100 | hexdump | sed -E 's/ /: /;s/ (..)(..)/ \2\1/g' | xxd -r 只打印 8 个 y 而不是 100 个。修复这些东西需要的不仅仅是这一条线。也许我将来会添加另一个脚本。
-v 选项运行hexdump,则可以避免* 错误。
xdd -r 可以单独处理 hexdump 的默认输出。
我编写了一个简短的 AWK 脚本,它将 hexdump -C 输出反转回
原始数据。像这样使用:
reverse-hexdump.sh hex.txt > data
处理“*”重复标记并生成原始数据,即使是二进制数据。
hexdump -C 和 reverse-hexdump.sh 构成数据往返对。它是
可在此处获得:
【讨论】:
有很多更优雅的方法可以完成这项工作,但是当从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 进程,每个进程处理它是每一行的一部分。丑陋,但有人可能会觉得它有用。
【讨论】:
作为一个不擅长 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{$/=\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 支持接收 Zmodem,所以如果你在 screen 会话中:
screen
telnet somehost
然后输入Ctrl+A 和:,然后输入zmodem catch 和Enter。然后在远程主机的屏幕内,发出:
# sz -b mybinaryfile
当您看到以“!!!”开头的字符串时,请按Enter。
当您看到“传输完成”时,如果您想正常继续终端会话,您可能需要运行reset。
【讨论】: