分享
 
 
 

没有硬件调试器,我们用Bochs调试NTLDR

王朝other·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

对一台安装了Windows NT 系列操作系统的PC来说,按下电源开关之后,CPU中首先开始运行的是Bios,然后是MBR,接着是引导扇,然后就是NTLDR。ntoskrnl.exe和hal.dll 都是由NTLDR来加载的。也就是说,运行NTLDR的时候,系统中还没有任何应用程序或者驱动,当然也就没有任何基于软件的调试器可用。当然,无所不能的硬件调试器肯定是可以的,可惜我们没有硬件调试器。

幸好有了Bochs。Bochs是一个基于LGPL的开源x86 虚拟机软件。Bochs的CPU指令是完全自己模拟出来的,这种方式的缺点是速度比较慢;优点是具有无以伦比的可移植性:有Gcc的地方就可以有Bochs。甚至已经有了跑在PocketPC上的Bochs。

现在的Bochs 已经实现了一定程度的调试功能,虽然在易用性和功能上还无法和WinDbg、SoftICE相比,但优势也是很明显的:对跑在Bochs里面的代码来说,这就是“硬件调试器”。

对Windows 版本的Bochs来说,安装目录下的bochsdbg.exe就是Bochs的调试版本。用它来运行Bochs虚拟机就可以进行“硬件调试”。

Bochs的调试命令风格是按照GDB习惯来设计的,这对于用惯了WinDbg的人来说无疑是痛苦的,好在这是个开源软件,看着不顺眼可以考虑自己改改。

目前版本的Bochs(Version 2.1.1)支持的调试命令如下:

[注意]

1、Bochs的文档和帮助信息中的使用说明与真实情况之间存在很大的差错和缺失,下面的命令说明根据源码作了很多补充和修正。

2、其中涉及到的seg(段)、off(偏移)、addr(地址)、val(值)等数字,可以使用十六进制、十进制或者八进制,但必须按照如下形式书写:

十六进制

0xCDEF0123

八进制

01234567

十进制

123456789

尤其要注意,Bochs不能自动识别16进制的数字,也不接受12345678h这种写法。

[执行控制]

c|cont

向下执行,相当于WinDBG的“g”。

s|step|stepi [count]

单步执行,相当于WinDBG的“t”,count 默认为 1。

p|n|next

单步执行,类似于WinDBG的“p”。

q|quit|exit

退出调试,同时关闭虚拟机。

Ctrl-C

结束执行状态,返回调试器提示符。

Ctrl-D

if at empty line on command line, exit

(至少在Windows版本中我没有发现Ctrl-D有什么功能)

[执行断点]

vb|vbreak [seg:off]

在虚拟地址上下断点。

lb|lbreak [addr]

在线性地址上下断点,相当于WinDBG的“bp”。

pb|pbreak|b|break [addr]

在物理地址上下断点。(为了兼容GDB的语法,地址前

可以加上一个“*”)。

blist

显示断点状态,相当于WinDBG的“bl”。

bpd|bpe [num]

禁用/启用断点,WinDBG的“be”和“bd”。num是断

点号,可以用blist命令查询。

d|del|delete [num]

删除断点,相当于WinDBG的“bc”。mum是断点号,可

以用blist命令查询。

[读写断点]

watch read [addr]

设置读断点。

watch write [addr]

设置写断点。

unwatch read [addr]

清除读断点。

unwatch write [addr]

清除写断点。

watch

显示当前所有读写断点。

unwatch

清除当前所有读写断点。

watch stop|continue

开关选项,设置遇到读写断点时中断下来还是显示出来但

是继续运行。

[内存操作]

x

/nuf [addr]

显示线性地址的内容

xp /nuf [addr]

显示物理地址的内容

n

显示的单元数

u

每个显示单元的大小,u可以是下列之一:

b BYTE

h WORD

w DWORD

g DWORD64

注意: 这种命名法是按照GDB习惯的,而并不是按照inter的规范。

f

显示格式,f可以是下列之一:

x 按照十六进制显示

d 十进制显示

u 按照无符号十进制显示

o 按照八进制显示

t 按照二进制显示

c 按照字符显示

