认识WinDbg

时间:2022-05-16 14:42:03
WinDbg学习笔记(一)--认识WinDbg

一、前言
    本人学习WinDbg已经有好几天了,虽说技术掌握的还不太熟练,不过也总算是入门了在学习WinDbg的过程中,觉得WinDbg真的比OllyDbg难很多(不知道是不是习惯OllyDbg的缘故),所以就想做点笔记,那以后自己忘了也可以拿出来复习,也为同样在学WinDbg的兄弟提供一点帮助。文章写得有点嗦,初学者应该可以很快看完,老鸟就可以飘过了…

二、WinDbg简介
    WinDbg是微软发布的一款免费而十分强大的调试工具。既然是微软自己发布的调试工具,那它对微软产品的调试当然是十分的强大。但虽说是功能强大,操作起来有时可能十分困难。有时候,可能WinDbg很多特别的功能我们还没知道,就更别说用得上了。我是个WinDbg的初学者,开始的时候觉得WinDbg真的很难入门,不过现在资料看多了,也就算是参悟了点。很多时候,我们习惯用OllyDbg或SoftICE(SoftICE我没用过),所以,也可以先从我们熟悉的入手,慢慢了解WinDbg。

下面是http://bbs.dbgtech.net/ 里一些资料的截图,可以加深我们对WinDbg的了解。(本人没有侵犯原作者版权的意思,只是想着把资料整理出来方便大家看。如有冒犯,请见谅)

内核调试方面:
认识WinDbg

用户调试方面:
认识WinDbg
认识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

到这里,可能会发现没有其它窗口。但其实,只要你点击对应的窗口按钮(上图红色方框圈着的区域),工作区就会出现相应的窗口。

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(保持浮动),可以把窗口摆放成最适合我们工作的位置。
认识WinDbg

不知道是不是我自己的问题,本来想着把窗口排列成跟OllyDbg的界面类似,可怎么弄也达不到目的,最后也就选择了两个我最常用的窗口(Disassembly和Command),然后上下摆放。就像:
认识WinDbg

各位如果有摆放窗口的诀窍,麻烦也告之一下….

四、符号、源码路径设置

刚才也说过,WinDbg是一款很强大的源码调试工具。如果我们有程序的源码的话,一般可以生成它的符号文件。而在用WinDbg进行调试时,因为WinDbg本身不会自动识别符号文件,所以需要我们设置。
可以通过打开菜单 File  Symbol File Path 和 File  Source File Path,打开对应的对话框进行设置。
认识WinDbg

认识WinDbg

可以直接在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
那就说明,我的WinDbg目前还没进行过Dump文件的调试。

再展开User子键看看:
认识WinDbg
可以看出,我在用户态调试过3个程序,它们分别是CrackMe3.exe、CrackMe32.exe和adsfsf.exe,而且使用Save WorkSpace方式保存。

可能有人会问,有时后我调试完程序后没有选择Save WorkSpace而是直接关闭WinDbg也会自动的保存工作空间。这是因为你的WinDbg使用了“总是保存”的方式。
可以通过打开 菜单----view----Options 打开设置对话框:
认识WinDbg
图中用红色方框圈着的就是工作空间关闭时的提示。
选择 【Always ask】  在工作空间关闭时总是询问用户是否保存;
选择 【Always save】 在关闭时自动把工作空间保存起来;
选择 【Never save】  从不保存。

另外,WinDbg还提供另外一种保存方式【Save WorkSpace to File】,作用跟上面两种的方式差不多,只不过把工作空间以文件的形式保存到磁盘里,那么用户就可以通过U盘或其它方式把工作空间的环境移植到其它机器上使用。

在打开工作空间方面,当原本是使用默认的保存方式时,WinDbg在打开目标文件的时候同时也会自动打开其对应的工作空间文件。

另外,在载入调试目标后改变了工作空间并保存后,并不改变WinDbg默认的启动环境,只改变调试目标对应的工作空间保存文件,而只有在WinDbg还没载入任何调试目标时改变的才会影响原来的启动环境。

六、常用操作与命令
认识WinDbgF9:设置断点,只要在光标定位的位置(上图中灰色条)按F9键即可,再按一次F9键则会删除断点。(相当于OllyDbg 中的 F2)

认识WinDbgF10:单步步过。每按一次这个键执行一条反汇编窗口中的一条指令,遇到 CALL 等子程序不进入其代码。(相当于 OllyDbg中的 F8)

认识WinDbgF8 or F11:单步步入。功能同单步步过(F10)类似,区别是遇到 CALL 等子程序时会进入其中,进入后首先会停留在子程序的第一条指令上。(相当于 OllyDbg 中的 F7)

认识WinDbgF7:运行到选定位置。作用就是直接运行到光标所在位置处暂停。(相当于 OllyDbg 中的 F4)

认识WinDbgShift+F11:运行到跳出函数。

认识WinDbgF5:运行。按下这个键如果没有设置相应断点的话,被调试的程序将直接开始运行。(相当于 OllyDbg 中的 F9)

WinDbg没有类似OllyDbg的【执行到用户代码】功能,但可以用 笨笨雄 写的插件,又或者可以多次按Shift+F11直到跳到用户代码。

注意,如果反汇编窗口中的某行显示蓝色,并不一定该行就是当前执行到的地址。在WinDbg的反汇编窗口,每次显示的代码行数都是固定的,可以通过窗口右上角的previous和next按钮或着鼠标滑轮查看前后的代码,而每次显示在中间的必定会显示蓝色。要回到当前执行到的指令,只需点击菜单的 Edit  > Go to Current Instruction 即可。

七、总结
经过nightxie大牛的提点,知道了bu下的断点可以保存到WorkSpace里。谢谢提点认识WinDbg

引用:

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

下面是一些我学习时的资料,在这里也整理一下

貌似是《软件调试》中的章节
   WinDBG用法详解.rar

来自 http://bbs.dbgtech.net/ 的资料
    WinDbg入门系列.rar