我假设你已经掌握Ollydbg的使用,并且希望用WinDbg进行内核级的调试。这篇教程将会以Ollydbg为线索,帮助你尽快掌握WinDbg的使用,并简单介绍它的一些特性。
我假设你已经掌握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 清除命令。你可以不必每次启动都重新设置它。