1. 程式人生 > >python3使用scapy分析修改pcap大檔案(1G)

python3使用scapy分析修改pcap大檔案(1G)

    對pcap檔案分析比較常用的是C語言進行分析。這裡由於常用python3,所以在網上尋找使用python3來處理這種大pcap包。不過現在網上有的對應教程非常少,而一大部分是用rdpcap來開啟檔案的,這個方法在開啟大檔案是完全行不通的,記憶體完全不夠大,而且執行太慢。最後我找到了使用PcapReader讀檔案返回一個迭代器來解決大檔案佔用太多記憶體的問題。在pcap中資料結構裡處理中也遇到了很多問題。下面我就說一下我的一些總結。【程式碼執行沒問題】

附:如果覺得scapy處理大檔案偏慢,希望能夠更加快速的遍歷pcap檔案,可以看我的這篇部落格:

python3安裝scapy【僅供參考】:

首先匯入包

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)#這裡是進行讀

希望能夠多多交流!