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='\x00\x1a\xa0kUf', dst='\x00\x13I\xae\x84,', data=IP(src='\xc0\xa8\n\n',
off=16384, dst='C\x17\x030', 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 dpkt 解析 pcap 文件的更多相关文章

  1. 【Python】测试dpkt解析pcap

    1.前言 本想借助dpkt解析mail.dns.http来辅助分析pcap包进行分析,查阅资料学习却发现并不如使用scapy那么方便. dpkt是一个python模块,可以对简单的数据包创建/解析,以 ...

  2. python dpkt解析ssl流

    用法:python extract_tls_flow.py -vr  white_pcap/11/2018-01-10_13-05-09_2.pcap  -o pcap_ssl_flow.txt  & ...

  3. python脚本解析json文件

    python脚本解析json文件 没写完.但是有效果.初次尝试,写的比较不简洁... 比较烦的地方在于: 1,中文编码: pSpecs.decode('raw_unicode_escape') 2,花 ...

  4. Python:解析properties文件

    在项目中遇到解析properties的情况,而Python中正好没有解析properties文件的现成模块,于是从网上找到了这个脚本,有一些小地方修改了一下 原博客: Python读写properti ...

  5. python解析pcap文件中的http数据包

    使用scapy.scapy_http就可以方便的对pcap包中的http数据包进行解析 scapy_http可以在https://github.com/invernizzi/scapy-http下载, ...

  6. Python解析Pcap包类源码学习

    0x1.前言 ​ 在现场取证遇到分析流量包的情况会比较少,虽然流量类设备原理是把数据都抓出来进行解析,很大一定程度上已经把人可以做的事情交给了机器自动完成. ​ 可用于PCAP包分析的软件比如科来,W ...

  7. python高效解析日志入库

    python脚本解析日志文件入库一般有三个重要的步骤:读文件.解析文件.入库.在这三个方面下功夫,可确保我们获得最优的性能(这里不讨论并发) 1 读文件:一次读一行,磁盘IO太多,效率低下:一次性读如 ...

  8. pcap文件生成metadata——使用tshark解析tcpdump的pcap包

    pcap文件生成metadata #!/usr/bin/env python # -*- coding: utf-8 -*- import os import time, datetime impor ...

  9. python 解析xml 文件: Element Tree 方式

    环境 python:3.4.4 准备xml文件 首先新建一个xml文件,countries.xml.内容是在python官网上看到的. <?xml version="1.0" ...

随机推荐

  1. C+++string类如何判断字符串为空

    string类是C++STL类之一,有很丰富的接口,判断string为空是经常用到的操作. string类为空,实际也就是元素为0个. 可以按照如下方式判断: 1.string类有自己的成员函数emp ...

  2. RN返回navigation方法

    RN官方指定的路由管理是navigation  通过打印我们可以得到navgation的相关属性 1:dispatch ,Redux的事件发起 2:goback()返回 3:navigate(rout ...

  3. P1547 Out of Hay

    传送门     练习 只是一个最小生成树的水题,拿来练练模板 AC代码: #include<iostream> #include<cstdio> #include<alg ...

  4. 数据库锁机制(以MySQL为例)

    选自:https://blog.csdn.net/aluomaidi/article/details/52460844 https://www.zhihu.com/question/51513268/ ...

  5. 学习笔记36—坚果云 | Papership或Zotero使用webDAV验证服务器不成功怎么办?

    很多人都喜欢用坚果云作为Zotero的第三方云盘,从而无限扩展Zotero的存储空间.可是大家在Papership或zotero客户端中验证坚果云webDAV服务器时,会出现验证不成功的问题,相信这个 ...

  6. Inception Network

    1. 下图为一个Inception 模块,即将输入的图像通过多种过滤器或者池化操作后,全部再给拼起来形成新的图像. 2. Inception 网络就是讲将多个Inception模块连起来而已,如下图的 ...

  7. (转)C# 的 String.CompareTo、 Equals和==的比较

    String.CompareTo 语法 public int CompareTo(    string strB) 返回值 小于 0,实例小于参数 strB: 0,实例等于参数 strB: 大于 0, ...

  8. FireFox(火狐)浏览器的相关问题

    如何加快FireFox(火狐)浏览器浏览网页速度 大部分网页加载缓慢的原因:1.宽带连接.网速不稳定2.浏览器本身问题,如果多开窗口浏览会占大量内存,而且磁盘空间没有做过优化,就这样电脑资源不够用,也 ...

  9. Bayesian generalized linear model (GLM) | 贝叶斯广义线性回归实例

    一些问题: 1. 什么时候我的问题可以用GLM,什么时候我的问题不能用GLM? 2. GLM到底能给我们带来什么好处? 3. 如何评价GLM模型的好坏? 广义线性回归啊,虐了我快几个月了,还是没有彻底 ...

  10. openstack中数据库连接数太多--pymysql.err.OperationalError,1040, u'Too many connections'

    1.出现问题: openstack运行过程中出现如下问题: OperationalError: (pymysql.err.OperationalError) (1040, u'Too many con ...