从Ollydbg说起-----WinDbg用户态调试教程(1)

 
 
首先说明 , 这篇文章是我转载的。文章不错。我现在对 windbg 比较熟,平时调试就是用它来调试内核程序。调试用户态程序就用 VC.net 自带的调试器功能也相当强大。这篇文章主要是结合 ollydbg windbg 讲解的文章,可以增长点对用户态程序调试的技巧。
 
【文章标题】 【原创】从 Ollydbg 说起 -----WinDbg 用户态调试教程
【文章作者】 笨笨雄
【作者邮箱】 : nemo314@gmail.com
【工具】 :Windbg 6.6.7.5;Ollydbg 1.10
  我假设你已经掌握 Ollydbg 的使用,并且希望用 WinDbg 进行内核级的调试。这篇教程将会以 Ollydbg 为线索,帮助你尽快掌握 WinDbg 的使用,并简单介绍它的一些特性。我把这篇文章定位为 Ollydbg WinDbg 内核调试之间的过渡。假如你是新手,那么本文同样适用,因为我会提到这两种调试器各自的一些特点,方便选择。全文分为 3 部分,每部分各占 1 楼。 1 是讲解界面及其设置, 2 是讲解调试中常用的指令, 3 是调试实例,目标是增加对 TLSCALLBACK 了解。我在 4 楼放了附件和一些资源的连接方便大家深入学习。希望大家会喜欢这篇文章。
1    调试界面
1 1   反汇编窗口
Ollydbg 中,反汇编窗口占的位置最大,功能也很强大。不过在 WinDbg 中,反汇编窗口很简陋,也更容易受花指令影响。界面如图:

 

 

  这是一个文本框,唯一的功能,也是几乎所有在 WinDbg 中的文本框共有的特性:鼠标左键选中文本,点右键就自动复制选中内容到剪贴板。另外一个共同的特点,红色圈处是一个下拉菜单,里面提供一些功能,针对源码调试的,作为逆向工作者,我们不关心这个。 ”offset” 指定反汇编的地址,默认值为 @$scopeip ,伪寄存,它的值等于当前 EIP “Previous”= 上一页; “Next”= 下一页。此窗口不是默认打开的(只有命令窗口是默认打开的),你需要 ALT+7 来打开它,如果你希望它能自动打开,你可以通过程序的菜单栏:

Windows =>Automatically Open Disassembly

你可以在命令窗口中输入下面命令来完成一些 OllyDbg 反汇编窗口中的一些功能

u[b] Address len 
以给出的地址为起点向前反汇编, LEN 指定指令的个数,格式为 L+NUM 。如果你使用 ub 则反汇编的方向相反。例如你可以使用下面指令汇编入口点的头 10 条指令( @$exentry 伪寄存器,总是等于 EP )。
U @$exentry L10

uf Address 
反汇编指定函数

a [Address] 
进入汇编模式。不输入任何内容,按 ENTER 结束汇编模式。

r $ip=address   $ip
伪寄存器,修改它的值将会影响命令指针。 r 指令用于修改或显示寄存器  

WinDbg
也有查找指令,功能比 Ollydbg 差,而且有点复杂,让我们来看看下面 3 条指令
s 0012ff40 L20 'H' 'e' 'l' 'l' 'o' 
s 0012ff40 L20 48 65 6c 6c 6f 
s -a 0012ff40 L20 "Hello" 

它们都是等效的。意为在 0012ff40 0012ff60 之间搜索 hello 字符, -a 参数指定以 ACSII 的方式搜索字符,类似的还有 -u ,它指定以 UNICODE 的方式搜索字符。

注意:这里是字符,而不是 Ollydbg 的字符参考。如果你了解 PE 结构,或者你可以搜索资源段,找出字符的首址,下内存访问断点。如果你希望查找某一条指令,你需要知道它的机器码。
1 2   寄存器窗口

    
如图,它同样简陋,而且不方便。尽管我们能用 “Customize…” 对寄存器重新排序。
 
它的快捷键是 ALT+4 。由于命令窗口会显示当前 EIP 的所有 X86 寄存器状态,所以我们一般不会用到这个窗口。为了使 WinDbg Ollydbg 一样可以显示出寄存器所指向的字符。可以用以下命令:

.pcmd -s ".if(eax<70000000 and eax>00120000){da eax;du eax}; .if(edx<70000000 and edx>00120000){da edx;du edx}"

它的功能是当 EAX EDX 指向指定内存范围(这里的设置是 70000000 以上, 00120000 一下。)时,就以 ASCII UNICODE 显示内存中的字符。

.pcmd 
不带参数则显示每条指令之后自动使用的指令。 -s " 命令 设置命令。 -c  清除命令。你可以不必每次启动都重新设置它。
1 3   调用栈窗口

WinDbg 中没有堆栈窗口,取而代之的是调用栈窗口( ALT+6 )。下面让我们来看看怎么用。 ( 这幅图片可能是原作者不小心弄错了,这不是调用堆栈窗口而是寄存器窗口 )
 
