2010-04-14 3 views
6

Для проекта я хотел бы вызвать MBR на первом жестком диске непосредственно из DOS. Я написал небольшую программу ассемблера, которая загружает MBR в память в 0: 7c00h, и делает большой прыжок на нее. Я поместил свою утилиту на загрузочную дискету (DOS). На диске (HD0, 0x80), который я пытаюсь загрузить, на нем установлен загрузчик TrueCrypt. Когда я запускаю инструмент в этой настройке, он отображает экран TrueCrypt, но после ввода пароля он сбрасывает систему. Когда я запускаю свою небольшую утилиту (w00t.com) на обычной машине WinXP, она, похоже, сразу падает.MBR Загрузка из DOS

Видимо, я забыл о некоторых важных вещах, которые обычно выполняет BIOS, я думаю, что это нечто тривиальное. Может ли кто-нибудь с лучшим голосом DOS и BIOS получить помощь?

Heres мой код:

.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 

ответ

1

Отредактировано - новый ответ:

ОК, кажется, я первым понял ваш вопрос. Лишь еще совет, который я могу дать это:

  • Убедитесь, что вы не загружать либо HIMEM.SYS и/или EMM386.EXE (ни какой-либо другой менеджер памяти). CPU должен быть в реальном режиме, когда выполняется загрузчик.

  • Посмотрите на список прерываний Ральфа Брауна. Если я правильно помню, там где-то есть техническая информация о процессе загрузки. Это может дать вам намек.

  • Посмотрите на исходный код других утилит загрузчика, например. loadlin. (Это не делает точно то же самое, как ваша утилита, но может дать вам некоторое представление, тем не менее.)


Предыдущий ответ:

Является ORG 100h действительно правильная вещь, которую нужно сделать в загрузчике?

Я думал, что это справедливо для исполняемых файлов DOS .com, поскольку DOS инициализирует первые 256 байт с помощью префикса сегмента программы (PSP). Если вы пишете загрузчик, нет DOS и нет такой вещи, как PSP. Я предполагаю, что это должно быть ORG 0.

+0

Это COM-файл на самом деле, так что Whys это ORGed на 100h. Как и любой другой .com-файл. Он загружает MBR в mem, а переходы - на. Как вы можете прочитать в моем первоначальном вопросе, он действительно выполняет задание: загрузчик TrueCrypt запускается и показывает правый экран. Так загружаются и прыгают работы. Только после этого компьютер зависает. Что-то должно быть неправильно, возможно, среда настроена неправильно? – Rogier

+0

Если этот загрузчик TrueCrypt на вашем диске фактически _expects_ является обычным файлом '.com', тогда' ORG 100h' не должно быть проблемой. В противном случае, я думаю, что это ошибка. - Во-вторых, неудивительно, что ваша программа вылетает при выполнении в Windows XP. Когда компьютер загружается первым, процессор находится в режиме реального времени (эмуляция 8086), и загрузчики ожидают этого. Как только Windows XP запустится, CPU не вернется в Реальный режим. Программы DOS могут выполняться в так называемом режиме Virtual 8086 (если я правильно помню имя), а загрузчики не будут работать в этом режиме CPU. – stakx

+0

Нет, даже загрузка загрузчика по адресу 0: 7c00 в Windows (XP) невозможна с помощью этого utils. Вы не можете получить доступ к диску непосредственно из окон, и вы не можете просто пойти в pokin в mem. Но, пожалуйста, прочитайте в моем вопросе, что я запускаю инструмент с дискеты (изображение), то есть он работает в DOS, реальном режиме на 16 бит. Кроме того, на самом деле эта работа уже частично выполнена; запускается TC Bootloader GETS и отображается экран «Добро пожаловать в TC, введите пароль». Только после этого он сует. Ergo, в среде, которую обычно устанавливает BIOS, должно быть что-то не так. – Rogier

0

Я не думаю, что это загрузчик, это файл .com, который загружает загрузочный сектор и пытается его выполнить. Таким образом, он запускается после инициализации DOS.

1

Ok мои знания DOS очень ржавый, и я не имел времени, чтобы проверить/проверить мой ответ, но я думаю, ваша проблема заключается в следующем:

При загрузке DOS или любой другой операционной системы, они будут меняться таблицу прерываний. DOS изменит таблицу прерываний, так что - например, прерывание 20 может использоваться для отправки команд в ядро ​​DOS. Они делают это, сохраняя исходный обработчик прерываний, заменяя его собственным обработчиком, а затем, как резерв по умолчанию, привязывают к исходному обработчику прерываний, если они не знают, как обрабатывать прерывание.Таким образом, они «добавляют» новые функции к уже существующей функции bios, и каждая программа под DOS может использовать системный вызов, просто устанавливая некоторые регистры, а затем вызывает прерывание.

Однако при загрузке новой операционной системы эта новая операционная система предполагает, что: а) все прерывания обрабатываются биографией, и б) вся память свободна/не используется, если только она не используется в этом биосе.

Таким образом, новый os перезапишет память, используемую в настоящее время вашей старой ОС, а затем она в какой-то момент вызовет один из прерываний и выполнит что-то в недопустимой памяти, а компьютер выйдет из строя.

Таким образом, сбросить таблицу прерываний с оригинальной версией биоса и вы должны быть хорошо ...

+0

Эй, это звучит правдоподобно! Благодарю. – Rogier