Обычный ответ на это - распаковать файл iso, изменить его и упаковать снова. Похоже, что «ISO Master», как упоминалось в ответе dv3500ea, является хорошим интерфейсом для этого.
Если:
- у вас недостаточно места для этого
- Вы только хотите сделать хирургическую модификацию вместо того, чтобы переписать все это
- Вы хотите изменить устройство хранения, которое содержит файловую систему isofs (aka iso9660) без копирования всего устройства, или
- если вы думаете, что это распаковка / перепаковка просто не достаточно хакерская
Тогда этот ответ для вас!
Таким образом, мы заменим существующий файл в файловой системе isofs нашим желаемым файлом. Наш желаемый файл должен быть меньше существующего (целевого) файла, и конечный пробел (или мусор) должен быть приемлемым. Это на самом деле требует только две команды, но будьте осторожны: опечатка может полностью уничтожить целевую файловую систему или даже перезаписать исходный файл. Резервные копии ваш друг!
В моем случае я хотел сохранить скрипт в оперативной загрузке, поэтому мне не нужно каждый раз повторять его заново. Сценарий находится на, script.py
а моя цель (флешка) на /dev/sdc
. Размер скрипта составляет 202 байта, поэтому наш первый шаг - найти файл размером более 202 байтов, чтобы мы могли его перезаписать. После монтирования в /mnt
, я нашел подходящий файл в /mnt/info.txt
.
Мы не можем просто перезаписать info.txt
точку монтирования, она будет жаловаться, что это файловая система только для чтения. Однако мы root, поэтому давайте покажем им, что это значит! Нам нужно выяснить, где info.txt
находится файловая система. Найдите строку, которая (вероятно) уникальна info.txt
, например This is the official distribution CD of X.
, и найдите ее на диске:
$ sudo strings -a -t d /dev/sdc | grep 'CD of X.'
2573588480 This is the official distribution CD of X. See INSTALL for how to [...]
С другой стороны , это также может быть сделано с Grep, которая намного быстрее, но тогда вы должны указать его с самого начала: $ sudo grep -oba 'This is ...' /dev/sdc
.
Теперь, когда мы знаем, где это, нам просто нужно заменить эти байты нашим файлом:
$ sudo dd if=script.py of=/dev/sdc conv=notrunc bs=1 seek=2573588480 count=202
Эта строка:
- копирует байты из входного файла (
if
) в выходной файл ( of
), и ему все равно, что выходной файл на самом деле является устройством, потому что «все является файлом».
conv=notrunc
говорит не обрезать выходной файл, потому что мы хотим перезаписать только несколько байтов, а не перезаписать файл с определенной точки и далее.
bs=1
устанавливает размер блока равным 1. Обычно вы хотите, чтобы размер блока составлял 4 КБ или выше, но это позволяет избежать необходимости выполнять (встроенную) математическую обработку и позволяет указать точное местоположение байта.
seek=N
ищет определенную точку в выходном файле (обратите внимание, что seek=N
это отличается от того, skip=N
что skip
пропускает байты из входного файла!). Разумеется, мы установили, где находится целевой текст.
count=N
скопируйте только это много байтов. Я думаю, что это может быть опущено, потому что он заметит конец входного файла, но я оставил его просто для уверенности.
И вуаля, файл перезаписан!
Но подождите, целевой файл был больше, чем наш скрипт, поэтому на USB-накопителе этот файл теперь выглядит примерно так: «while do if run () blah; blah (); yright 2007 X Inc.». Там тянется мусор. Два способа исправить это: сделать наш входной файл длиннее (добавить пробелы) или добавить символ комментария в конце. Обратите внимание , что многие редакторы добавить новую строку в конце, так что вы можете установить count=
в N-1
байтах (если ваш файл теперь 203 байт, и вы заметите , что последний байт является символ новой строки, набор отсчет до 202). Вы можете проверить файл на наличие новых строк, используя xxd script.py | tail
и проверяя, является ли последний байт 0a
(или, в странных случаях, 0d
).
Процесс для .iso
файла идентичен , просто мысленно замените /dev/sdc
на your.iso
.
Обратите внимание, что когда вы проверяете цель в точке монтирования, чтобы увидеть, работает ли она, вам, возможно, придется использовать ее strings
снова (на этот раз при поиске сценария), поскольку файл, вероятно, все еще находится в кэше чтения.