![如何使用 Linux dd 将二进制文件的前 n 个字节写入特定的 HDD 扇区?](https://linux22.com/image/1571149/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20Linux%20dd%20%E5%B0%86%E4%BA%8C%E8%BF%9B%E5%88%B6%E6%96%87%E4%BB%B6%E7%9A%84%E5%89%8D%20n%20%E4%B8%AA%E5%AD%97%E8%8A%82%E5%86%99%E5%85%A5%E7%89%B9%E5%AE%9A%E7%9A%84%20HDD%20%E6%89%87%E5%8C%BA%EF%BC%9F.png)
我有一台 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=BLOCKS
BLOCKS
obs
在输出开始时 跳过大小的块
通过使用,bs=11
您会影响ibs
和obs
。seek=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