- WinDbg核心功能介绍
- WinDbg加载自编译HelloWorld程序
- WinDbg分析真实程序
- WinDbg常用命令总结
- WinDbg插件使用
WinDbg初步学习总结与简单实战
WinDbg核心功能介绍
WinDbg是在windows平台下,强大的用户态和内核态调试工具。它能够通过dmp文件轻松的定位到问题根源,可用于分析蓝屏、程序崩溃(IE崩溃)原因,是我们日常工作中必不可少的一个有力工具,学会使用它,将有效提升我们的问题解决效率和准确率。
WinDbg加载自编译HelloWorld程序
本部分使用的helloworld源程序与之前相比没有改动,唯一需要注意的是在使用visual c++生成文件时需要生成.pdb文件,它是该应用程序相应的符号文件,若没有它调试将变得十分困难。
打开windbg,点击:File->Open Executable,选中编译好的helloworld.exe文件。随后我们使用lm命令查看一下加载了那些模块。
我们想要运行到HelloWorld.exe的main函数中停下,可以使用!dh -a helloworld命令,用来在所有头部文件中搜索helloworld关键词,需要注意的是这里呈现的地址结果是相对虚拟地址(RVA),并非真实地址。
从图中可得它的想对虚拟地址为0x3510,由开始lm命令中可知,helloworld模块的起始地址为0x00400000,这两个十六进制相加结果为0x403510,此即为main函数真实地址,我们使用bp命令在该处进行断点,bl可以看到断点的详情。
随后使用g命令运行,成功命中0号断点
此时对应的Disassembly窗口显示如下图所示
此时即为helloworld入口点main处。事实上还有另一种更为轻松的方式来寻找入口点main,我们在windbg的命令行中直接输入bp main,让其自行判断main的位置并设置断点,但是断的位置可能并不十分精准,mainCRTStartup才是真正的程序入口点。
WinDbg分析真实程序
下面我们以windows自带的记事本为例进行简单调试。首先打开WinDbg,在”文件” 菜单上, 选择 “打开可执行文件”。 在 “打开可执行文件” 对话框中, 导航到包含 notepad.exe 的文件夹 (例如, C:\Windows\System32)。 对于 “文件名”, 请输入 notepad.exe。 单击“打开” 。
此时若要查看Notepad.exe各个模块的符号,可以输入该命令: x notepad!*
随后将会看到结果的输出。
若要查看Notepad.exe 模块中包含 main 的符号, 可以命令: x notepad!main
在记事本上设置断点notepad!WinMain,输入以下命令: bu notepad!WinMain
要验证是否设置了断点,请输入以下命令: bl
运行,请输入以下命令: g
记事本一直运行到winmain函数,然后中断到调试器。
此时要查看在记事本进程中加载的代码模块列表,请输入以下命令: lm
要查看堆栈跟踪,请输入以下命令: k
再次运行 g,要中断记事本执行,请从“调试”菜单中选择“中断”。
观察保存过程,要在zwwritefile处设置和验证断点,请输入以下命令: bu ntdll!ZwWriteFile和 bl。
输入g重新开始运行记事本。在记事本窗口中,输入一些文本,然后从“文件”菜单中选择“保存”。当涉及zwCreateFile时,正在运行的代码将中断。输入k以查看堆栈跟踪。
在windbg窗口的命令行左侧,注意处理器和线程号。在本例中,当前处理器编号为0,当前线程编号为2。因此,我们正在查看线程2的堆栈跟踪(它恰好运行在处理器0上)。要查看记事本进程中所有线程的列表,请输入以下命令:~
要查看线程0的堆栈跟踪,请输入以下命令:~0s,并输入k查看详情。
要退出调试并从记事本进程中分离,请输入以下命令: qd,则本次调试结束记事本程序关闭。
WinDbg常用命令总结
命令 | 含义 | 说明 |
---|---|---|
p | Step | 单步步过 |
t | Trace | 单步步入 |
pa | Step to Address | 单步到指定地址 不进入子函数 |
ta | Trace to Address | 追踪到指定地址 进入子函数 |
pc | Step to Next Call | 单步执行到下一个函数调用 |
tc | Trace to Next Call | 追踪执行到下一个函数调用 |
tb | Trace to Next Branch | 追踪到下一条分支指令 |
g | Go | 恢复运行 |
gu | Go Up | 执行到函数返回 |
q | Quit | 停止调试 |
.detach | detach | 分离调试器 |
bp | 设置软件断点 | 无 |
bu | 对未加载的模块设置断点 | 无 |
bm | 批量设置断点 | 无 |
ba | 设置硬件断点 | 无 |
bl | 列出所有断点 | 无 |
bc | 删除断点 | 无 |
bd | 禁止断点 | 无 |
be | 启用断点 | 无 |
!address | 显示内存信息 | 如内存范围、内存权限等。 |
WinDbg插件使用
Windbg也支持插件,winxp和winext是插件的默认搜索目录,插件要放在windbg根目录或插件文件夹中,加载后可以用命令“!插件名.help”来查看帮助,“!导出函数”来使用功能。加载插件用.load(直接使用!ext.xxx的方式也能加载ext插件),卸载用.unload,使用.chain能清晰看到当前加载的插件和搜索目录。
插件名称 | 主要功能 |
---|---|
AddSym | 允许在IDA和WinDBG之间传输符号名称 |
CmdHist | 记录您在调试会话中执行的每个命令,以便您可以轻松地重新执行 |
narly | 列出了有关加载模块的信息,如使用SafeSEH,ASLR,DEP,/ GS(缓冲区安全检查) |
PyKD | 允许Python用于脚本WinDBG |
windbgshark | 集成Wireshark协议分析器,以实现VM流量操纵和分析 |
MSEC | 提供自动崩溃分析和安全风险评估 |
Mona(需要PyKD) | 帮助高级分析/查找漏洞的命令集 |
Core Analyzer | 检查堆结构是否损坏,检测线程共享的对象等 |