bochs调试保护模式程序
版本1:加载img直接使用配置文件,可以使用断点!! 保护模式的程序没有办法直接调试。所谓的直接调试,指的是使用debug这样工具 进行的调试,无论是debug32 还是传说中的softice for dos 都不可以。唯一的方法是在 虚拟机上进行的调试。有一款虚拟机,就是专门为这样的事情设计的。他就是BOCHS。 关于这个软件的使用,在此就不介绍了。主要说一下如何进行保护模式的程序
版本1:加载img直接使用配置文件,可以使用断点!!
保护模式的程序没有办法直接调试。所谓的直接调试,指的是使用debug这样工具
进行的调试,无论是debug32 还是传说中的softice for dos 都不可以。唯一的方法是在
虚拟机上进行的调试。有一款虚拟机,就是专门为这样的事情设计的。他就是BOCHS。
关于这个软件的使用,在此就不介绍了。主要说一下如何进行保护模式的程序的调试。
第一个问题是:Bochs是为了调试保护模式的操作系统设计的。就是说,从引导过程开始的
程序,而不是已经进入了纯dos,再进入保护模式的程序。对于这个问题,我们的思路是,
设置好断点,进入dos之后,让我们的程序触发中断即可…….
查一下Bochs的手册,上面有内存读写的中断,于是首先选择了这样的指令:
watch read [addr]
但是随后发现,不知道为什么,程序无法触发这样的中断。也许是因为addr给出的
地址是线性地址,而我们的程序,最开始,只能触发[seg:ofs]这样的地址。(说明:我发现
Bochs中,即使这两种格式即使指向相同的物理地址,对断点来说也是不同的)。
第二个问题就是:设置一种容易实现的断点,最终,发现Bochs在执行断点上是可以
区分的。我们只要设置一个绝对执行的位置就可以了。编写程序如下:
jmpSeg equ 600*1024 /16 ;打算修改的段
mov ax,jmpSeg
mov ds,ax ;ds=打算修改的段
xor si,si
mov ax,ds:[si] ;修改 ds:0 的位置
push ax ;安全起见,在堆栈保存这个位置的值
mov byte ptr ds:[si],0CBh ;将这个位置设置为 retf
push offset back ;设置返回位置
push cs
db 0EAh ;远跳转
dw 0
dw jmpSeg
back: ;跳过去后马上回来
pop ax
mov ds:[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命令跟踪了~
更多推荐
所有评论(0)