如何使用 Linux dd 将二进制文件的前 n 个字节写入特定的 HDD 扇区?

如何使用 Linux dd 将二进制文件的前 n 个字节写入特定的 HDD 扇区?

我有一台 VMWare 虚拟机 Windows 10,并且已经启动到 Live Linux Mint。

我只想使用 Linux 上的 dd 将二进制文件的前 n 个字节写入硬盘上的特定扇区。为此,我在 Windows 中添加了一个 500MB 虚拟硬盘并将其格式化为 NTFS。

我使用的命令是

sudo  dd of=/dev/sdb if=/media/mint/<mount>/Temp/mbr.img bs=11 seek=1000 count=1

这里 /dev/sdb 是 500 MB 的硬盘(不是其上的分区)

/media/mint/(mount)/Temp/mbr.img 是二进制文件。例如,我只是转储了 MBR。

bs=11 我希望这是 11 个字节

seek =1000 我希望这是转到第 1000 个扇区(默认每个扇区 512 字节)

命令成功完成。

但是当我在 Windows 10 Hex Workshop 中检查扇区 999、1000 和 1001 的内容时(我不太确定 seek=1000 解析为什么),它们是空白的。mbr.img 上没有写入任何内容。

当我在硬盘上搜索前 11 个字节的样本数据时,我没有找到它。

在 Hex Workshop 中,我坚持使用十进制数来跳转到某个扇区。

有人能帮助我进一步排除这里的错误/问题吗?

在此处输入图片描述

答案1

man 1 dd

bs=BYTES
BYTES一次 读取和写入字节(另请参阅ibs=, obs=

ibs=BYTES
BYTES一次 读取一个字节(默认值512:)

obs=BYTES
BYTES一次 写入字节(默认值512:)

seek=BLOCKSBLOCKS obs在输出开始时 跳过大小的块

通过使用,bs=11您会影响ibsobsseek=1000使用obs。您希望跳过 1000 个输出扇区,但实际上您跳过了 1000 个输出块,每个块 11 个字节。

看起来你想要类似的东西

sudo dd if=/path/to/mbr.img ibs=11 count=1 of=/dev/sdb obs=512 seek=1000 

答案2

如果您设置块大小 bs到 11,然后寻找 1000 个块,您跳过了 1000*11 = 11000 字节,而不是 1000*512=512000 字节,即 1000 个扇区。因此,显然,这是行不通的,您现在已经更改了硬盘的其他部分,这可能会给您带来麻烦(因此请考虑撤消该更改的方法)。

我知道你可以用dd文件具有字节精度,因此文件你可以做类似的事情

dd ... bs=1 count=11 seek=512000

但是,我不确定你是否可以在 上写入块的一部分/dev/sdb。如果不能,一种方法是使用类似以下内容复制该特定块

dd if=/dev/sdb of=/tmp/myblock bs=512 skip=1000 count=1

然后编辑文件/tmp/myblock,或者使用dd进行字节精度更改(当然seek,不用 ,因为文件只包含要更改的块),最后用

dd of=/dev/sdb if=/tmp/myblock bs=512 seek=1000 count=1

相关内容