本文最后更新于 412 天前,其中的信息可能已经有所发展或是发生改变。
内容目录
开发环境搭建
- bochs安装、配置和测试
- bochs调试环境搭建和测试
- bochs常用调试命令
0x01 Bochs安装和配置
1.1 ./configure –enable-debugger –enable-disasm
./configure –enable-debugger –enable-disasm 有报错,无法继续后面操作
1.2 sudo apt-get install libgtk2.0-dev
参考网友的做法
sudo apt-get install libgtk2.0-dev
1.3 ./configure –enable-debugger –enable-disasm
再重新解压: ./configure –enable-debugger –enable-disasm
1.4 make
执行: make
1.5 sudo make install
安装: sudo make install
1.6 测试是否安装成功
执行: bochs
运行崩溃,但这是安装成功了
0x02 实验验证:Bochs的验证
2.1 启动文件模板
文件放到虚拟机里,把值填进去;
Bochsrc
###############################################################
# Configuration file for Bochs
###############################################################
# how much memory the emulated machine will have
megs: 32
# filename of ROM images
romimage: file=
vgaromimage: file=
# what disk images will be used
floppya: 1_44=a.img, status=inserted
# choose the boot disk.
boot: floppy
# where do we send log messages?
# log: bochsout.txt
# disable the mouse
mouse: enabled=0
# enable key mapping, using US layout as default.
keyboard_mapping: enabled=1, map=
2.2 路径填写:romimage
填写的过程也记录下:
which bochs
2.3 路径填写:vgaromimage
vgabios
2.4 路径填写:map
map
2.5 验证验证
验证bochs是否支持断点:
执行:bochs 默认6
运行就暂停了,输入continue之后才继续向下执行; 调试环境已经ok了;
0x03 使用Bochs中的常用调试命令
3.1 常用命令总结
3.2 当前目录寻找启动文件
验证:
在当前目录寻找启动文件
3.3 bios加载并引导主引导程序
打断点,虚拟计算机上电,bios开始工作,bios加载并引导主引导程序
即将执行 eip: 0x00007c00,也就是mov ax, cs
(0) [0x00007c00] 0000:7c00 (unk. ctxt): mov ax, cs ; 8cc8
1 段地址+段内偏移地址: 0000:7c00
2 对应物理地址(即将执行): mov ax, cs
3 编译器编译mov ax, cs之后,得到8cc8十六进制数
3.4 主引导程序的初始化(从调试结果来看)
通过调试的手段了解: 关键寄存器初始化为0,这就是为什么不使用0来初始化的原因
eip被初始化为了主引导程序入口地址
继续,运行结束
3.5 其他命令的使用
<bochs:3> continue
00000003305i[BIOS ] $Revision: 1.247 $ $Date: 2010/04/04 19:33:50 $
00000331073i[KBD ] reset-disable command received
00000449205i[VBIOS] VGABios $Id$
00000449276i[VGA ] VBE known Display Interface b0c0
00000449308i[VGA ] VBE known Display Interface b0c4
00000449977i[VBIOS] VBE Bios $Id$
00000600000i[XGUI ] charmap update. Font Height is 16
00000767531i[BIOS ] Starting rombios32
00000768028i[BIOS ] Shutdown flag 0
00000768709i[BIOS ] ram_size=0x02000000
00000769187i[BIOS ] ram_end=32MB
00000809771i[BIOS ] Found 1 cpu(s)
00000829040i[BIOS ] bios_table_addr: 0x000fbc18 end=0x000fcc00
00000841717i[BIOS ] bios_table_cur_addr: 0x000fbc18
00012943037i[BIOS ] Booting from 0000:7c00
(0) Breakpoint 1, 0x00007c00 in ?? ()
Next at t=12943098
(0) [0x00007c00] 0000:7c00 (unk. ctxt): mov ax, cs ; 8cc8
<bochs:4> step
Next at t=12943099
(0) [0x00007c02] 0000:7c02 (unk. ctxt): mov ss, ax ; 8ed0
<bochs:5> step
Next at t=12943100
(0) [0x00007c04] 0000:7c04 (unk. ctxt): mov ds, ax ; 8ed8
<bochs:6> x /2bx 0x7c00
[bochs]:
0x00007c00 <bogus+ 0>: 0x8c 0xc8
<bochs:7> trace on # 打开开关,之后每执行一条指令都会被打印出来
Tracing enabled for CPU0
<bochs:8> step
(0).[12943100] [0x00007c04] 0000:7c04 (unk. ctxt): mov ds, ax ; 8ed8 #即将执行的指令
Next at t=12943101
(0) [0x00007c06] 0000:7c06 (unk. ctxt): mov es, ax ; 8ec0 # 下一条要执行的指令
<bochs:9> step
(0).[12943101] [0x00007c06] 0000:7c06 (unk. ctxt): mov es, ax ; 8ec0
Next at t=12943102
(0) [0x00007c08] 0000:7c08 (unk. ctxt): mov si, 0x7c23 ; be237c
<bochs:10> trace-reg on # 打印寄存器指令开关,每运行一个指令之前,会把寄存器的值打印出来
Register-Tracing enabled for CPU0
<bochs:11> step
eax: 0x00000000 0
ecx: 0x00000000 0
edx: 0x00000000 0
ebx: 0x00000000 0
esp: 0x0000ffd6 65494
ebp: 0x00000000 0
esi: 0x000e32f8 930552
edi: 0x0000ffac 65452
eip: 0x00007c08
eflags 0x00000082: id vip vif ac vm rf nt IOPL=0 of df if tf SF zf af pf cf
(0).[12943102] [0x00007c08] 0000:7c08 (unk. ctxt): mov si, 0x7c23 ; be237c # 执行目标指令,又打印寄存器的值,前后si寄存器的值发生了变化
Next at t=12943103
eax: 0x00000000 0
ecx: 0x00000000 0
edx: 0x00000000 0
ebx: 0x00000000 0
esp: 0x0000ffd6 65494
ebp: 0x00000000 0
esi: 0x000e7c23 949283
edi: 0x0000ffac 65452
eip: 0x00007c0b
eflags 0x00000082: id vip vif ac vm rf nt IOPL=0 of df if tf SF zf af pf cf
(0) [0x00007c0b] 0000:7c0b (unk. ctxt): mov al, byte ptr ds:[si] ; 8a04
<bochs:12>