作者:马卓
导语 :本文介绍了一下自动化分析CrashDump的方法
由于项目原因,需要批量分析CrashDump文件,正常的手动分析流程是:
- 使用windbg载入CrashDump文件;
- 等待文件分析完成;
- 提取其中的信息;
- 进行决策,如何处理;
- 关闭CrashDump,继续下一个;
这种流程对于几个文件可能还不算什么,但是当面对成百上千个Dump文件时,效率就很低下了。因此我开始琢磨如何批量自动化的完成这个操作,这里我想到了pykd。
Pykd是使用python编写的调用windbg api的工具。按照官方文档的说法,pykd有两种模式:
一种是作为windbg的插件。相信经常使用windbg的同学应该会很熟悉。
而另一种模式则是作为独立的python模块存在的。这为我们摆脱windbg实现自动化提供了可能。
当作为python独立模块时,安装也很简单只需要运行以下命令即可:
Python -m pip install pykd
Pykd模块会自带dbgeng.dll这个模块,因此不再需要单独安装windbg。
下面来说一下如何利用这个模块实现自动化。这里涉及到两个api:pykd.loadDump()和pykd.closeDump()。顾名思义,loadDump就是用来载入crashdump文件的,closeDump是用来关闭crashdump文件的。这里需要强调一下closeDump的用法,pykd在loadDump以后,并没有为这个crashdump文件创建相应的对象,而仅仅只是返回了一个id,而pykd的各个命令中并没有区分多个crashdump文件的参数,因此我们在载入多个文件后再获得其他文件的信息,因此这里我们需要在获得文件信息后,调用closedump方法关闭文件,一来防止内存泄漏,二来防止多次载入信息以后造成数据的混淆。
下面是实现的代码,比较简单,大家可以自己添加代码,打印自己关心的信息,也可以通过pykd.dbgCommand()方法执行自己的命令。
_author__="hyperchem"
import pykd
import sys
import os
def help():
print "autoDumpAnalyzer v0.1 by HyperChem"
print "autoDumpAnalyzer.py <dir> ;Analyze crashdump in dir"
def printDumpInfo(name):
id=pykd.loadDump(name)
print "Exception IP:"+hex(pykd.getIP())
print "Registers:"
print pykd.dbgCommand("r")
bcdata=pykd.bugCheckData()
str_bcdata='BugCheck '
for bb in bcdata:
str_bcdata+=hex(bb)
str_bcdata+=","
print "BugCheckData:"+str_bcdata
pykd.closeDump(id)
def main():
if len(sys.argv)!=2:
help()
else:
dir=sys.argv[1]
ll=len(dir)
if dir[ll-1:]!="\\":
dir+="\\"
for dirpath,dirnames,filenames in os.walk(dir):
for file in filenames:
if ".dmp" in file.lower():
print "Analyzing CrashDump:"+file
Fulldir=dir+file
printDumpInfo(Fulldir)
print "*************************************"
if __name__=='__main__':
main()
下面是效果图:
参考链接:
Pykd 文档:
https://pykd.codeplex.com/wikipage?title=PYKD%200.2.%20Documentation&referringTitle=Documentation
Pykd API:
https://pykd.codeplex.com/wikipage?title=PYKD%200.3.%20API%20Reference&referringTitle=Documentation