Für ein Projekt möchte ich den MBR auf der ersten Festplatte direkt von DOS aufrufen. Ich habe ein kleines Assemblerprogramm geschrieben, das den MBR bei 0: 7c00h in den Speicher lädt und einen weiten Sprung dazu macht. Ich habe mein Util auf eine bootfähige DOS-Diskette gelegt. Auf der Festplatte (HD0, 0x80), die ich starten möchte, befindet sich ein TrueCrypt-Bootloader. Wenn ich das Tool in diesem Setup starte, wird der TrueCrypt-Bildschirm angezeigt, aber nach Eingabe des Passworts stürzt das System ab. Wenn ich meine kleine Utility (w00t.com) auf einer normalen WinXP-Maschine starte, scheint sie sofort zu stürzen.MBR Booten von DOS
Offenbar vergesse ich einige wichtige Sachen, die das BIOS normalerweise tut, meine Vermutung ist, dass es etwas Triviales ist. Kann mir jemand mit besserer Bare-Metal DOS- und BIOS-Erfahrung helfen?
Heres mein Code:
.MODEL tiny
.386
_TEXT SEGMENT USE16
INCLUDE BootDefs.i
ORG 100h
start:
; http://vxheavens.com/lib/vbw05.html
; Before DOS has booted the BIOS stores the amount of usable lower memory
; in a word located at 0:413h in memory. We going to erase this value because
; we have booted dos before loading the bootsector, and dos is fat (and ugly).
; fake free memory
;push ds
;push 0
;pop ds
;mov ax, TC_BOOT_LOADER_SEGMENT/1024 * 16 + TC_BOOT_MEMORY_REQUIRED
;mov word ptr ds:[413h], ax ;ax = memory in K
;pop ds
;lea si, memory_patched_msg
;call print
;mov ax, cs
mov ax, 0
mov es, ax
; read first sector to es:7c00h (== cs:7c00)
mov dl, 80h
mov cl, 1
mov al, 1
mov bx, 7c00h ;load sector to es:bx
call read_sectors
lea si, mbr_loaded_msg
call print
lea si, jmp_to_mbr_msg
call print
;Set BIOS default values in environment
cli
mov dl, 80h ;(drive C)
xor ax, ax
mov ds, ax
mov es, ax
mov ss, ax
mov sp, 0ffffh
sti
push es
push 7c00h
retf ;Jump to MBR code at 0:7c00h
; Print string
print:
xor bx, bx
mov ah, 0eh
cld
@@: lodsb
test al, al
jz print_end
int 10h
jmp @B
print_end:
ret
; Read sectors of the first cylinder
read_sectors:
mov ch, 0 ; Cylinder
mov dh, 0 ; Head
; DL = drive number passed from BIOS
mov ah, 2
int 13h
jnc read_ok
lea si, disk_error_msg
call print
read_ok:
ret
memory_patched_msg db 'Memory patched', 13, 10, 7, 0
mbr_loaded_msg db 'MBR loaded', 13, 10, 7, 0
jmp_to_mbr_msg db 'Jumping to MBR code', 13, 10, 7, 0
disk_error_msg db 'Disk error', 13, 10, 7, 0
_TEXT ENDS
END start
Es ist eine COM-Datei in der Tat, so dass whys ist es bei 100h ORGed ist. Genau wie jede andere .com-Datei. Es lädt den MBR in mem und springt auf is. Wie Sie in meiner ersten Frage lesen können, erledigt es den Job: Der TrueCrypt Bootloader wird gestartet und zeigt den richtigen Bildschirm an. So funktioniert das Laden und Springen. Erst danach friert der Computer ein. Etwas muss falsch sein, vielleicht ist die Umgebung nicht richtig eingestellt? – Rogier
Wenn dieser TrueCrypt-Bootloader auf Ihrer Festplatte _expects_ eine normale '.com'-Datei erwartet, sollte das' ORG 100h' kein Problem darstellen. Ansonsten denke ich, dass es ein Fehler ist. - Zweitens ist es nicht verwunderlich, dass Ihr Programm abstürzt, wenn es unter Windows XP ausgeführt wird. Wenn der Computer zum ersten Mal gestartet wird, befindet sich die CPU im Real-Modus (8086-Emulation), und Boot-Loader erwarten dies. Sobald Windows XP gestartet ist, wird die CPU niemals wieder in den Real-Modus wechseln. DOS-Programme werden möglicherweise im sogenannten Virtual 8086-Modus ausgeführt (wenn ich mich an den Namen richtig erinnere), und Bootloader funktionieren in diesem CPU-Modus nicht. – stakx
Nein, sogar das Laden eines Bootloaders auf Adresse 0: 7c00 ist in Windows (XP) mit diesen Utils nicht möglich. Sie können nicht direkt von Windows auf die Festplatte zugreifen und Sie können nicht einfach im Mem herumlaufen. Aber bitte lesen Sie in meiner Frage, dass ich das Tool von Floppy (Bild) ausführen, d. H. Es läuft in DOS, 16bit Real-Modus. Darüber hinaus ist die Arbeit teilweise schon erledigt; Der TC Bootloader GETS wurde gestartet und zeigt den Bildschirm "Willkommen bei TC, bitte pass password" an. Erst danach knackt es. Ergo, in der Umgebung, die das BIOS normalerweise einrichtet, muss etwas falsch sein. – Rogier