对pcap文件分析比较常用的是C语言进行分析。这里由于常用python3,所以在网上寻找使用python3来处理这种大pcap包。不过现在网上有的对应教程非常少,而一大部分是用rdpcap来打开文件的,这个方法在打开大文件是完全行不通的,内存完全不够大,而且运行太慢。最后我找到了使用PcapReader读文件返回一个迭代器来解决大文件占用太多内存的问题。在pcap中数据结构里处理中也遇到了很多问题。下面我就说一下我的一些总结。【代码运行没问题】
附:如果觉得scapy处理大文件偏慢,希望能够更加快速的遍历pcap文件,可以看我的这篇博客:
https://blog.csdn.net/qq_38231051/article/details/82019782
python3安装scapy【仅供参考】:
https://www.cnblogs.com/z-joshua/p/6899700.html
首先导入包
from scapy.all import *
接下来是读取pcap文件:
with PcapReader('input.pcap') as pcap_reader:#返回一个迭代器
for pkt in pcap_reader:#for循环进行遍历
#对pkt进行相应的处理
要对pkt进行处理,首先得知道怎么访问自己要访问的数据,这里pkt直接打印会是这样:
这样的输出显然不是我们想要的,这里采用repr(pkt)返回一个字符串【这里我也不懂哈】,打印出来:
这里已经可以把一个数据包完整的打印出来了。但如果我们要对数据包进行过滤呢?比如把arp包过滤掉:
if 'ARP' in pkt:
continue
就是这么简单,过滤TCP,UDP也是一样的。如果我们要对源IP,目的IP等进行更改,可以这样做:
pkt['Ether'].src = '00:00:00:00:00:01'
pkt['Ether'].dst = '00:00:00:00:00:03'
pkt['IP'].src = '10.0.0.1'
pkt['IP'].dst = '10.0.0.3'
前两个是更改mac地址,后面两个是更改IP地址,他这里的索引原理我没整明白,如果有懂这个的大佬望告知!
最后附上完整代码:
#coding=utf-8
from scapy.all import *
#import os
def change(pkt):
pkt['Ether'].src = '00:00:00:00:00:01'
pkt['Ether'].dst = '00:00:00:00:00:03'
pkt['IP'].src = '10.0.0.1'
pkt['IP'].dst = '10.0.0.3'
return pkt
def write_file():#过滤并进行写文件
writers = PcapWriter('udp_from_input.pcap')#被写的文件
i=0
with PcapReader('input.pcap') as pcap_reader:#进行读的文件
for pkt in pcap_reader:
if 'UDP' in pkt:
#print(repr(pkt))
pkt = change(pkt)
writers.write(pkt=pkt)
print(i)#计数用,表示程序还在跑,没有卡死
i+=1
def read_test(n):#读函数
i=0
with PcapReader('udp_from_input.pcap') as pcap_reader:
for pkt in pcap_reader:
print(repr(pkt))
if(i>n):
break
i+=1
if __name__=='__main__':
read_test(4)#这里是进行读
希望能够多多交流!