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

来源:互联网 发布:三角函数计算器软件 编辑:程序博客网 时间:2024/05/22 10:22

对一台安装了Windows NT 系列操作系统的PC来说,按下电源开关之后,CPU中首先开始运行的是Bios,然后是MBR,接着是引导扇,然后就是NTLDR。ntoskrnl.exe和hal.dll 都是由NTLDR来加载的。也就是说,运行NTLDR的时候,系统中还没有任何应用程序或者驱动,当然也就没有任
WWW.FENGFLY.COM
WWW.FENGFLY.COM http://www.fengfly.com/html/mianfeiziyuan/

  对一台安装了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的调试工作了。下面 UML http://www.fengfly.com/html/softeng/uml/ asp.net,WWW.FENGFLY.com fengfly.com asp.net,WWW.FENGFLY.com


原文来自:雨枫技术教程网 http://www.fengfly.com
原文网址:mhtml:file://D:/jc/没有硬件调试器,我们用Bochs调试NTLDR_雨枫技术教程网.mht!http://www.fengfly.com/plus/view-114559-1.html

 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 被鼻涕虫咬了怎么办 家里水斗有鼻涕虫怎么办? 厨房里潮虫子怎么办 楼房有潮虫子怎么办 家里的鼻涕虫泛滥成灾怎么办 菜叶上有蜗牛怎么办 家里面有鼻涕虫怎么办 菜地里的蜗牛怎么办 菜地里有蜗牛怎么办 菜地里有虫子怎么办 心情焦躁多想怎么办 打胎后心情焦躁怎么办 心情不好想发火怎么办 孩子心烦气燥怎么办 心烦气燥睡不着怎么办 心烦心燥睡不着怎么办 小孩心烦气燥怎么办 情绪总是很烦躁怎么办 情绪不好爱生气怎么办 心里每天烦躁该怎么办 心情低落想哭怎么办 心老是烦躁急怎么办 易烦躁睡眠不好怎么办 天气热心情烦躁怎么办 嘴巴里有溃疡怎么办 嘴巴里面反复烂怎么办 多处口腔溃烂怎么办 口腔黏膜破了怎么办 有鼻炎鼻子痒怎么办 感冒就清鼻涕怎么办 怀孕感冒流鼻涕打喷嚏怎么办 过敏性鼻炎打喷嚏流鼻涕怎么办 宝宝黄鼻涕鼻塞怎么办 鼻炎总是打喷嚏流鼻涕怎么办 新生儿流黄鼻涕怎么办 感冒鼻塞流鼻涕喷嚏怎么办 宝宝总是打喷嚏流鼻涕怎么办 不停的打喷嚏流鼻涕怎么办 宝宝不停打喷嚏流鼻涕怎么办 孕妇感冒流鼻涕打喷嚏怎么办 孕妇感冒咳嗽流鼻涕怎么办