python3使用scapy分析修改pcap大文件(1G)

    对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)#这里是进行读

希望能够多多交流!

 

 

你可能感兴趣的:(网络流量)