一、前言
本人学习WinDbg已经有好几天了,虽说技术掌握的还不太熟练,不过也总算是入门了在学习WinDbg的过程中,觉得WinDbg真的比OllyDbg难很多(不知道是不是习惯OllyDbg的缘故),所以就想做点笔记,那以后自己忘了也可以拿出来复习,也为同样在学WinDbg的兄弟提供一点帮助。文章写得有点嗦,初学者应该可以很快看完,老鸟就可以飘过了…
二、WinDbg简介
WinDbg是微软发布的一款免费而十分强大的调试工具。既然是微软自己发布的调试工具,那它对微软产品的调试当然是十分的强大。但虽说是功能强大,操作起来有时可能十分困难。有时候,可能WinDbg很多特别的功能我们还没知道,就更别说用得上了。我是个WinDbg的初学者,开始的时候觉得WinDbg真的很难入门,不过现在资料看多了,也就算是参悟了点。很多时候,我们习惯用OllyDbg或SoftICE(SoftICE我没用过),所以,也可以先从我们熟悉的入手,慢慢了解WinDbg。
下面是http://bbs.dbgtech.net/ 里一些资料的截图,可以加深我们对WinDbg的了解。(本人没有侵犯原作者版权的意思,只是想着把资料整理出来方便大家看。如有冒犯,请见谅)
内核调试方面:
用户调试方面:
虽说WinDbg在无源码调试方面确实比较困难,但在调试内核方面却真的有独到之处。我跟大家一样,可能本身对OllyDbg比较熟悉,所以我会尝试跟着CCDebuger大牛所写的《OllyDbg入门系列》的模式进行笔记的书写。
三、WinDbg的安装与配置
WinDbg包含在WDK里,也可以独立的下载。
官方的下载地址:http://www.microsoft.com/whdc/devtoo...g/default.mspx
汉化版的下载地址:http://bbs.pediy.com/showthread.php?...ghlight=WinDbg
下载下来的一般是WinDbg的安装程序,跟一般程序的安装过程类似。安装完后,若要使用汉化版本,就直接把汉化后的启动文件(例如WinDbg_cn.exe)复制到安装目录下,再直接点击(WinDbg_cn.exe)即可。
启动后的界面类似:
到这里,可能会发现没有其它窗口。但其实,只要你点击对应的窗口按钮(上图红色方框圈着的区域),工作区就会出现相应的窗口。
WinDbg有好几个窗口,功能跟OllyDbg的差不多。窗口的名称与用途如下:
名称 热键 用途
Command Atl+1 输入命令、显示命令结果和调试信息输出
Watch Alt+2 观察指令全局变量、局部变量和寄存器的信息
Locals Alt+3 自动显示当前函数的所有局部变量
Registers Atl+4 观察和修改寄存器的值
Memory Alt+5 观察和修改内存数据
Call Stack Alt+6 栈中记录的函数调用序列
Disassembly Alt+7 反汇编
Scratch Pad Alt+8 白板,可以用来做调试笔记等
Processes and Threads Alt+9 显示所有调试目标的列表,包括进程和线程等
Command Browser Alt+N 执行和浏览命令
在弹出需要的窗口后,就可以对窗口进行排列。通过鼠标拖曳窗口或结合右击窗口标题选择Dock(停靠)和Always floating(保持浮动),可以把窗口摆放成最适合我们工作的位置。
不知道是不是我自己的问题,本来想着把窗口排列成跟OllyDbg的界面类似,可怎么弄也达不到目的,最后也就选择了两个我最常用的窗口(Disassembly和Command),然后上下摆放。就像:
各位如果有摆放窗口的诀窍,麻烦也告之一下….
四、符号、源码路径设置
刚才也说过,WinDbg是一款很强大的源码调试工具。如果我们有程序的源码的话,一般可以生成它的符号文件。而在用WinDbg进行调试时,因为WinDbg本身不会自动识别符号文件,所以需要我们设置。
可以通过打开菜单 File Symbol File Path 和 File Source File Path,打开对应的对话框进行设置。
可以直接在Source path编辑框输入目录,也可以通过按钮Browse进行选择。多个目录之间用分号隔开。
到这里,可能有人有疑问。符号文件是什么?为什么我们以前用OllyDbg时不用设置符号文件?
其实我接触到这里的时候也十分的迷惑,甚至当时以为WinDbg只能调试有源码的文件。但后来,通过试验,逐步清楚了。
按我理解,符号就是用来标识程序的某个函数、变量或标记的东西。例如,通过载入有源代码和程序符号的目标文件,就可以轻松的使用 bp WinMain(我用来测试的程序的主函数)和bp 函数名(程序里的某个函数)。
那如果没有源代码怎么办?那只好使用微软的公共符号库。所谓公共符号库,可以理解成WinDbg对某些微软的系统函数(例如MessageBoxA)的识别,就像OllyDbg能够识别出MessageBoxA一样。虽然WinDbg能够识别出这些系统函数,但却显示的不明显(到后面会接触到)。
要设置公共符号文件,只需在设置符号文件的编辑框里输入路径即可。一般的输入形式为:
SRV*g:\symbols*http://msdl.microsoft.com/download/symbols
意思大概就是从http://msdl.microsoft.com/download/symbols的地址里下载符号到g:\symbols(自己设置用来保存符号的目录)。然后设置完可以使用 .reload 命令WinDbg重新加载新的符号文件。具体的用法可以参考WinDbg的帮助文档。
五、工作空间
工作空间,是WinDbg用来保存当前工作环境的工具。例如可以保存当前工作的窗口布局、符号路径设置等,当再次载入时就不用重新设置。
例如,当前工作空间还没载入任何的调试文件,那么它就是WinDbg默认的打开环境。在这里的所有设置,包括窗口布局。符号源码路径设置等,都可以根据用户需要保存起来。WinDbg提供多种保存方式,包括
Save Workspace --- 直接保存(保存到默认文件)
Save Workspace as --- 另存为(保存到用户指定的文件)
--------------------------------------------------------------------------
上面两种方式所说的文件其实并不是真正的文件,而是WinDbg在注册表里存放工作空间的项。
注册表的位置是:HKEY_CURRENT_USER\Software\Microsoft\Windbg\Workspaces
这个键里一般包含四个子键User、Kernel、Dump、Explicit,前3个子键用来保存用户态调试、内核态调试、调试转储文件时使用Save Workspace方式系统默认的保存路径,而Explicit则用来记录使用Save Workspace as方式保存的命名工作空间。有时或者会发现没有某个子键,这是因为你的WinDbg还没调试过使用该种调试方式的文件。
例如,我注册表HKEY_CURRENT_USER\Software\Microsoft\Windbg\Workspaces里有这些项:
那就说明,我的WinDbg目前还没进行过Dump文件的调试。
再展开User子键看看:
可以看出,我在用户态调试过3个程序,它们分别是CrackMe3.exe、CrackMe32.exe和adsfsf.exe,而且使用Save WorkSpace方式保存。
可能有人会问,有时后我调试完程序后没有选择Save WorkSpace而是直接关闭WinDbg也会自动的保存工作空间。这是因为你的WinDbg使用了“总是保存”的方式。
可以通过打开 菜单----view----Options 打开设置对话框:
图中用红色方框圈着的就是工作空间关闭时的提示。
选择 【Always ask】 在工作空间关闭时总是询问用户是否保存;
选择 【Always save】 在关闭时自动把工作空间保存起来;
选择 【Never save】 从不保存。
另外,WinDbg还提供另外一种保存方式【Save WorkSpace to File】,作用跟上面两种的方式差不多,只不过把工作空间以文件的形式保存到磁盘里,那么用户就可以通过U盘或其它方式把工作空间的环境移植到其它机器上使用。
在打开工作空间方面,当原本是使用默认的保存方式时,WinDbg在打开目标文件的时候同时也会自动打开其对应的工作空间文件。
另外,在载入调试目标后改变了工作空间并保存后,并不改变WinDbg默认的启动环境,只改变调试目标对应的工作空间保存文件,而只有在WinDbg还没载入任何调试目标时改变的才会影响原来的启动环境。
六、常用操作与命令
F9:设置断点,只要在光标定位的位置(上图中灰色条)按F9键即可,再按一次F9键则会删除断点。(相当于OllyDbg 中的 F2)
F10:单步步过。每按一次这个键执行一条反汇编窗口中的一条指令,遇到 CALL 等子程序不进入其代码。(相当于 OllyDbg中的 F8)
F8 or F11:单步步入。功能同单步步过(F10)类似,区别是遇到 CALL 等子程序时会进入其中,进入后首先会停留在子程序的第一条指令上。(相当于 OllyDbg 中的 F7)
F7:运行到选定位置。作用就是直接运行到光标所在位置处暂停。(相当于 OllyDbg 中的 F4)
Shift+F11:运行到跳出函数。
F5:运行。按下这个键如果没有设置相应断点的话,被调试的程序将直接开始运行。(相当于 OllyDbg 中的 F9)
WinDbg没有类似OllyDbg的【执行到用户代码】功能,但可以用 笨笨雄 写的插件,又或者可以多次按Shift+F11直到跳到用户代码。
注意,如果反汇编窗口中的某行显示蓝色,并不一定该行就是当前执行到的地址。在WinDbg的反汇编窗口,每次显示的代码行数都是固定的,可以通过窗口右上角的previous和next按钮或着鼠标滑轮查看前后的代码,而每次显示在中间的必定会显示蓝色。要回到当前执行到的指令,只需点击菜单的 Edit > Go to Current Instruction 即可。
七、总结
经过nightxie大牛的提点,知道了bu下的断点可以保存到WorkSpace里。谢谢提点
Breakpoints that you set by using bu are saved in WinDbg workspaces, but breakpoints that you set by using bp are not saved in workspaces.
这篇文章很多部分是我自己对WinDbg的理解,有些说法如果不对的话麻烦提点一下,小弟不胜感激。
下面是一些我学习时的资料,在这里也整理一下
貌似是《软件调试》中的章节
WinDBG用法详解.rar
来自 http://bbs.dbgtech.net/ 的资料
WinDbg入门系列.rar