这几天为找如何调试实模式跳转保护模式的调试器,找的发狂~!~
1.用TD调试,发现调试到Cr0时TD就会死掉,经查阅TD无法调试保护模式的程序,我就纠结了难道就没调试保护模式的调试器,Debug,OD等肯定不行了......(SoftICE和Windbg没有测试过,据说可行)真不敢想当时的Windows和Linux是如何写成的,估计他们在之前或许已经写了个调试器给自己用,只是没给我们这些人用,没办法,最后发现Bochs这款开源调试器,才开始没注意,最后发现It‘s so crazy!本着参考无数网上的解答和个人实际的调试将方式小结了下。
2.用Bochs调试心得
工具准备:
下载最新的Bochs
下载最新的Winimage
http://www.winimage.com/download.htm
本人自己用的NASM,这里是下载地址
Dos6.22的镜像文件
http://doshome.com/soft/SoftView/SoftView_23.html
调试步骤:
1.配置Bochs,可以看Bochs里的bochsrc-sample.txt配置自己个性化的rxrc
具体Bochs for Windows如何配置这边就略过了~~两点提一下:
romimage: file=$BXSHARE/BIOS-bochs-latest#, address=0xf0000(Bochs版本在2.3.5以前使用的BIOS-bochs-latest是64k的,那个时候需要加上#号后面的地址,而2.3.5以后的需要把它引掉,我也有段时间纠结这个,纠结了半天,为什么不能运行?原来这边问题呵呵~~)
floppya: 1_44=DOS6.22.img, status=inserted,这边改为你要加载的系统镜像文件,我用的是DOS6.22.img你也可以选择其他的进行系统引导。
在.COM程序的开始出加入jmp $,我开始打算设置个INT 3在程序开始出,发现Bochs根本不理会我这个断点中断,而他自带的CTRL+C却能执行断点中断,请高手告知一解。。。。。。
2.用Winimage加载后缀为.COM的内核程序加载入Dos6.22.img的软盘镜像中,然后保存。
3.打开CMD,敲入E:/Progra~2/Bochs-~1.1/bochsdbg.exe -q -f bochsrc.bxrc,我用的是Bochs2.1.1版的,根目录在E盘下,用Bochs自带的Bochsdbg.exe调试程序装载你自己的内核程序,出现如下图所示的界面:
输入C执行到断点,但我们这边没有断点,在它的主界面出现了如下图所示的Dos安装界面:
选择5.NONE就进入了DOS的命令行。。输入你的.COM文件然后执行回车,如下图
同时命令行的界面已经假死,因为一直在执行jmp $指令,需要强制执行CTRL+C来迫使回到命令行界面,如下图
发现没有?倒数第二行就是一个无限的死循环,Bochs模拟的CPU一直在执行这条指令,也就意味着我们已经找到我们程序的入口点,那如何继续下面的单步调试呢?答案就是修改EIP,什么?微机老师不是说EIP不是不可读不可写嘛。。。呵呵。。因为这边Bochs是用纯软件模拟真实硬件系统,那我们很明显可以软修改EIP的值,怎么修改?用set$eip=0x37A修改EIP的指针的值,使其指向下一条指令,然后我们用info r查看一下我们的EIP的值是否被修改的,如下图:
果然,EIP的值已经变成0x37a,也就意味着我们可以单步调试我们的内核程序了。。。。。呵呵~~~
下图是我执行加载GDT和修改CR0的PE位使CPU进入PM模式。。。。。
总结:
可能还有很多调试的方法,这种可能比较BT但也比较好用,最主要是INT 3无法在Bochs中断下来,请高手解惑~