使用 python 自动化分析 CrashDump

作者:马卓 导语 :本文介绍了一下自动化分析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

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏企鹅号快讯

JDBC编程

前面我们已经讨论了数据库的安装和简单的使用,还没完成的可以先去Mysql的安装和Mysql数据库的简单操作回顾一下哦!今天我们来简单学习JDBC编程的准备和链...

3268
来自专栏老九学堂

Java开发常用工具

Java开发常用工具 小贴士 Java是目前最流行的软件开发语言,其IDE环境也备受开发者关注,IDE可以极大的提高开发速 一 UltraEdit ? Ultr...

2895
来自专栏数据之美

Zookeeper 原理与实践

1、Zookeeper 的由来 在Hadoop生态系统中,许多项目的Logo都采用了动物,比如 Hadoop 和 Hive 采用了大象的形象,HBase 采用了...

5608
来自专栏FreeBuf

软件漏洞分析技巧分享

作者:riusksk【TSRC】 在日常分析软件漏洞时,经常需要耗费比较长的分析时间,少则几小时,多则数天,甚至更久。因此,经常总结一些分析技巧是非常有必要的,...

2109
来自专栏逸鹏说道

2.并发编程~先导篇(下)

代码实例:https://github.com/lotapp/BaseCode/tree/master/python/5.concurrent/Linux/进程...

984
来自专栏jojo的技术小屋

原 web安全、XSS、CSRF、注入攻击

2033
来自专栏大内老A

[WCF-Discovery]服务如何能被”发现”

要让作为服务消费者的客户端能够动态地发现可用的服务,首先的要求服务本身具有可被发现的特性。那么到底一个可被发现的服务和一个一般的服务有何不同呢?或者说如何让一个...

1859
来自专栏青蛙要fly的专栏

Android技能树 — 网络小结(4)之socket/websocket/webservice

介于自己的网络方面知识烂的一塌糊涂,所以准备写相关网络的文章,但是考虑全部写在一篇太长了,所以分开写,希望大家能仔细看,最好可以指出我的错误,让我也能纠正。

853
来自专栏Timhbw博客

『工具』修复windows下各种.dll缺失或者其他组件

2016-03-0413:45:50 发表评论 417℃热度 DirectX修复工具(DirectX Repair)是一款系统级工具软件,简便易用。本程序为绿...

3156
来自专栏FreeBuf

旧饭新炒之Intel AMT提权漏洞(CVE-2017-5689)后续利用

之前的一篇Intel产品AMT本地及远程提权漏洞(CVE-2017-5689)复现,只是简单的复现了该漏洞,在文章最后提及到了如果进一步对该漏洞进行利用。但是有...

2236

扫码关注云+社区