n、f、u是可选参数,如果不指定,则u默认是w,f默认是x。如果前面使用过x或者xp命令,会按照上一次的x或者xp命令所使用的值。n默认为1。addr 也是一个可选参数,如果不指定,addr是0,如过前面使用过x或者xp命令,指定了n=i,则再次执行时n默认为i+1。

setpmem [addr] [size] [val]

设置物理内存某地址的内容。

需要注意的是,每次最多只能设置一个DWORD:

这样是可以的:

<bochs:1

setpmem 0x00000000 0x4 0x11223344

<bochs:2 x /4 0x00000000

[bochs]:

0x00000000 <bogus+

0:

0x11223344 0x00000000 0x00000000 0x00000000

这样也可以:

<bochs:1

setpmem 0x00000000 0x2 0x11223344

<bochs:2 x /4 0x00000000

[bochs]:

0x00000000 <bogus+

0:

0x00003344 0x00000000 0x00000000 0x00000000

或者:

<bochs:1

setpmem 0x00000000 0x1 0x20

<bochs:2 x /4 0x00000000

[bochs]:

0x00000000 <bogus+

0:

0x00000020 0x00000000 0x00000000 0x00000000

下面的做法都会导致出错:

<bochs:1

setpmem 0x00000000 0x3 0x112233

Error: setpmem: bad length value = 3

<bochs:2

setpmem 0x00000000 0x8 0x11223344

Error: setpmem: bad length value = 8

crc [start] [end]

显示物理地址start到end之间数据的CRC。

[寄存器操作]

set $reg = val

设置寄存器的值。现在版本可以设置的寄存器包括:eax ecx edx ebx esp ebp esi edi暂时不能设置:eflags

cs

ss

ds

es

fs

gs

r|reg|registers reg = val

同上。

dump_cpu

显示完整的CPU信息。

set_cpu

设置CPU状态,这里可以设置dump_cpu所能显示出来的所有CPU状态。

[反汇编命令]

u|disas|disassemble [/num] [start] [end]反汇编物理地址start到end 之间的代码,如果不指定参数则反汇编当前EIP指向的代码。num是可选参数,指定处理的代码量。

set $disassemble_size = 0|16|32

$disassemble_size变量指定反汇编使用的段大小。

set $auto_disassemble = 0|1

$auto_disassemble决定每次执行中断下来的时候(例如遇到断点、Ctrl-C等)是否反汇编当前指令。

[其他命令]

trace-on|trace-off

Tracing开关打开后,每执行一条指令都会将反汇编的结果显示出来。

ptime

显示Bochs自本次运行以来执行的指令条数。

sb [val]

再执行val条指令就中断。val是64-bit整数,以L结尾,形如“1000L”

sba [val]

执行到Bochs自本次运行以来的第val条指令就中断。val是64-bit整数,以L结尾,形如“1000L”

modebp

设置切换到v86模式时中断。

record ["filename"]

将输入的调试指令记录到文件中。文件名必须包含引号。

playback ["filename"]

回放record的记录文件。文件名必须包含引号。

print-stack [num]

显示堆栈,num默认为16,表示打印的条数。

?|calc

和WinDBG的“?”命令类似,计算表达式的值。

load-symbols [global] filename [offset]载入符号文件。如果设定了“global”关键字,则符号针对所有上下文都有效。offset会默认加到所有的symbol地址上。symbol文件的格式为:"%x %s"。

[info命令]

info program

显示程序执行的情况。

info registers|reg|r

显示寄存器的信息。

info pb|pbreak|b|break

相当于blist

info dirty

显示脏页的页地址。

info cpu

显示所有CPU寄存器的值。

info fpu

显示所有FPU寄存器的值。

info idt

显示IDT。

info gdt [num]

显示GDT。

info ldt

显示LDT。

info tss

显示TSS。

info pic

显示PIC。

info ivt [num] [num]

显示IVT。

info flags

显示状态寄存器。

info cr

显示CR系列寄存器。

info symbols

显示symbol信息。

info ne2k|ne2000

显示虚拟的ne2k网卡信息。

弄明白了调试命令,接下来就可以着手进行NTLDR的调试工作了。下面

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有