如何用 dd 命令覆盖二进制文件中的某些字节?

30

我有一个二进制文件,想要替换地址为DEADBEEF处的值A2为另一个值A1

我该如何使用dd命令进行操作?如果有其他工具可以实现此功能,请给出建议。但我计划在iPhone上进行操作,因此只能使用最基本的Unix工具。

2个回答

52
printf '\xa1' | dd of=somefile bs=1 seek=$((0xdeadbeef)) conv=notrunc

这在我的机器上不起作用。修改后,somefile 文件最终被截断了。 - gromain
1
然而,当conv=notrunc在命令的末尾时它可以工作。 printf '\xa1' | dd of=somefile bs=1 seek=$((0xdeadbeef)) conv=notrunc - gromain

0
(相同的答案,但不适合放在评论中:)
我想在应用所需的补丁之前预览文件内容;dd在输入和输出文件上使用不同的参数集,所以记得使用ifiseek
% dd if=somefile bs=1 iseek=4488884 count=12 conv=notrunc | hexdump -C
12+0 records in
12+0 records out
12 bytes copied, 0.000131 s, 91.6 kB/s
00000000  1f 04 00 71 40 02 00 54  a1 02 40 f9              |...q@..T..@.|
0000000c

而且一个多字节的补丁(dd将会用stdin提供的任何内容进行覆盖,所以不需要指定长度):
% printf '\x40\x02\x00\x54' | dd of=somefile bs=1 seek=4488888 conv=notrunc
4+0 records in
4+0 records out
4 bytes copied, 0.000251 s, 15.9 kB/s

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接