Как написать, скажем, первые n байтов двоичного файла в определенном секторе жесткого диска, используя Linux dd?

298
rajeev

У меня есть виртуальная машина VMWare Windows 10, и я загрузился в Live Linux Mint.

Я просто хочу написать первые n байтов двоичного файла в конкретный сектор на жестком диске, используя dd в Linux. Для этого я добавил виртуальный жесткий диск объемом 500 МБ в Windows и отформатировал его как NTFS.

Я использую команду

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

Здесь / dev / sdb - жесткий диск на 500 МБ (не раздел на нем)

/media/mint/(mount)/Temp/mbr.img - это двоичный файл. Я просто сбросил MBR, например.

bs = 11 надеюсь это для 11 байтов

seek = 1000 Я надеюсь, что это будет 1000-й сектор (по умолчанию 512 байт на сектор)

Команда успешно завершена.

Однако, когда из Windows 10 Hex Workshop я проверяю содержимое сектора 999,1000 и 1001 (я не слишком уверен, к чему относится поиск = 1000), они остаются пустыми. На нем ничего не написано с mbr.img.

Когда я ищу примеры данных первых 11 байт на жестком диске, я нигде не нахожу их.

В Hex Workshop я придерживаюсь десятичных чисел для перехода в сектор.

Может ли кто-нибудь помочь мне в дальнейшем выяснить, в чем здесь ошибка / проблема?

enter image description here

0

2 ответа на вопрос

2
Kamil Maciorowski

От 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 
0
dirkt

Если вы установите размер блока 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 
Если вы попытаетесь, пожалуйста, сообщите, если прямые изменения в байтовой точности (`bs = 1`) работают - я хотел бы знать, если они работают. dirkt 5 лет назад 0
В моем Debian я могу изменить один байт в секторе жесткого диска, не затрагивая соседние байты. Я думаю, что ядро ​​должно прочитать весь сектор, изменить байт и записать весь измененный сектор обратно; но такие манипуляции - это его работа, а не `dd` (ни один из инструментов пользователя). Kamil Maciorowski 5 лет назад 1
@KamilMaciorowski: ядро, безусловно, должно выполнить чтение перед записью, вопрос был в том, действительно ли оно * делает * это на узлах блочных устройств, во-первых (одной из альтернатив было бы просто игнорировать неблокированные записи или выбрасывать ошибка). Вот почему я включил обходной путь. dirkt 5 лет назад 0
Да, я попробовал команду, предложенную Камилем Макиоровским, и она точно скопировала указанные n байтов с начала файла в указанный сектор. Спасибо вам за ваш ответ. Узнал что-то новое сегодня. rajeev 5 лет назад 0

Похожие вопросы