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. 每日质量NPM包拖拽文件上传_react-dropzone

    一.react-dropzone 官方定义: Simple HTML5-compliant drag'n'drop zone for files built with React.js. 理解: 一个 ...

  2. Hadoop 学习路线

    大数据实时计算工程师/Hadoop工程师/数据分析师职业路线图 描述 本路线图是一个专门针对大数据实时处理.Hadoop工程师和数据分析师所设计的课程体系介绍,在实时计算方向主要包括了从数据收集框架. ...

  3. MySQL LIMIT的使用

    SELECT语句返回所有匹配的行,它们可能是指定表中的每个行.为 了返回第一行或前几行,可使用LIMIT子句. 比如我原始的student表如下: 我现在想输出前4行,就使用 SELECT * FRO ...

  4. Android JNI 数组操作

    JNI 中有两种数组操作,基础数据类型数组和对象数组,JNI 对待基础数据类型数组和对象数组是不一样的. 基本数据类型数组 对于基本数据类型数组,JNI 都有和 Java 相对应的结构,在使用起来和基 ...

  5. Genome-wide gene-environment analyses of depression and reported lifetime traumatic experiences in UK Biobank

    Genome-wide gene-environment analyses of depression and reported lifetime traumatic experiences in U ...

  6. 时钟中断TIMER_BH(bottom_half)实现分析

    017-12-6 16:27:35时钟中断TIMER_BH(bottom_half)实现分析1.3.1001. 时钟0号中断安装    setup_x86_irq(0, &irq0);@arc ...

  7. Confluence 6 从一个模板中创建一个空间

    Confluence 已经存储了一系列的模板,这些模板被称为 空间蓝图(space blueprints),这模板具有一些自定义的主页,边栏或者可能有蓝图页面或一些示例内容来帮助你开始使用 Confl ...

  8. 从早期 Spring Boot 版本升级

    如果你现在正在从早期的 Spring Boot 版本进行升级的话,请访问 “migration guide” on the project wiki 页面,这个页面提供了有关升级的详细指南.同时也请查 ...

  9. grid 用于同一用例在不同测试环境下的测试结果

    步骤: 1.http://www.seleniumhp.org/download   下载selenium standalone server 2.配置java环境 3.运行selenium serv ...

  10. python+requests接口自动化测试框架实例详解教程

    1.首先,我们先来理一下思路. 正常的接口测试流程是什么? 脑海里的反应是不是这样的: 确定测试接口的工具 —> 配置需要的接口参数 —> 进行测试 —> 检查测试结果(有的需要数据 ...