2010-04-14 24 views
6

對於一個項目,我想直接從DOS調用第一個硬盤上的MBR。我編寫了一個小型彙編程序,可以在0:7c00h的內存中加載MBR,並且可以遠程跳到它。我已將我的util安裝在(DOS)可啓動軟盤上。我試圖啓動的磁盤(HD0,0x80)上有一個TrueCrypt啓動加載器。當我在這個設置中運行該工具時,它會顯示TrueCrypt屏幕,但輸入密碼後會使系統崩潰。當我在一臺普通的WinXP機器上運行我的小巧工具(w00t.com)時,它似乎馬上崩潰。從DOS引導的MBR

顯然我忘記了BIOS通常所做的一些關鍵性的東西,我的猜測是一些微不足道的東西。有更好的裸機DOS和BIOS經驗的人能幫助我嗎?

繼承人我的代碼:

.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

編輯 - 新的答案:

OK,好像我第一個誤解你的問題。只有進一步的意見,我可以給是這樣的:

  • 檢查你不加載任何HIMEM.SYS和/或EMM386.EXE(或任何其他內存管理器)。啓動加載程序執行時,CPU 必須處於實模式。

  • 看看Ralf Brown的中斷列表。如果我沒有記錯,那裏有一些關於啓動過程的技術信息。它可能會給你一個提示。

  • 查看其他裝載程序實用程序的源代碼,例如loadlin。 (它不會做同樣的事情作爲你的效用,但可能會給你一些見解,但。)


以前的答案:

ORG 100h真的正確的事情要做在引導裝載程序?

我以爲這只是與DOS .com可執行文件相關,因爲DOS將用程序段前綴(PSP)初始化前256個字節。如果你寫了一個引導裝載程序,那就沒有DOS,也沒有PSP這樣的東西。我想這應該是 ORG 0

+0

這確實是一個COM文件,所以這是個爲什麼它在100H ORGed。就像其他任何.com文件一樣。它將MBR加載到mem並跳轉到。 正如你可以在我最初的問題中看到的那樣,它實際上完成了這項工作:TrueCrypt引導程序開始並顯示正確的屏幕。所以加載和跳躍的作品。 只有在那之後,電腦纔會凍結。有些東西一定是錯的,也許環境設置不正確? – Rogier 2010-04-14 22:16:08

+0

如果磁盤上的TrueCrypt引導加載程序實際上指望使用普通的.com文件,那麼ORG 100h應該不成問題。否則,我認爲這是一個錯誤。 - 其次,在Windows XP下執行時,程序崩潰並不奇怪。當計算機第一次啓動時,CPU處於實模式(8086模擬),引導加載程序期望這一點。一旦Windows XP啓動後,CPU將永遠不會回到實模式。 DOS程序可能會在所謂的虛擬8086模式下執行(如果我記得名稱正確),並且引導加載程序將不能在該CPU模式下工作。 – stakx 2010-04-15 06:29:25

+0

不,即使將bootloader加載到地址0:7c00,在Windows(XP)中也無法使用此實用程序。你不能直接從窗口訪問磁盤,你不能只在內存中尋找機會。 但請閱讀我的問題,我從軟盤(映像)運行的工具,即它在DOS,16位實模式下運行。此外其實部分已經部分完成了工作;啓動TC Bootloader GETS並顯示「Welcome to TC,請輸入passsword」屏幕。只有在它之後,它纔會發生。 Ergo在BIOS通常設置的環境中一定有問題。 – Rogier 2010-04-15 07:10:26

0

我不認爲這是一個引導加載程序,它是加載引導扇區並嘗試執行它的.com文件。所以它在DOS初始化後運行。

1

好我的DOS知識是很生疏,我還沒有測試/驗證我的答案的時候,但我猜你的問題如下:

當啓動DOS或其他操作系統,他們會改變中斷表。 DOS將更改中斷表 - 例如 - 中斷20可用於將命令發送到DOS「內核」。他們通過保存最初的中斷處理程序來取代原來的中斷處理程序,將其替換爲它們自己的處理程序,然後作爲默認回退,如果它們不知道如何處理中斷,則鏈接到原始中斷處理程序。這樣他們就可以在現有的BIOS功能中「添加」新的功能,而在DOS下運行的每個程序都可以通過設置一些寄存器然後調用中斷來使用系統調用。

然而,當你啓動一個新的操作系統,這一新的操作系統將假設)所有中斷是由BIOS處理和b)除非通過BIOS使用的所有報告的內存是自由/未使用。

因此,新的操作系統將目前覆蓋的內存在使用你的舊的操作系統,然後它會在某個時候調用一箇中斷,並且將執行無效的內存的東西,你的電腦會崩潰。

所以,你的中斷表恢復到初始的BIOS版本,你應該罰款...

+0

嘿,這聽起來似乎合理!謝謝。 – Rogier 2011-03-18 13:50:19