Hexdump命令反转

May*_*ndi 5 linux hexdump reverse-engineering

hexdump命令将任何文件转换为十六进制值.但是,如果我有十六进制值并且我想要反转过程怎么办?这可能吗?

Ber*_*ert 6

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

# xxd bdata
0000000: 0001 0203 0405
......
Run Code Online (Sandbox Code Playgroud)

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

# xxd bdata | xxd -r >bdata2
# cmp bdata bdata2
# xxd bdata2
0000000: 0001 0203 0405
Run Code Online (Sandbox Code Playgroud)

  • 如果我的文件没有使用冒号、空格和换行符等格式,而只是一个匹配“[0-9A-F]*”直到文件末尾的流,我该怎么办? (2认同)

小智 6

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

reverse-hexdump.sh hex.txt > data
Run Code Online (Sandbox Code Playgroud)

处理“*”重复标记并生成原始数据,即使是二进制数据。 hexdump -Creverse-hexdump.sh建立数据往返对。它可以在这里找到:


Soc*_*owi 5

恢复file,仅给出输出hexdump file

\n

如果您只有 的输出hexdump file并想要恢复原始文件,请首先注意hexdump 的默认输出取决于您运行 hexdump 的系统的字节序

\n

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

\n
[[ "$(printf \'\\01\\03\' | hexdump)" == *0103* ]] && echo big || echo little\n
Run Code Online (Sandbox Code Playgroud)\n

反转小尾数十六进制转储

\n

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

\n
sed \'s/ \\(..\\)\\(..\\)/ \\2\\1/g;$d\' dump | xxd -r\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

反转大端十六进制转储

\n
sed \'$d\' dump | xxd -r\n
Run Code Online (Sandbox Code Playgroud)\n

已知错误(请参阅评论部分)

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

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

\n
grep -qE \'^\\*|^[0-9a-f]*[13579bdf] *$\' dump && echo bug || echo ok\n
Run Code Online (Sandbox Code Playgroud)\n

首先创建十六进制转储的更好选择

\n

除了非 posix(因此不那么可移植)之外,xxd还有odoctal d ump),它应该在所有类 UNIX 系统上可用,因为它是由 posix 指定的:

\n
od -tx1 -An -v\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n