利用scapy提取数据包的域名、url字段

分析数据的时候,需要从pcap包中按照一定的规则,提取出对应HTTP包的域名、url信息,以供后续分析使用。

开始

最开始想到的就是用scapy来进行提取,发现实际上它不解析HTTP层的。从图中可以看到,它在TCP层之后,就直接显示了Raw层了,而不是我想象的HTTP层。
利用scapy提取数据包的域名、url字段_第1张图片
老规矩,百度了一波之后,发现有个scapy-http的模块。配合使用后,来处理HTTP层。
pip install scapy-http之后

from scapy.all import *
import scapy_http.http
在引入后,可以处理
利用scapy提取数据包的域名、url字段_第2张图片
利用scapy提取数据包的域名、url字段_第3张图片
但是。。。。。
发现个问题,针对于非80端口,就不能处理。

利用scapy提取数据包的域名、url字段_第4张图片在这里插入图片描述

查看了一下scapy_http的源码,原来是注册绑定的80端口才按照http的方式处理:
利用scapy提取数据包的域名、url字段_第5张图片

自己的尝试

鉴于我的数据里面http会走哪些端口是不确定的,所以决定放弃此模块注册,自己写接口使用。
ps:因为测试数据包较大,故而用PcapReader实例化后,逐包获取的。

from scapy.all import *
filename = "a.pcap"
#实例化对象
pr = PcapReader(filename)
#逐包读取
while True:
    package = pr.read_packet()
    if package is None:
        break
    #有的数据,没有实际数据层,所以这里排除掉那类错误
    try:
        text = packet["Raw"].load
    	if "GET " == text[:4]:
    		info = text.split("\r\n")
    		uri = info[0].split(" ")[1]
    		#此处获取到的是所有的参数,不过目前我们只提取了host字段而已
    		other_info_dict = dict((x.split(":")[0], x.split(":")[1]) for x in info[1:] if ":" in x)
    		host = ""
    		if "Host" in other_info_dict:
        		host = other_info_dict["Host"]
    except:
    	pass

这样子,就可以提取出来相关的字段了。
在这里插入图片描述

结束语

分析数据包的时候,这个scapy肯定是利器,在这次分析scapy_http源码的时候,同时发现了,原来也是有gtp.py的库的(不过没办法直接用,我还没找到方法),因为之前找过,但是没找到,这次发现了,下回再研究一下,就可以制造4G的包了。算是一个意外的收获吧。

你可能感兴趣的:(python学习)