Para un proyecto me gustaría invocar el MBR en el primer disco duro directamente desde DOS. He escrito un pequeño programa ensamblador que carga el MBR en la memoria a 0: 7c00h y lo hace muy lejos. He puesto mi utilidad en un disquete de arranque (DOS). El disco (HD0, 0x80) que intento arrancar tiene un gestor de arranque TrueCrypt. Cuando ejecuto la herramienta en esta configuración, aparece la pantalla TrueCrypt, pero después de ingresar la contraseña bloquea el sistema. Cuando ejecuto mi utlility poco (w00t.com) en una máquina WinXP normal, parece bloquearse inmediatamente.MBR Arranque desde DOS
Aparentemente me olvido de algunas cosas cruciales que normalmente hace la BIOS, supongo que es algo trivial. ¿Puede ayudarme alguien con una mejor experiencia de BIOS y DOS sin metal?
Aquí está mi código:
.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 un archivo COM de hecho, así que eso es porqué está en ORGed 100h. Como cualquier otro archivo .com. Carga el MBR a mem y salta a is. Como puede leer en mi pregunta inicial, realmente hace el trabajo: el gestor de arranque TrueCrypt se inicia y muestra la pantalla derecha. Así que cargar y saltar funciona. Solo después de eso, la computadora se congela. Algo debe estar mal, ¿quizás el entorno no está configurado correctamente? – Rogier
Si ese gestor de arranque TrueCrypt en su disco realmente _espera_ un archivo '.com' normal, entonces el' ORG 100h' no debería ser un problema. De lo contrario, creo que es un error. - En segundo lugar, no sorprende que su programa se bloquee cuando se ejecuta bajo Windows XP. Cuando la computadora se inicia por primera vez, la CPU está en modo real (emulación 8086) y los cargadores de arranque lo esperan. Una vez que Windows XP se haya iniciado, la CPU nunca volverá al Modo Real. Los programas de DOS se pueden ejecutar en lo que se llama el modo Virtual 8086 (si recuerdo el nombre correctamente) y los gestores de arranque no funcionarán en ese modo de CPU. – stakx
No, incluso la carga de un gestor de arranque a la dirección 0: 7c00 no es posible en Windows (XP) con estos utils. No puede acceder al disco directamente desde Windows y no puede simplemente hurgar en la memoria. Pero por favor lea en mi pregunta que estoy ejecutando la herramienta desde disquete (imagen), es decir, se está ejecutando en DOS, modo real de 16 bits. Además, en realidad, ya hace el trabajo en parte; TC Bootloader GETS comenzó y muestra la pantalla "Bienvenido a TC, ingrese contraseña". Solo después de eso se estremece. Ergo, debe haber algo mal en el medio ambiente que el BIOS normalmente establece. – Rogier