您的位置:首页 > 其它

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

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



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

Windows =>Automatically Open Disassembly

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

u 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结构,或者你可以搜索资源段,找出字符的首址,下内存访问断点。如果你希望查找某一条指令,你需要知道它的机器码。[/align]
[align=left][b]1
2 寄存器窗口

如图,它同样简陋,而且不方便。尽管我们能用“Customize…”对寄存器重新排序。[/align]



[align=left]它的快捷键是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 清除命令。你可以不必每次启动都重新设置它。[/align]
[align=left]13 调用栈窗口
在WinDbg中没有堆栈窗口,取而代之的是调用栈窗口(ALT+6)。下面让我们来看看怎么用。(这幅图片可能是原作者不小心弄错了,这不是调用堆栈窗口而是寄存器窗口)[/align]



[align=left]如图,我以号码为04的调用来说明。“ntdll!RtlReleasePebLock+0x2d”调用函数的名称,77fa15d3是函数返回地址,0012fd30是函数第一个参数,如此类推。这里其实是将堆栈横排,也就是说当你进入ntdll!RtlReleasePebLock+0x2d,该窗口就会生成一个项目,并且把堆栈中的内容横排,其实就是下面的数据:

77fa15d3
0012fd30
77f80000
00000000

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

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

按ALT+5,然后你会看到下图所示的窗口:[/align]
[align=left][/align]



[align=left][/align]

它提供多种风格的显示,可惜它仍然是一个文本框,你只能复制粘贴,不能象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=0007000077f89964 mm1=000706880134f708
mm2=ffffffff77f899a0 mm3=0009bbd000070b38
mm4=77f8996400000000 mm5=0134f74c00000000
mm6=77f899a077f98191 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:
77fa144c c3 ret

.dml_start 以DML的方式显示一些自定义功能,默认情况下会显示各类命令帮助已经关于调试进程的一些基本信息。DML命令在命令浏览窗口将会得到更好的支持。你能使用CTRL+N打开该窗口并使用此指令。
lm /D 以DML的方式显示当前加载模块的详细信息。
!teb 显示TEB的主要信息
!peb 显示PEB的主要信息
!handle 显示handle信息
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: