bochs除錯保護模式程式

2021-05-22 09:37:56 字數 1916 閱讀 3989

版本1:載入img直接使用配置檔案

,可以使用斷點!!

保護模式的程式沒有辦法直接除錯。所謂的直接除錯,指的是使用debug這樣工具

進行的除錯,無論是debug32 還是傳說中的softice for dos 都不可以。唯一的方法是在

虛擬機器上進行的除錯。有一款虛擬機器,就

是專門為這樣的事情設計的。他就是bochs。

關於這個軟體的使用,在此就不介紹了。主要說一下如何進行保護模式的程式的除錯。

第乙個問題是:bochs是為了除錯保護模式的作業系統設計的。就是說,從引導過程開始的

程式,而不是已經進入了純dos,再進入保護模式的程式

。對於這個問題,我們的思路是,

設定好斷點,

進入dos之後,讓我們的程式觸發中斷即可…….

查一下bochs的手冊,上面有

記憶體讀寫的中斷

,於是首先選擇了這樣的指令:

watch read [addr]

但是隨後發現,不知道為什麼,程式無法觸發這樣的中斷。也許是因為addr給出的

位址是線性位址,而我們的程式,

最開始,只能觸發[seg:ofs]這樣的位址。

(說明:我發現

bochs中,即使這兩種格式即使指向相同的實體地址,對斷點來說也是不同的)。

第二個問題就是:設定一種容易實現的斷點,最終,發現

bochs在執行斷點上是可以

區分的。

我們只要設定乙個絕對執行的位置就可以了。

編寫程式如下:

jmpseg

equ600*1024 /16

;打算修改的段

movax,jmpseg

movds,ax

;ds=打算修改的段

xorsi,si

movax,ds:[si];修改

ds:0

的位置push

ax;安全起見,在堆疊儲存這個位置的值

movbyte ptr ds:[si],0cbh

;將這個位置設定為 retf

push

offset

back

;設定返回位置

push

csdb

0eah

;遠跳轉dw0

dwjmpseg

back:

;跳過去後馬上回來

popax

movds:[si],ax

;再恢復下面就是繼續執行了

思路就是我們在記憶體中挖出乙個絕對位置的「洞」,然後程式跳進這個洞,這個洞裡面

放的是返回,一下又回來。只要我們監視這個洞就好了。當然,安全起見,這個洞最後還要

再添上。另外,這個洞選擇的位置,我只是隨便選在600k的位置,其實還可以選擇在[40:0]

這一片位置,不過我想在虛擬機器執行過程中,可能會讀這個位置,需要執行幾次才可以,

操作上比較麻煩就沒有選擇。

程式做好了命名為bo.asm,編譯為bo.exe。格式化一張軟盤,放上dos系統的那三個

必要的檔案,再考上bo.exe. 之後,將軟盤做成img檔案(我一般用hdcopy).

這個img要

丟到bochs的目錄下,就是下圖的目錄中。

1.上圖,執行bochsdbg

2.選擇3,我們要讀入bo.img

3.選擇10

4.選擇1

5.分別輸入 bo.img  auto 最後一項直接回車

6.不斷回車,一直返回到第乙個畫面

7.這個就是第乙個畫面了,回車,開始執行

8.開始執行了,會在模擬第一條指令開始的時候停下來

9.輸入 vb 0x9600:0 下斷點

10.輸入 c 讓它繼續執行

11.模擬器這邊就進入dos了~

12.執行 bo.exe 看,停在我們設定的斷點了。

這個位置也算是程式的開始,下面可以使用s命令跟蹤了~

進入保護模式

本文為 每個描述符佔8位元組,下圖中,上面位高32位,下面為低32位 disk boot ata channel 0 first hd cd on channel 0 type of disk image這個選項是vpc,我用2.6.2配置時選vpc無法啟動,得選flat才可以,2.6.0貌似選vp...

進入保護模式

以下圖2,圖4和圖5截自intel手冊 每個描述符佔8位元組,下圖中,上面位高32位,下面為低32位 disk boot ata channel 0 first hd cd on channel 0 type of disk image這個選項是vpc,我用2.6.2配置時選vpc無法啟動,得選fl...

保護模式小結

在gdt ldt以及idt中,每乙個描述符都有自己的界限和屬性等內容,是對描述符所描述物件的一種限定和保護 分頁機制中的pde和pte都含有r w以及u s位,提供了頁級保護 頁式儲存的使用使應用程式使用的是線性空間而不是實體地址,於是物理記憶體被保護起來 中斷不再像是模式下一樣使用,也提供特權檢驗...