zoukankan      html  css  js  c++  java
  • python dpkt 解析 pcap 文件

    dpkt Tutorial #2: Parsing a PCAP File

    原文链接:https://jon.oberheide.org/blog/2008/10/15/dpkt-tutorial-2-parsing-a-pcap-file/
    正如我们在dpkt库第一部分教程所示,dpkt库构建数据包很简单。
    Dpkt在解析数据包和文件时是等同效率的,所以在第二部分的教程中我们将会证明解析
    PCAP文件和被它所包含的包。

    Dpkt在创建和解析数据包上是一个非常棒的框架。然而dpkt并没有很多文档,一旦你熟悉使用这个模块,其余方面就相当容易了。我将会用一些简单的小任务作为 dpkt 教程,希望能提供一些文档的例子。
    如果你有任何项目想要用 dpkt 库完成,就写信给我。
    在本教程中,我们不仅仅展示如何解析原始PCAP文件格式,而且如何会展示如何解析在PCAP文件中的数据包。让我们开始吧!

    让我们解析一个之前捕获的PCAP文件,test.pcap,包括了一些HTTP会话。如果我们打开dpkt/pcap.py模块,我们可以看到它提供了一个读取类,包含了一个文件对象和公开了一个类似于读取记录的接口给pypcap。让我们用读取类打开test.pcap吧:

    f = open('test.pcap')
    pcap = dpkt.pcap.Reader(f)

    我们现在可以通过迭代pcap对象和访问数据包的每一行的输出。例如,我们可以打印出时间邮戳和数据包每个记录的数据长度:

    >>> for ts, buf in pcap:
    >>>     print ts, len(buf)
    1220901348.61 66
    1220901348.68 66
    ...

    当然,这会花费大量的效率解析数据包,让它变得更友好,可用的格式。使用dpkt,我们可以简单地传递一个原始的缓冲区给恰当的dpkt类并且让它的内容自动解析和解码到更友好的python对象:

    for ts, buf in pcap:
        eth = dpkt.ethernet.Ethernet(buf)

    传递数据包给dpkt 的Ethernet类,解析和解码到eth对象。因为dpkt的Ethernet类同样包括一些额外功能去解析已知的高层次的协议,我们可以看到IP层和TCP层的信息也被解码:

    >>> print eth
    Ethernet(src='x00x1axa0kUf', dst='x00x13Ixaex84,', data=IP(src='xc0xa8 ',
    off=16384, dst='Cx17x030', sum=25129, len=52, p=6, id=51105, data=TCP(seq=9632694,
    off_x2=128, ack=3382015884, win=54, sum=65372, flags=17, dport=80, sport=56145)))

    正如我们从输出所看到的,eth是Ethernet对象,pkt.data是IP对象,pkt.data.data是个TCP对象。我们可以以更友好的方式分配索引给这些对象:

    ip = eth.data
    tcp = ip.data

    我们照例查看不同对象的属性。比如,我们可以看到源地址和TCP头的目的端口:

    >>> print tcp.sport
    56145
    >>> print tcp.dport
    80

    当然,自从我们知道数据包输出包含了HTTP绘画,我们也许想要解析超过TCP的层次如解码HTTP请求。像这样,我们会确保我们的目的端口是80端口(显示一个与响应截然相反的请求)并且支持超过了tcp层的数据解析。我们会使用dpkt的HTTP解码器去解析这些数据:
    if tcp.dport == 80 and len(tcp.data) > 0:
        http = dpkt.http.Request(tcp.data)
    一旦HTTP payload被解析,我们可以查看它的各个属性:

    >>> print http.method
    GET
    >>> print http.uri
    /testurl
    >>> print http.version
    1.1
    >>> print http.headers['user-agent']
    Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.5)

    出于我们的教程的目标,我们仅仅会输出http的uri属性。

    并且决定我们的教程是为了解析PCAP文件和文件里面的数据包。在仅仅10行python里,我们创造了一个读取原始PCAP文件,解析和解码Ethernet、IP、TCP、IP层和打印出HTTP请求的URI的强有力的工具。

    教程接下来是完整的python脚本:

    #!/usr/bin/env python

    import dpkt

    f = open('test.pcap')
    pcap = dpkt.pcap.Reader(f)

    for ts, buf in pcap:
        eth = dpkt.ethernet.Ethernet(buf)
        ip = eth.data
        tcp = ip.data

        if tcp.dport == 80 and len(tcp.data) > 0:
            http = dpkt.http.Request(tcp.data)
            print http.uri

    f.close() 

  • 相关阅读:
    python中列表排序的方法
    pyrhon3中字符串方法
    python数据探索与数据与清洗概述
    2020年日期表-python实现
    python中字符串离散化的例子
    python中常见的日期处理方法
    如何简单地理解Python中的if __name__ == '__main__'
    我的老爸老了
    关于
    关于
  • 原文地址:https://www.cnblogs.com/bonelee/p/10375742.html
Copyright © 2011-2022 走看看