欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

《Dive into Windbg系列》Windbg脚本与插件

来源:本站整理 作者:佚名 时间:2019-07-10 TAG: 我要投稿

《Dive into Windbg》是一系列关于如何理解和使用Windbg的文章,主要涵盖三个方面:
1、Windbg实战运用,排查资源占用、死锁、崩溃、蓝屏等,以解决各种实际问题为导向。
2、Windbg原理剖析,插件、脚本开发,剖析调试原理,便于较更好理解Windbg的工作机制。
3、Windbg后续思考,站在开发和逆向角度,谈谈软件开发,分享作者使用Windbg的一些经历。
第四篇 《Windbg脚本与插件》
涉及知识点:Windbg目录结构、脚本执行流程、插件开发,给官方ext插件打补丁等。
 
预备知识
Windbg的前身是NTSD(一个命令行调试器,NTSD以前都随系统发布,Vista之后这个程序被放到Debuggers包里面去了),发行包里还有cdb.exe,可以看做是命令行的Windbg。
程序选择
版本选择:一般都用Windbg 10(不支持XP),笔者用的10.0.14321.1024。
平台选择:调试64位程序用x64版本,分析Dump和调试32位程序x86、x64版本。
安装方式:
对于较新版本的Windbg,官网已不再支持单独下载,只能通过Windows SDK里面勾选来安装,不过安装之后Redist目录会有x64/x86/arm的安装包,也可独立安装。
目录结构:

调试功能:dbgeng/dbghelp整个调试,符号解析、PE操作就和这两个模块打交道
符号下载:symsrv、symstore、symchk、pdbcopy、dbh都是和符号相关的程序,用IIS配合symstore可以自己搭建符号服务器。
远程调试:dbgsrv开启调试服务,一般远程调试lsass一些关键进程可用这个,别直接本机调试(非侵入式的查看内存的除外),因为lsass提供了很多安全相关的RPC接口,
只要Windbg有相关操作,轻轻松松死锁。
内核调试:livekd是我单独放进去的,之前的文章已经接触过了。系统自带的本地内核调试(LKD)要给引导加/debug参数,Vista开始,如果开启LKD,dbgeng会释放kldgbdrv.sys来实现内核操作,kldgbdrv.sys封装了KdSystemDebugControl,互相通信。kd开头的都是内核调试相关的程序。
系统控制:gflag功能很强大,实际上是系统安插的各种控制点(NtGlobalFlag),便于调试分析,Loader、异常、Debug相关的控制点居多。
插件目录:winxp、winext都是,看名字就知道以XP分界,看文档你会发现很多插件命令都标注了支持的系统(比如Windows XP and later)。
SDK目录:里面有开发插件的例子,值得一看。
其它的不再详细介绍,帮助文档里的Debugging Resources写得很清楚,不懂就F1。
 
Windbg脚本
脚本就是一连串的命令集合,Windbg除内置的命令外,还有很多插件提供命令。执行Windbg脚本有三种方式:
命令框里执行,例如:r $teb;r $peb 多条命令可用分号分隔,也可换行(命令框高度可以改变)。
命令框执行脚本文件,例如$$>
Windbg参数-c执行,例如windbg.exe -c “commands”脚本执行过程
用windbg调试另一个windbg,观察脚本的执行过程,首先在windbg!CmdExecuteCmd下断点,第一个参数则是用户输入命令。如下所示:
输入 bp @$exentry,程序中断到CmdExecuteCmd
----------------------------------------
Breakpoint 0 hit
windbg!CmdExecuteCmd:
00000001`3fe692a0 4056            push    rsi
----------------------------------------
可知参数1是输入的命令
0:000> du @rcx
00000000`0034f2b0  "bp @$exentry"
-----------------------------------------
查看当前栈回溯,可知消息来自UI线程,说明这是Edit的消息处理过程。
0:000> k
 # Child-SP          RetAddr           Call Site
00 00000000`000ab258 00000001`3fe673e4 windbg!CmdExecuteCmd
01 00000000`000ab260 00000001`3fe6cdd0 windbg!WinCommand::OnNotify+0x454
02 00000000`000ab2b0 00000000`77429bd1 windbg!WinBase::BaseProc+0x730
03 00000000`000ab3f0 00000000`774272cb USER32!UserCallWinProcCheckWow+0x1ad
04 00000000`000ab4b0 00000000`77426829 USER32!DispatchClientMessage+0xc3
05 00000000`000ab510 00000000`776811f5 USER32!_fnDWORD+0x2d
06 00000000`000ab570 00000000`7742685a ntdll!KiUserCallbackDispatcherContinue
07 00000000`000ab5f8 00000000`77423838 USER32!ZwUserMessageCall+0xa
08 00000000`000ab600 00000000`77426bad USER32!SendMessageWorker+0x73d
09 00000000`000ab690 000007fe`f56a54fd USER32!SendMessageW+0x5c
0a 00000000`000ab6e0 000007fe`f56a5458 MSFTEDIT!CW32System::SendMessage+0x51
0b 00000000`000ab960 000007fe`f56a86b7 MSFTEDIT!CTxtWinHost::TxNotify+0x134
0c 00000000`000ab9b0 00000000`77429bd1 MSFTEDIT!RichEditWndProc+0x228
***省略***
-----------------------------------------
跟踪CmdExecuteCmd,发现命令写入g_UiCommandBuffer(这里可通过内存访问断点跟踪)
00 00000000`000ac608 00000001`3fe78ef2 windbg!StartCommand
01 00000000`000ac610 00000001`3fe6947e windbg!AddStringCommand+0xae
02 00000000`000ac640 00000001`3fe673e4 windbg!CmdExecuteCmd+0x1de
03 00000000`000ac6a0 00000001`3fe6cdd0 windbg!WinCommand::OnNotify+0x454
接着就调用UpdateEngine通知Debug Engine
00 00000000`000ab148 000007fe`c4790d90 KERNELBASE!ReleaseSemaphore
01 00000000`000ab150 00000001`3fe7c580 dbgeng!DebugClient::ExitDispatch+0x70
02 00000000`000ab1a0 00000001`3fe78f2f windbg!UpdateEngine+0x2c
03 00000000`000ab1d0 00000001`3fe6930f windbg!AddStringCommand+0xeb

[1] [2] [3] [4] [5]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载