Bạn có thể khiến thiết bị không khởi động được đơn giản bằng cách tạo một vài byte đầu tiên của đĩa 0x00.
Thông thường (và điều này đúng cho cả grub, grub2 và ntldr iirc) byte đầu tiên của ổ đĩa của bạn sẽ là một lệnh jmp x86. Điều này xảy ra trước cả đĩa, bởi vì khi truyền thực thi cho thiết bị để khởi động nó, nó chỉ đơn giản đặt CPU để lấy thông tin của thiết bị dưới dạng mã. Nếu nó có mã không hợp lệ, nó sẽ kích hoạt ngắt và BIOS xử lý ngoại lệ và chuyển đến thiết bị có thể khởi động tiếp theo.
Chẳng hạn, phần đầu đĩa của tôi bắt đầu bằng:
00000000 eb 63 90 d0 bc 00 7c fb 50 07 50 1f fc be 1b 7c |.c....|.P.P....||
Phần đầu tiên eb 63
là Jump để bù 0x63 từ IP hiện tại (vì vậy đến 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......|
Thi hành tiếp tục từ đây.
Sự kết thúc của ngành trông như thế này:
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.|
Nếu đĩa của bạn được định dạng dưới dạng bảng phân vùng MBR thì nó chỉ cần có hai thứ, bảng phân vùng được bù 0x1be
và chữ ký MBR, 55aa
xuất hiện ở cuối của phần bù 0x1fe
. 0x1be
là số thập phân 446.
Điều sau đây (tất nhiên) sẽ làm cho thiết bị không thể khởi động. Nhưng đây là những gì bạn muốn. Nếu bạn không muốn làm cho thiết bị của mình không thể khởi động được thì đừng làm điều này, mmm-kay? Tôi cho rằng thiết bị của bạn là /dev/sdz
, đơn giản vì không có nhiều người có /dev/sdz
, và điều này làm giảm nguy cơ một số người mới ngốc nghếch sao chép một cách mù quáng các lệnh dán.
Đầu tiên, sao chép MBR vào một tệp để sao lưu.
sudo dd if=/dev/sdz of=/some/where/safe/preferably/not/on/dev/sdz/backup.mbr bs=512 count=1
Tiếp theo, tạo một bản sao của tập tin đó:
cp backup.mbr backup.mbr.test
Tiếp theo, chúng tôi phải tạo một thiết bị loopback (để nội dung không bị cắt ngắn.) Và áp dụng các thay đổi trên khu vực giả mạo 0 của chúng tôi dưới dạng thử nghiệm:
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
tệp và đảm bảo rằng toàn bộ bảng phân vùng còn nguyên vẹn:
sudo hexdump -C backup.mbr.test
Bạn sẽ thấy một cái gì đó như:
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
Bây giờ, 0x1be
là nơi bạn nhìn thấy 80
trên đầu ra hexdumped, điều này cũng có thể 00
và vẫn còn hiệu lực. (Đó là "khởi động" cờ trong bảng phân vùng, bạn có thể để nó một mình, bởi vì nó hoàn toàn bị bỏ qua bởi hầu hết các BIOS hiện đại ...) Byte tại 0x1bf
mặc dù hầu như sẽ không bao giờ được 0x00
(đó là phổ biến nhất 0x01
nhưng nó có thể có giá trị khác), bạn có thể so sánh điều này với bạn backup.mbr
để đảm bảo rằng không có gì quá khứ 0x1be
bị thay đổi.
Khi bạn hài lòng rằng bạn đã áp dụng thay đổi một cách chính xác thì bạn có thể sao chép trực tiếp tệp qua phần đầu tiên của đĩa. Lý do tại sao bạn muốn làm tệp chứ không phải /dev/zero
một lần nữa là vì sự an toàn chống lại lỗi chính tả. Nếu bạn vô tình bỏ qua count=1
bạn sẽ có một thời gian tồi tệ, sao chép một tập tin mặt khác sẽ không bao giờ chạy qua EOF, bao giờ. Vì vậy, nó an toàn hơn.
sudo dd if=backup.mbr.test of=/dev/sdz
Tiếp theo hexdump
đĩa của bạn để đảm bảo rằng các thay đổi đã diễn ra như mong đợi.
hexdump -C /dev/sdz | head
So sánh 0x200
với backup.mbr.test
để đảm bảo đó là những gì bạn muốn.
Cuối cùng, nếu bất cứ điều gì làm hỏng mọi lý do, bạn chỉ cần sao lưu bản sao lưu của MBR vào ổ đĩa thông qua:
sudo dd if=backup.mbr of=/dev/sdz
Hi vọng điêu nay co ich.