| 从Ollydbg说起-----WinDbg用户态调试教程(图) |
| 作者:佚名 来源:不详 发布时间:2008-1-10 16:27:44 |
减小字体
增大字体
|
【文章标题】: 【原创】从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
1.5 命令窗口
在Ollydbg中,命令行只是一个默认插件。这也是WinDbg唯一比Ollydbg好的界面了。它的快捷键是alt+1。
由于是文本框,所以你可以很容易就翻查当前调试记录。例如单步到某一步的时候,想知道之前经过的某一条指令的某个寄存器的值,向上滚动窗口就可以了,你甚至可以CTRL+F打开查找窗口,并按F3查找下一个。同时因为是文本框的关系,把整个过程复制下来,做点文字编辑,就可以成为一篇破文了。而且WinDbg也提供了把命令窗口内容保存到文件的功能,你可以通过菜单“EDIT=>Write windows text to file”。假如你需要重复使用某一命令,也可以通过上箭头或者下箭头翻查历史记录。按ENTER则自动重复上一条指令的操作。上一页 1 2 3 4 5 6 下一页|
|
[]
[返回上一页]
[打 印]
|
|
|