如图,我以号码为 04 的调用来说明。 “ntdll!RtlReleasePebLock+0x2d” 调用函数的名称, 77fa15d3 是函数返回地址, 0012fd30 是函数第一个参数,如此类推。这里其实是将堆栈横排,也就是说当你进入 ntdll!RtlReleasePebLock+0x2d ,该窗口就会生成一个项目,并且把堆栈中的内容横排,其实就是下面的数据:

77fa15d3 
0012fd30 
77f80000 
00000000 

调用窗口中最左边的 0012fd1c=ESP

在命令窗口输入 kb ,然后你会看到跟调用栈窗口一模一样的内容。最后,此窗口功能同样没有 Ollydbg 强大。
1 4   内存窗口

ALT+5 ,然后你会看到下图所示的窗口:

 它提供多种风格的显示,可惜它仍然是一个文本框,你只能复制粘贴,不能象Ollydbg那样能下断点,也能直接改内存。
同样地,你可以使用d*指令来达到同样多样化的内存显示。例如db address,将会以内存窗口的默认风格显示给出地址的数据。

要改变内存数据,你需要使用e*命令,格式如下:

e Address [Values] 
例如改变00100000的数据
Eb 00100000 01 02 03 04      
数据类型为BYTE
Ed 00100000 0201 0403       
数据类型为
DWORD
Ea 00100000 ‘hello’           
数据类型为
ASCII
Eu 00100000 ‘
你好’           数据类型为UNICODE

15  命令窗口

Ollydbg中,命令行只是一个默认插件。这也是WinDbg唯一比Ollydbg好的界面了。它的快捷键是alt+1

由于是文本框,所以你可以很容易就翻查当前调试记录。例如单步到某一步的时候,想知道之前经过的某一条指令的某个寄存器的值,向上滚动窗口就可以了,你甚至可以CTRL+F打开查找窗口,并按F3查找下一个。同时因为是文本框的关系,把整个过程复制下来,做点文字编辑,就可以成为一篇破文了。而且WinDbg也提供了把命令窗口内容保存到文件的功能,你可以通过菜单“EDIT=>Write windows text to file”。假如你需要重复使用某一命令,也可以通过上箭头或者下箭头翻查历史记录。按ENTER则自动重复上一条指令的操作。

Ollydbg
通过各种窗口提供额外的信息,而WinDbg则是提供各种命令以让你了解相关信息。下面来简单介绍一下这些指令:

.prompt_allow 
设置单步过程中,是否显示一些附带信息,通过+/-控制。
      dis  
反汇编当前指令
      ea  
当前指令地址
      reg  
寄存器
      src  
源代码行中位置
      sym 
符号
例如关闭所有单步过程中的显示,可以输入.prompt_allow –dis –ea –reg –src -sym

特别地,你可以通过rm指令来设置显示哪些寄存器,你可以通过rm ?来显示可以设置的值。
       1  32
位寄存器
       2  64
位寄存器,如果支持
       4  
浮点寄存器
       8  
段寄存器
      10  MMX
寄存器
      20  Debug 
寄存器,如果在内核模式,还能显示CR类的寄存器
      40  SSE XMM 
寄存器
如果需要同时显示几类寄存器,只要把对应的数字加起来就可以了,例如你希望同时显示MMX寄存器和SSE XMM寄存器,你可以输入rm 50。显示效果如下:

mm0= 0007000077f 89964  mm1= 000706880134f 708
m m2=ffffffff 77f 899a 0  mm3=0009bbd000070b 38
m m4= 77f 8996400000000  mm5= 0134f 74c 00000000
m m6= 77f 899a 077f 98191  mm7=00070b3877fcc882
xmm0=1.00797e+034 8.40779e-045 2.8026e-045 8.7191e-040
xmm1=8.68054e-040 8.68099e-040 1.00797e+034 1.02606e+034
xmm2=3.32387e-038 0 0 8.72056e-040
xmm3=3.32387e-038 -1.#QNAN 6.42848e-040 1.01212e+034
xmm4=8.7191e-040 8.7208e-040 8.40779e-045 1.00798e+034
xmm5=3.50325e-044 6.42848e-040 8.71989e-040 3.32383e-038
xmm6=1.94131e+034 3.32388e-038 -1.#QNAN 1.00838e+034
xmm7=3.32406e-038 0 3.32384e-038 6.42848e-040
ntdll!DbgBreakPoint+0x1:
77fa 144c  c3              ret

.dml_start   
DML的方式显示一些自定义功能,默认情况下会显示各类命令帮助已经关于调试进程的一些基本信息。DML命令在命令浏览窗口将会得到更好的支持。你能使用CTRL+N打开该窗口并使用此指令。
lm /D      
DML的方式显示当前加载模块的详细信息。
!teb       
显示TEB的主要信息
!peb       
显示PEB的主要信息
!handle     
显示handle信息

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值