Częstą odpowiedzią jest rozpakowanie pliku ISO, zmodyfikowanie go i spakowanie ponownie. Wygląda na to, że „ISO Master”, jak wspomniano w odpowiedzi dv3500ea, jest dobrym front-endem do tego.
Jeśli:
- nie masz na to miejsca
- chcesz tylko zmodyfikować chirurgicznie, zamiast przepisywać całość
- chcesz zmodyfikować urządzenie pamięci masowej zawierające system plików isofs (aka iso9660) bez kopiowania całego urządzenia lub
- jeśli uważasz, że to rozpakowywanie / przepakowywanie nie jest wystarczająco hackerskie
Zatem ta odpowiedź jest dla Ciebie!
Podsumowując, zastąpimy istniejący plik w systemie plików isofs wybranym plikiem. Nasz pożądany plik musi być mniejszy niż istniejący (docelowy) plik, a końcowe białe znaki (lub śmieci) muszą być dopuszczalne. W rzeczywistości wymaga to tylko dwóch poleceń, ale należy zachować ostrożność: literówka może całkowicie zniszczyć docelowy system plików, a nawet zastąpić plik źródłowy. Kopie zapasowe są twoim przyjacielem!
W moim przypadku chciałem przechowywać skrypt w rozruchu na żywo, więc nie muszę go wpisywać za każdym razem. Skrypt jest na, script.py
a mój cel (pamięć USB) jest na /dev/sdc
. Rozmiar skryptu wynosi 202 bajty, więc naszym pierwszym krokiem jest znalezienie pliku większego niż 202 bajty, abyśmy mogli go zastąpić. Po zamontowaniu go w /mnt
, znalazłem odpowiedni plik na /mnt/info.txt
.
Nie możemy po prostu nadpisać info.txt
punktu montowania, narzeka on, że jest to system plików tylko do odczytu. Jesteśmy jednak rootami, więc pokażmy im, co to znaczy! Musimy dowiedzieć się, gdzie info.txt
jest system plików. Znaleźć jakiś ciąg znaków, który jest (prawdopodobnie) unikatowe info.txt
, na przykład This is the official distribution CD of X.
, i znajdź go na dysku:
$ 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 [...]
Alternatywnie, może to być również wykonane z grep, który jest o wiele szybciej, ale wtedy trzeba określić go od początku: $ sudo grep -oba 'This is ...' /dev/sdc
.
Teraz, gdy wiemy, gdzie to jest, wystarczy zastąpić te bajty naszym plikiem:
$ sudo dd if=script.py of=/dev/sdc conv=notrunc bs=1 seek=2573588480 count=202
Ta linia:
- kopiuje bajty z pliku wejściowego (
if
) do pliku wyjściowego ( of
) i nie ma znaczenia, że plik wyjściowy jest tak naprawdę urządzeniem, ponieważ „wszystko jest plikiem”.
conv=notrunc
mówi, aby nie obcinał pliku wyjściowego, ponieważ chcemy zastąpić tylko kilka bajtów, a nie nadpisywać plik od pewnego momentu.
bs=1
ustawia rozmiar bloku na 1. Zwykle potrzebujesz rozmiaru bloku 4k lub większego, ale to pozwala uniknąć konieczności wykonywania (wbudowanej) matematyki i pozwala nam określić lokalizację dokładnie do bajtu.
seek=N
szuka określonego punktu w pliku wyjściowym (należy pamiętać, że seek=N
różni się od tego, skip=N
ponieważ skip
pomija bajty z pliku wejściowego!). Ustawiamy go oczywiście tam, gdzie jest tekst docelowy.
count=N
skopiuj tylko tyle bajtów. Myślę, że można to pominąć, ponieważ zauważy koniec pliku wejściowego, ale zostawiłem go na wszelki wypadek.
I voila, plik jest nadpisany!
Ale poczekaj, plik docelowy był większy niż nasz skrypt, więc na pamięci USB plik jest teraz w rodzaju: „while do if (run) bla; bla (); yright 2007 X Inc.”. Ciągną się śmieci. Dwa sposoby, aby to naprawić: wydłuż nasz plik wejściowy (dodaj spacje) lub dodaj symbol komentarza na końcu. Należy zauważyć, że wielu redaktorów dodać do nowej linii na końcu, więc może chcesz ustawić count=
na N-1
bajtach (jeżeli plik jest teraz 203 bajtów, a zauważysz, że ostatni bajt to znak nowej linii, zestaw liczyć do 202). Możesz sprawdzić plik pod kątem nowych linii, używając xxd script.py | tail
i sprawdzając, czy ostatni bajt to 0a
(lub, w dziwnych przypadkach, 0d
).
Proces jest identyczny dla .iso
pliku, wystarczy mentalnie zastąpić /dev/sdc
go your.iso
.
Zauważ, że kiedy sprawdzasz cel w punkcie montowania, aby zobaczyć, czy zadziałał, być może będziesz musiał użyć go strings
ponownie (tym razem szukając skryptu), ponieważ plik prawdopodobnie nadal znajduje się w pamięci podręcznej odczytu.