scapy学习笔记(二)
发布日期:2021-10-07 04:43:09 浏览次数:9 分类:技术文章

本文共 3025 字,大约阅读时间需要 10 分钟。

在上一篇文章中讨论了在windows下安装配置scapy环境,这章我们讲解析如何使用scapy进行数据包分析。

基本函数介绍

rdpcap()

该方法是在解析数据包的时候读入pcap文件所需要调用的方法。调用当方式:

path_pcap='this is the path of pcap file'f=scapy.rdpcap('path_pcap')

该函数返回的f是一个scapy.plist.PacketList(可以看做一个list进行运算)类型可以通过f[i]来读取第i+1个数据包(因为list从0开始计算,不是第一个)例如读取第一个数据包的内容,可以使用f[0]来找到第一个数据包,使用f[0].show()或f[0].display()进行数据包格式化打印。

在调用该方法的时候会将整个pcap文件读入到内存中,这样的情况下,当pcap文件过大的时候将会出现解析速度奇慢无比。建议处理的数据包的大小不要过大。

show()方法/display()

这两种方法都可以看到数据包的层次结构,例如:

display方法

其中f[0]指第一层,通过f[0].payload可以得到该层协议的载荷部分,通过重复调用payload方法可以找到自己需要的层,并对其下的字段进行提取分析。

例如:我们可以通过以下方法获取数据包的源ip地址
这里写图片描述
通过类似的方式,我们可以对数据包的任意字段进行提取。对数据包进行整体的分析。

sessions()方法

该方法将读入的数据包列表分为对话组存储,以源IP和目的IP为分化标准,但是当源IP和目的IP位置变换的时候将会被视为不同的分组,所以在使用的时候要注意。

可以通过一下方式对sessions结果进行简略输出:

这里写图片描述
其中包含了会话分组以及对应的协议,以及对应的数据包数量。
通过如下方式还可以输出对应的数据包的时间
这里写图片描述

数据包的信息提取处理大概就这么多了,有问题欢迎提问。

数据包对应内容提取

在scapy库中,数据包是按照show()的层次对每一层的数据包进行管理的。我们可以通过以下关键字对数据包各个层的内容进行提取,或者移动到任何一层进行任何内容的提取。我们用下图的数据包做实验。

这里写图片描述

移动到下一层

>>> a[0].payload.show()###[ IP ]###  version   = 4  ihl       = 5  tos       = 0x0  len       = 52  id        = 8402  flags     = DF  frag      = 0  ttl       = 120  proto     = tcp  chksum    = 0xbf21  src       = 125.71.228.122  dst       = 192.168.0.102  \options   \###[ TCP ]###     sport     = http     dport     = 49807     seq       = 991302220     ack       = 1678432322     dataofs   = 8     reserved  = 0     flags     = FA     window    = 254     chksum    = 0xd85b     urgptr    = 0     options   = [('NOP', None), ('NOP', None), ('Timestamp', (849687605, 367571264))]

提取对应层的名称

通过使用name关键字可以提取每一层对应的名称,如下所示:

>>>a[0].name'Ethernet'>>> a[0].payload.name'IP'

提取每一层对应的内容

对于数据包的每一个关键字,scapy都可以使用名称查找,对应的名称为使用show()的时候等号前方出现的字符串,使用方法如下:

>>> a[0].payload.name#获取名称'IP'>>> a[0].payload.src#获取数据包源端口'125.71.228.122'>>> a[0].payload.version#获取ip版本号4>>> a[0].payload.dst#获取目的ip地址'192.168.0.102'>>> a[0].payload.payload.sport#获取源端口号80

获取负载的内容

通过load可以获取到数据包负载的内容,由于第一个数据包没有负载内容,我们遍历找到第一个有负载的数据包进行使用说明,数据包的格式和使用方法如下:

数据包格式:###[ Ethernet ]###  dst       = ff:ff:ff:ff:ff:ff  src       = fc:d7:33:ae:45:e4  type      = 0x800###[ IP ]###     version   = 4     ihl       = 5     tos       = 0x0     len       = 143     id        = 43345     flags     =     frag      = 0     ttl       = 64     proto     = udp     chksum    = 0x4ebc     src       = 192.168.0.1     dst       = 192.168.0.255     \options   \###[ UDP ]###        sport     = 1024        dport     = 5001        len       = 123        chksum    = 0x3350###[ Raw ]###           load      = '\x01\x01\x0e\x00\xe1+\x83\xc7\x85k\x00e\x00\x00\x00\x06\x00\tTL-WR886N\x00\x0b\x00\x035.0\x00\x07\x00\x01\x01\x00\x05\x00\x11fc-d7-33-ae-45-e4\x00\x08\x00\x0b192.168.0.1\x00\t\x00\ntplogin.cn\x00\n\x00\rTL-WR886N 5.0\x00\x0c\x00\x051.7.2'获取数据包负载的方法:>>> a[139].payload.payload.payload.load'\x01\x01\x0e\x00\xe1+\x83\xc7\x85k\x00e\x00\x00\x00\x06\x00\tTL-WR886N\x00\x0b\x00\x035.0\x00\x07\x00\x01\x01\x00\x05\x00\x11fc-d7-33-ae-45-e4\x00\x08\x00\x0b192.168.0.1\x00\t\x00\ntplogin.cn\x00\n\x00\rTL-WR886N 5.0\x00\x0c\x00\x051.7.2'

欢迎访问我的github查看scapy进行数据包特征提取的样例代码。

欢迎咨询

转载地址:https://blog.csdn.net/meanong/article/details/53942671 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Python项目文件管理
下一篇:python 网络数据包处理和嗅探工具Scapy 学习笔记(一)

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2024年04月18日 17时21分36秒