零、前言
历时数月,终于结束了考研初试,Blog也很长时间没有更新了,期间还是有些小伙伴来Blog看文章很是感动。以后一定会坚持更新,尽量给大家推送一些干货。这次发的是Python解析pcap数据包的脚本,其实用wireshark就能解决大部分的数据包分析问题了,但有时候会遇到分析大量数据包或从大量数据包中提取某个信息的需求,这时用wireshark一个一个的打开就不现实了,这时就要心中默念“Python大法好!”。
一、pcap数据包格式
注意,这里是要解析pcap数据包格式的文件,而现在wireshark都是默认保存pcapng类型的文件,pcapng下一代文件格式,是为了突破现有广泛使用但是受限的PCAP格式的一个尝试。我们使用的库scapy,要是解析pcapng或其他类型的数据包文件可能会报错。另外scapy是不自带的,需要下载安装,如果安装不成功可以在kali下直接运行。
网络模型大家应该有所了解,按不同的标准有七层和五层的分法,wireshark就是按不同层次解析数据
同理scapy也是如此。下面这段代码打开数据包后是这样的
def test(filepath): pcaps = rdpcap(filepath) for p in pcaps: print p.show() break
不过scapy主要是分为Ethernet、IP、TCP、Raw这四层,每一层都有每一层的关键字,可以利用键值对的方式直接读取相应的内容。
二、Python代码
代码写的比较糙,大家可以根据的自己的需要再改进
#!/usr/bin/env python # -*- coding: UTF-8 -*- from scapy.all import * import os import re import shutil import time rootpath = "/root/pcap/" def openfiles(path): filelist = [] files = os.listdir(path) for f in files: filelist .append(f) return filelist def writefile(filename,stringlist): f = open("/root/result/"+filename+".txt","w") for i in stringlist: f.write(i+"\n") f.close() shutil.copy(rootpath+filename,"/root/result/"+filename) def search(filename): filepath = rootpath+filename stringlist = [] pcaps = rdpcap(filepath) for p in pcaps: for f in p.payload.payload.fields_desc: fvalue = p.payload.getfieldval(f.name) reprval = f.i2repr(p.payload,fvalue) #转换成十进制字符串 if str(f.name)=="src" and reprval=="10.250.109.12": #指定特定的ip地址 for f2 in p.payload.payload.payload.payload.fields_desc: #payload向下解析一层 #print f2.name if f2.name=="load"or f2.name=="data": fvalue = p.payload.getfieldval(f2.name) reprval = f2.i2repr(p.payload,fvalue) refind = re.compile(r'[A-Fa-f0-9]{32}') #根据自己的需求设置正则 temp = refind.findall(reprval) stringlist.extend(temp) if len(stringlist)>0: writefile(filename,stringlist) #将解析结果和对应的pcap包保存下来 if __name__=="__main__": filelist = openfiles(rootpath) for file in filelist: print file search(file) print "DONE!"
emmm… 一搜就搜到了宁神的博客