与 dd 有点碰撞?

与 dd 有点碰撞?

我需要将二进制文件的众所周知位置的一个字节更改为特定值,并且正在寻找一种使用命令行工具来实现这一目标的方法。

限制条件:

  • 我需要改变一个字节。
  • 我知道文件中字节的位置。
  • 我知道我想要字节的值。这可以是任何内容,包括 0x01–0x19 范围内的不可打印字符。
  • 新值不依赖于旧值,因此不需要检索旧值。

要将文件中的第 9 个字节归零,我会这样做

dd if=/dev/zero of=/the/file bs=1 seek=8 count=1 conv=notrunc

如果我想要该文件中除零之外的任何内容,我会尝试将包含确切位值的内容通过管道传输到dd.就像是:

spit-out-bytes | dd of=/the/file bs=1 seek=8 count=1 conv=notrunc

我会用来做什么spit-out-bytes

答案1

首先,你的例子是错误的,它会覆盖第一个字节而不是第9个字节(你想要seek输出,而不是skip输入)。如果它是常规文件而不是块设备(用于conv=notrunc避免),它还会将文件截断为 1 个字节。

dd bs=1 seek=8 count=1 conv=notrunc if=/dev/zero of=somefile

在运行每个 dd 命令之前三次检查它......

我会用来做什么spit-out-bytes

您可以尝试 echo 或 printf...

$ echo -n -e '\x00\x88\xaa\xff' | hexdump -C
00000000  00 88 aa ff                                       |....|
00000004

$ printf '\x00\x88\xaa\xff' | hexdump -C
00000000  00 88 aa ff                                       |....|
00000004

顺便说一句,从技术上讲,如果您确定源只有 1 个字节大,则可以跳过count=1dd 命令中的 。不过,我更愿意将其保留下来作为权宜之计,以防万一。输出中很容易出现多余的字节(例如echo通常会附加换行符)。

相关内容