我需要将二进制文件的众所周知位置的一个字节更改为特定值,并且正在寻找一种使用命令行工具来实现这一目标的方法。
限制条件:
- 我需要改变一个字节。
- 我知道文件中字节的位置。
- 我知道我想要字节的值。这可以是任何内容,包括 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=1
dd 命令中的 。不过,我更愿意将其保留下来作为权宜之计,以防万一。输出中很容易出现多余的字节(例如echo
通常会附加换行符)。