WinDbg学习笔记(一)–认识WinDbg

WinDbg学习笔记(一)–认识WinDbg 一、前言


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

二、WinDbg简介


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

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

内核调试方面:


用户调试方面:

虽说WinDbg在无源码调试方面确实比较困难,但在调试内核方面却真的有独到之处。我跟大家一样,可能本身对OllyDbg比较熟悉,所以我会尝试跟着CCDebuger大牛所写的《OllyDbg入门系列》的模式进行笔记的书写。

三、WinDbg的安装与配置

WinDbg包含在WDK里,也可以独立的下载。


官方的下载地址://www.microsoft.com/whdc/devtoo…g/default.mspx


汉化版的下载地址://bbs.pediy.com/showthread.php?…ghlight=WinDbg

下载下来的一般是WinDbg的安装程序,跟一般程序的安装过程类似。安装完后,若要使用汉化版本,就直接把汉化后的启动文件(例如WinDbg_cn.exe)复制到安装目录下,再直接点击(WinDbg_cn.exe)即可。

启动后的界面类似:


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

WinDbg有好几个窗口,功能跟OllyDbg的差不多。窗口的名称与用途如下:

名称热键用途


CommandAtl+1输入命令、显示命令结果和调试信息输出


WatchAlt+2观察指令全局变量、局部变量和寄存器的信息


LocalsAlt+3自动显示当前函数的所有局部变量


RegistersAtl+4观察和修改寄存器的值


MemoryAlt+5观察和修改内存数据


CallStackAlt+6栈中记录的函数调用序列


DisassemblyAlt+7反汇编


ScratchPadAlt+8白板,可以用来做调试笔记等


ProcessesandThreadsAlt+9显示所有调试目标的列表,包括进程和线程等


CommandBrowserAlt+N执行和浏览命令


在弹出需要的窗口后,就可以对窗口进行排列。通过鼠标拖曳窗口或结合右击窗口标题选择Dock(停靠)和Alwaysfloating(保持浮动),可以把窗口摆放成最适合我们工作的位置。


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


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

四、符号、源码路径设置

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


可以通过打开菜单FileSymbolFilePath和FileSourceFilePath,打开对应的对话框进行设置。


可以直接在Sourcepath编辑框输入目录,也可以通过按钮Browse进行选择。多个目录之间用分号隔开。

到这里,可能有人有疑问。符号文件是什么?为什么我们以前用OllyDbg时不用设置符号文件?


其实我接触到这里的时候也十分的迷惑,甚至当时以为WinDbg只能调试有源码的文件。但后来,通过试验,逐步清楚了。

按我理解,符号就是用来标识程序的某个函数、变量或标记的东西。例如,通过载入有源代码和程序符号的目标文件,就可以轻松的使用bpWinMain(我用来测试的程序的主函数)和bp函数名(程序里的某个函数)。

那如果没有源代码怎么办?那只好使用微软的公共符号库。所谓公共符号库,可以理解成WinDbg对某些微软的系统函数(例如MessageBoxA)的识别,就像OllyDbg能够识别出MessageBoxA一样。虽然WinDbg能够识别出这些系统函数,但却显示的不明显(到后面会接触到)。

要设置公共符号文件,只需在设置符号文件的编辑框里输入路径即可。一般的输入形式为:


SRV*g:\symbols*//msdl.microsoft.com/download/symbols


意思大概就是从//msdl.microsoft.com/download/symbols的地址里下载符号到g:\symbols(自己设置用来保存符号的目录)。然后设置完可以使用.reload命令WinDbg重新加载新的符号文件。具体的用法可以参考WinDbg的帮助文档。

五、工作空间

工作空间,是WinDbg用来保存当前工作环境的工具。例如可以保存当前工作的窗口布局、符号路径设置等,当再次载入时就不用重新设置。

例如,当前工作空间还没载入任何的调试文件,那么它就是WinDbg默认的打开环境。在这里的所有设置,包括窗口布局。符号源码路径设置等,都可以根据用户需要保存起来。WinDbg提供多种保存方式,包括

SaveWorkspace—直接保存(保存到默认文件)


SaveWorkspaceas—另存为(保存到用户指定的文件)


————————————————————————–


上面两种方式所说的文件其实并不是真正的文件,而是WinDbg在注册表里存放工作空间的项。


注册表的位置是:HKEY_CURRENT_USER\Software\Microsoft\Windbg\Workspaces


这个键里一般包含四个子键User、Kernel、Dump、Explicit,前3个子键用来保存用户态调试、内核态调试、调试转储文件时使用SaveWorkspace方式系统默认的保存路径,而Explicit则用来记录使用SaveWorkspaceas方式保存的命名工作空间。有时或者会发现没有某个子键,这是因为你的WinDbg还没调试过使用该种调试方式的文件。


例如,我注册表HKEY_CURRENT_USER\Software\Microsoft\Windbg\Workspaces里有这些项:

那就说明,我的WinDbg目前还没进行过Dump文件的调试。

再展开User子键看看:

可以看出,我在用户态调试过3个程序,它们分别是CrackMe3.exe、CrackMe32.exe和adsfsf.exe,而且使用SaveWorkSpace方式保存。

可能有人会问,有时后我调试完程序后没有选择SaveWorkSpace而是直接关闭WinDbg也会自动的保存工作空间。这是因为你的WinDbg使用了“总是保存”的方式。


可以通过打开菜单—-view—-Options打开设置对话框:

图中用红色方框圈着的就是工作空间关闭时的提示。


选择【Alwaysask】在工作空间关闭时总是询问用户是否保存;


选择【Alwayssave】在关闭时自动把工作空间保存起来;


选择【Neversave】从不保存。

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

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

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


六、常用操作与命令


F9:设置断点,只要在光标定位的位置(上图中灰色条)按F9键即可,再按一次F9键则会删除断点。(相当于OllyDbg中的F2)

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

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

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

Shift+F11:运行到跳出函数。

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

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

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


七、总结


经过nightxie大牛的提点,知道了bu下的断点可以保存到WorkSpace里。谢谢提点

WinDbg学习笔记(一)–认识WinDbg

相关文章:

你感兴趣的文章:

标签云: