Możesz sprawić, że urządzenie nie będzie bootowalne, po prostu tworząc pierwsze bajty na dysku 0x00.
Zazwyczaj (i dotyczy to zarówno grub, grub2, jak i ntldr iirc) pierwszym bajtem dysku będzie instrukcja jmp x86. Dzieje się tak nawet przed etykietą dysku, ponieważ przekazując wykonanie do urządzenia w celu uruchomienia go, po prostu ustawia procesor tak, aby zasysał informacje o urządzeniu jako kod. Jeśli ma niepoprawny kod, wyzwala przerwanie, a BIOS obsługuje wyjątek i przechodzi do następnego urządzenia rozruchowego.
Na przykład początek mojego dysku zaczyna się od:
00000000 eb 63 90 d0 bc 00 7c fb 50 07 50 1f fc be 1b 7c |.c....|.P.P....||
Pierwszą częścią jest eb 63
Jump to offset 0x63 od bieżącego adresu IP (czyli do 0x65).
00000060 00 00 00 00 ff fa 90 90 f6 c2 80 74 05 f6 c2 70 |...........t...p|
00000070 74 02 b2 80 ea 79 7c 00 00 31 c0 8e d8 8e d0 bc |t....y|..1......|
Wykonanie trwa odtąd.
Koniec sektora wygląda następująco:
000001b0 cd 10 ac 3c 00 75 f4 c3 ed db 96 d6 00 00 80 01 |...<.u..........|
000001c0 01 00 83 fe ff ff 3f 00 00 00 c1 07 a6 0e 00 fe |......?.........|
000001d0 ff ff 83 fe ff ff 00 60 00 11 00 00 38 29 00 fe |.......`....8)..|
000001e0 ff ff 82 fe ff ff 00 08 a6 0e 00 58 5a 02 00 00 |...........XZ...|
000001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa |..............U.|
Jeśli dysk jest sformatowany jako tablica partycji MBR, potrzebne są tylko dwie rzeczy: tablica partycji z przesunięciem 0x1be
i sygnatura MBR, 55aa
która występuje na samym końcu sektora z przesunięciem 0x1fe
. 0x1be
ma wartość dziesiętną 446.
Następujące (oczywiście) uniemożliwi uruchomienie urządzenia. Ale tego właśnie chcesz. Jeśli nie chcesz, aby urządzenie nie mogło zostać uruchomione, nie rób tego, mmm-kay? Zakładam, że twoje urządzenie jest /dev/sdz
po prostu dlatego, że niewiele osób ma /dev/sdz
, a to zmniejsza ryzyko, że jakiś idiota nowicjusz ślepo kopiuje polecenia wklejania.
Najpierw skopiuj MBR do pliku w celu utworzenia kopii zapasowej.
sudo dd if=/dev/sdz of=/some/where/safe/preferably/not/on/dev/sdz/backup.mbr bs=512 count=1
Następnie wykonaj kopię tego pliku:
cp backup.mbr backup.mbr.test
Następnie musimy utworzyć urządzenie sprzężenia zwrotnego (aby zawartość nie została obcięta.) I zastosuj zmiany w naszym fałszywym sektorze 0 jako test:
sudo losetup /dev/loop7 backup.mbr.test
sudo dd if=/dev/zero of=/dev/loop7 bs=446 count=1
sudo losetup -d /dev/loop7
hexdump
plik i upewnij się, że cała tabela partycji jest nienaruszona:
sudo hexdump -C backup.mbr.test
Powinieneś zobaczyć coś takiego:
00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
000001b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 01 |................|
000001c0 01 00 83 fe ff ff 3f 00 00 00 c1 07 a6 0e 00 fe |......?.........|
000001d0 ff ff 83 fe ff ff 00 60 00 11 00 00 38 29 00 fe |.......`....8)..|
000001e0 ff ff 82 fe ff ff 00 08 a6 0e 00 58 5a 02 00 00 |...........XZ...|
000001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa |..............U.|
00000200
Teraz 0x1be
jest to miejsce, w którym widzisz 80
na zrzucie szesnastkowym, może to być również 00
i nadal być poprawne. (Jest to flaga „bootowalna” w tablicy partycji, możesz ją zostawić w spokoju, ponieważ jest ona całkowicie ignorowana przez większość współczesnych BIOS-ów). Bajt na 0x1bf
prawie nigdy nie będzie 0x00
(najczęściej, 0x01
ale może przyjmować inne wartości) możesz porównać to z twoim, backup.mbr
aby upewnić się, że nic przeszłego się nie 0x1be
zmieniło.
Po upewnieniu się, że zmiana została poprawnie zastosowana, możesz bezpośrednio skopiować plik na pierwszą część dysku. Powodem, dla którego chcesz zrobić plik, a nie /dev/zero
ponownie, jest bezpieczeństwo przed literówkami. Jeśli przypadkowo zapomnisz, count=1
że będziesz miał zły czas, kopiowanie pliku z drugiej strony nigdy nie będzie przebiegać poza EOF. Więc jest bezpieczniej.
sudo dd if=backup.mbr.test of=/dev/sdz
Następnie hexdump
dysk, aby upewnić się, że zmiany zostały wykonane zgodnie z oczekiwaniami.
hexdump -C /dev/sdz | head
Porównaj w porównaniu 0x200
z, backup.mbr.test
aby upewnić się, że to, czego chcesz.
Wreszcie, jeśli coś zepsuje z jakiegokolwiek powodu, możesz po prostu skopiować kopię zapasową MBR z powrotem na dysk za pomocą:
sudo dd if=backup.mbr of=/dev/sdz
Mam nadzieję że to pomoże.