Jesam, ali jednom sam poželeo da sam bio te sreće da sam ga mogao povratiti na taj način -- povratio sam ga tada na teži način -- ručnim editovanjem, bajt po bajt. Naime, poslednjih 66 bajta u MBR-u, su kritična (zapravo 64 od tih 66) -- predstavljaju tabelu particija, sadrže njihove tipove, active flag, početak, dužinu, kao i prvi i poslednji sektor u CHS formatu (taman 10 bajtova po particiji). Tako da je u suštini dovoljno hexdumpovati tih 4*16 bajtova i sačuvati negde (odštampati), da ne bi, kao ja, listali celu noć 'hexdump /dev/ad0 | less' i tražili gde počinju particije.
Što se tiče prvih 446 bajtova, oni nisu bitni, komanda fdisk /mbr upisuje u njih mali asm kod koji u part. tabeli pronađe particiju sa active flagom, učita sadržaj njenog boot sektora u memoriju, i setuje EIP da izvrši kod odatle. Dakle, to se da lako popraviti. Poslednja 2 bajta takođe nisu bitna jer su uvek isti (vidi dole).
Ovako izgleda MBR:
0x0000-0x008a -- MBR programski kod u mašinskom jeziku
0x008b-0x01bd -- MBR data segment (poruke tipa "Invalid partition table, error loading operating system...")
0x01be-0x01fd -- PARTITION TABLE !!!
0x01fe-0x01ff -- takozvani. MBR "potpis". Služi za proveru od strane BIOS-a da li disk sadrži validan MBR. Njegov sadržaj je "55 AA", i uvek je isti.
Evo hexdumpa jednog MBR-a:
Code:
OFFSET 0 1 2 3 4 5 6 7 8 9 A B C D E F *0123456789ABCDEF*
000000 fa33c08e d0bc007c 8bf45007 501ffbfc *.3.....|..P.P...*
000010 bf0006b9 0001f2a5 ea1d0600 00bebe07 *................*
000020 b304803c 80740e80 3c00751c 83c610fe *...<.t..<.u.....*
000030 cb75efcd 188b148b 4c028bee 83c610fe *.u......L.......*
000040 cb741a80 3c0074f4 be8b06ac 3c00740b *.t..<.t.....<.t.*
000050 56bb0700 b40ecd10 5eebf0eb febf0500 *V.......^.......*
000060 bb007cb8 010257cd 135f730c 33c0cd13 *..|...W.._s.3...*
000070 4f75edbe a306ebd3 bec206bf fe7d813d *Ou...........}.=*
000080 55aa75c7 8bf5ea00 7c000049 6e76616c *U.u.....|..Inval*
000090 69642070 61727469 74696f6e 20746162 *id partition tab*
0000a0 6c650045 72726f72 206c6f61 64696e67 *le.Error loading*
0000b0 206f7065 72617469 6e672073 79737465 * operating syste*
0000c0 6d004d69 7373696e 67206f70 65726174 *m.Missing operat*
0000d0 696e6720 73797374 656d0000 00000000 *ing system......*
0000e0 00000000 00000000 00000000 00000000 *................*
0000f0 DO OFSETA 0001af SVE ISTO
0001b0 00000000 00000000 00000000 00008001 *................*
0001c0 0100060d fef83e00 00000678 0d000000 *......>....x....*
0001d0 00000000 00000000 00000000 00000000 *................*
0001e0 00000000 00000000 00000000 00000000 *................*
0001f0 00000000 00000000 00000000 000055aa *..............U.*
Primetite da particiona tabela počinje od 0x01be i izgleda ovako
Code:
DL DH CL CH TB DH CL CH LBA..... SIZE....
80 01 01 00 06 0d fe f8 3e000000 06780d00 - prva particija
00 00 00 00 00 00 00 00 00000000 00000000 - druga
00 00 00 00 00 00 00 00 00000000 00000000 - treća
00 00 00 00 00 00 00 00 00000000 00000000 - četvrta
55aa
U ovom slučaju imamo samo jednu particiju, koja je uz to i aktivna (DL = 0x80), a tip joj je TB = 0x06, tj. FAT. 2, 3 i 4 bajt su CHS adresa početka particije, a 6, 7 i 8 adresa kraja. LBA je logička adresa bloka (offset) na kome particija počinje, a SIZE veličina particije u blokovima.
Interesantno je da u praksi (barem kad sam ja radio na svom disku, silom prilika), CHS adrese uopšte nisu bitne -- mislim da su bitne samo ako je setovan active flag, da bi BIOS mogao da ih pronađe. Sa druge strane, početak particije jeste bitno da bude tačan, ali dužina može da bude pogrešna (!) -- ja sam NTFS particiju podesio u MBR-u sa greškom od +/- 50 kB, i Windows 2000 se podigao bez problema, chkdsk nije prijavio nikakve greške! ban naglasak na bezbednost i pr
int rand(void);
Those who do not understand Unix are condemned to reinvent it, poorly.
Upali lampicu — koristi Jabber!