认识WinDbg
一、前言
本人学习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
认识WinDbg的更多相关文章
- 透过WinDBG的视角看String
摘要 : 最近在博客园里面看到有人在讨论 C# String的一些特性. 大部分情况下是从CODING的角度来讨论String. 本人觉得非常好奇, 在运行时态, String是如何与这些特性联系上的 ...
- Windbg Extension NetExt 使用指南 【3】 ---- 挖掘你想要的数据 Managed Heap
摘要 : NetExt中有两个比较常用的命令可以用来分析heap上面的对象. 一个是!wheap, 另外一个是!windex. !wheap 这个命令可以用于打印出heap structure信息. ...
- Windbg Extension NetExt 使用指南 【2】 ---- NetExt 的基本命令介绍
摘要 : 本章节介绍NetExt常用的命令. 并且对SOS进行一些对比. NetExt的帮助 要想玩好NetExt, 入门就得看帮助. 看NetExt的帮助可以调用!whelp 命令. 这样hi列举出 ...
- Windbg Extension NetExt 使用指南 【1】 ---- NetExt 介绍
摘要 : 在使用WINDBG做debugging的时候,需要一个好的工具帮助进行数据分析. 最常见的extension包括SOS, PSSCOR. NetExt则是另外一种提供了丰富命令功能的deb ...
- Windbg跟踪临界区的BUG
最近跟踪了一个程序的界面卡死问题,该卡死偶尔出现,在抓到一次dump后用windbg载入分析,打印出函数调用堆栈后,一眼可以看出是临界区死锁了. 代码: 0:000:x86> kb ChildE ...
- 使用Windbg在XP下Heap追踪失败的原因
1.故事背景 最近同事的代码中碰到一个bug会导致奔溃的bug,从dump上看是由于某个对象的堆内存指针被释放了,但代码仍调用了该对象指针的虚函数,从而引起内存访问违法崩溃,由于该类被大量使 ...
- Windbg调试命令详解
作者:张佩][原文:http://www.yiiyee.cn/Blog] 1. 概述 用户成功安装微软Windows调试工具集后,能够在安装目录下发现四个调试器程序,分别是:cdb.exe.ntsd. ...
- windbg运行
运行起来会提示windbg is running. BUSY 这个是正常运行的状态,只有发生异常,或者被指定断点,才会中断.
- Windbg使用简明指南
第一章 准备 1.1. 环境配置 _NT_DEBUGGER_EXTENSION_PATH=C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727 _NT_SY ...
- WinDbg 蓝屏dump分析教程
一.WinDbg是什么?它能做什么? WinDbg是在windows平台下,强大的用户态和内核态调试工具.它能够通过dmp文件轻松的定位到问题根源,可用于分析蓝屏.程序崩溃(IE崩溃)原因,是我们日常 ...
随机推荐
- Codeforces Round #272 (Div. 1)D(字符串DP)
D. Dreamoon and Binary time limit per test 2 seconds memory limit per test 512 megabytes input stand ...
- LINUX2.4.x网络安全框架
在分析LINUX2.4.x网络安全的实现之前先简介一下它里面包括的几个重要概念:netfilter.iptables.match.target.nf_sockopt_ops.网络安全功能点的实现 ...
- JAVA8,SPRING,ANGULARJS对项目
java8+spring+angularjs 项目应用 最近有写一个电子订单商务网站,使用JAVA8,SPRING,ANGULARJS对项目使用的技术和大家分享. 第一次写博客,哪有不对需要改正的请联 ...
- .Net常用方法汇总
//创建某个目录的文件夹 调用如下: var folder = initFolder(Export_Folder.Text, "ExportMembers"); private s ...
- IEnumerable,IQueryable的区别
IEnumerable,IQueryable之前世今生 IEnumerable<T>在.Net2.0中我们已经很熟悉了.你想要利用Foreach迭代吗?实现IEnumerable<T ...
- 数据结构与算法之递推算法 C++与PHP实现
数据结构是算法实现的基础,算法总是要依赖于某种数据结构来实现的.往往是在发展一种算法的时候,构建了适合于这样的算法的数据结构.一种数据结构假设脱离了算法,也就没有存在的价值了. 算法的作用----解决 ...
- easyui 小知识
默认为今天 $(document).ready(function () { $(function () { var curr_time = new Date(); ...
- DataTable与实体类的转换
多年前写的DataTable与实体类的转换,已放github 阅读目录 介绍 起因 代码 UnitTest GitHub 介绍 很多年前一直使用Ado.net,后来慢慢转型到其他的orm,在转型过程中 ...
- 给Notepad++ 6.7 加右键菜单带图标
使用的是Notepad++ 6.7,下载 NppShell64.dll 和 NppShell.dll方法:将BAT文件和下载的NppShell64.dll 和 NppShell.dll放置Notepa ...
- JS常用的标准函数
原文:JS常用的标准函数 1.Array类型函数 array.concat(item...) 函数功能:关联数组,实现数组相加功能,但并不影响原先数组,concat返回新数组. array.join( ...