使用python依次比較兩個pcap文件中的每個報文

#coding=UTF-8
#author="劉一凡"
#date=20190826
'''
程序功能
依次比較兩個pcap文件中的每個報文。如果報文不同,則輸出不相同的字節的偏移量
文件長度不同,報文長度不同時,給出提示。但是也進行比較。直到有一個文件沒有內容了
使用方法:
將要比較的文件名賦值給變量file1和file2
'''

file1 = "pim1.pcap"
file2 = "pim3.pcap"

PCAP_HEADER_LENGTH = 24
PCAP_RECORD_HEADER_LENGTH = 16
FRAME_LENGTH_OFFSET =8 

import struct

#以二進制模式打開文件,返回<class '_io.BufferedReader'>對象
pcap_file1 = open(file1,'rb')
#返回<class 'bytes'>對象
file_data1 = pcap_file1.read()
offset1 = PCAP_HEADER_LENGTH

pcap_file2 = open(file2,'rb')
file_data2 = pcap_file2.read()
offset2 = PCAP_HEADER_LENGTH

same_flag = True

if len(file_data1)!=len(file_data2):
    same_flag = False
    print("兩個文件長度不同!")
    print("{}長度爲{}字節".format(file1,len(file_data1)))
    print("{}長度爲{}字節".format(file2,len(file_data2)))
else:
    print("兩個文件長度相同,爲{}字節".format(len(file_data1)))
print("")

frame_count=1

while(1):
    print("比較第{}個報文:".format(frame_count))
    #Format Character是'I',表示unsigned int
    frame_length1 = struct.unpack('I',file_data1[offset1+FRAME_LENGTH_OFFSET:offset1+FRAME_LENGTH_OFFSET+4])[0]
    frame_length2 = struct.unpack('I',file_data2[offset2+FRAME_LENGTH_OFFSET:offset2+FRAME_LENGTH_OFFSET+4])[0]
    frame_data1 =  file_data1[offset1+PCAP_RECORD_HEADER_LENGTH:offset1+PCAP_RECORD_HEADER_LENGTH+frame_length1]
    frame_data2 =  file_data2[offset2+PCAP_RECORD_HEADER_LENGTH:offset2+PCAP_RECORD_HEADER_LENGTH+frame_length2]
    if frame_length1 != frame_length2:
        same_flag = False
        print("報文長度不相同")
        print("{}中這個報文長度爲{}".format(file1,frame_length1))
        print("{}中這個報文長度爲{}".format(file2,frame_length2))
    if frame_data1 != frame_data2:
        same_flag = False
        print("報文內容不相同,不相同的字節偏移量爲")
        for i in range(frame_length1 if frame_length1<=frame_length2 else frame_length2):
            if frame_data1[i]!=frame_data2[i]:
                print(i,end=" ")
        print("")
    else:
        print("報文內容相同")        
    offset1 +=  PCAP_RECORD_HEADER_LENGTH + frame_length1
    offset2 +=  PCAP_RECORD_HEADER_LENGTH + frame_length2    
    frame_count+=1
    
    if offset1 >= len(file_data1):
        print("{}解析完成,停止比較".format(file1))
        break
    if offset2 >= len(file_data2):
        print("{}解析完成,停止比較".format(file2))
        break
        
pcap_file1.close() 
pcap_file2.close() 

print('')
print("最終結論:整體來說報文內容",end="")
if same_flag:
    print("相同")
else:
    print("不相同")
'''
輸出舉例:
輸出舉例1:
兩個文件長度不同!
vrrp.pcap長度爲1620字節
pim1.pcap長度爲344字節

比較第1個報文:
報文內容不相同,不相同的字節偏移量爲
5 8 9 10 11 14 15 19 20 22 23 24 25 26 27 28 29 33 34 35 36 37 38 39 40 41 42 43 44 45 46 50 53 54 55 56 57 58 59 
比較第2個報文:
報文長度不相同
vrrp.pcap中這個報文長度爲60
pim1.pcap中這個報文長度爲68
報文內容不相同,不相同的字節偏移量爲
5 8 9 10 11 15 17 18 19 22 23 24 25 26 27 28 29 33 34 36 37 40 41 42 43 44 45 47 51 53 55 56 57 58 59 
比較第3個報文:
報文長度不相同
vrrp.pcap中這個報文長度爲60
pim1.pcap中這個報文長度爲68
報文內容不相同,不相同的字節偏移量爲
5 8 9 10 11 15 17 18 19 22 23 24 25 26 27 28 29 33 34 36 37 40 41 42 43 44 45 47 51 53 55 56 57 58 59 
比較第4個報文:
報文內容不相同,不相同的字節偏移量爲
5 8 9 10 11 14 15 19 20 22 23 24 25 26 27 28 29 33 34 35 36 37 38 39 40 41 42 43 44 45 46 50 53 54 55 56 57 58 59 
pim1.pcap解析完成,停止比較

最終結論:整體來說報文內容不相同


輸出舉例2:
兩個文件長度相同,爲344字節

比較第1個報文:
報文內容相同
比較第2個報文:
報文內容相同
比較第3個報文:
報文內容相同
比較第4個報文:
報文內容相同
pim2.pcap解析完成,停止比較

最終結論:整體來說報文內容相同

輸出舉例:3
兩個文件長度相同,爲344字節

比較第1個報文:
報文內容不相同,不相同的字節偏移量爲
0 
比較第2個報文:
報文內容相同
比較第3個報文:
報文內容不相同,不相同的字節偏移量爲
18 
比較第4個報文:
報文內容不相同,不相同的字節偏移量爲
59 
pim1.pcap解析完成,停止比較

最終結論:整體來說報文內容不相同

'''

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章