以太網幀解析并保存成解析的數據
# -*- coding: UTF-8 -*-
import dpkt
import collections #有序字典需要的模塊
import time
import PySimpleGUI as sg
import os
class Pcap_analyze:
def __init__(self, ethpackge):
self.ethpackge = ethpackge
def pacpfile_del(self, inputfile):
fr = open(inputfile , 'rb')
self.ethpackge = dpkt.pcap.Reader(fr)
outputfile = "can_mirror_count"
all_pcap_data = collections.OrderedDict()
all_pcap_data_hex = collections.OrderedDict()
number = 0
for (ts, buf) in self.ethpackge:
try:
eth = eth = dpkt.ethernet.Ethernet(buf)
if not isinstance(eth.data, dpkt.ip.IP):
continue
ip = eth.data
if not isinstance(ip.data, dpkt.udp.UDP):
continue
udp_data = eth.data.data
if not len(udp_data.data):
continue
all_pcap_data[ts] = eth.data.data.data
all_pcap_data_hex[ts] = eth.data.data.data.hex()
number += 1
except Exception as err:
print("[error] %s" % err)
fr.close()
test_ts = 0
a = 0
file1 = open(outputfile+'.csv','w')
for ts, app_data in all_pcap_data.items():
counter_number = all_pcap_data_hex[ts][28:32]
header = all_pcap_data_hex[ts][0:10]
if str(counter_number) != '' and udp_data.sport == 50017 and \
udp_data.dport == 50018 and header == '0000018e00':
tmp = int(str(counter_number), 16) - a
s1 = str(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(ts)) ) + " : ," + \
str(header) + "," + str(len(app_data)) + ", counter_number ," + counter_number \
+ " " + str(int(str(counter_number), 16)) + "," + str(tmp) +"\n"
# print(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(ts)) ,":",len(app_data),", counter_number %s" % int(str(counter_number), 16) )
file1.write(s1)
a = int(str(counter_number), 16)
test_ts=ts
file1.close()
print("總UDP數量 %s" % number)
print("\n最后一個包負載的十六進制******\n%s"%all_pcap_data_hex[test_ts])
def windows(self):
sg.theme('Light Brown 1') # please make your windows colorful
layout = [
[sg.Text('你選擇的文件是:',font=("宋體", 10)),sg.Text('',key='text1',size=(50,1),font=("宋體", 10))],
[sg.Text('程序運行記錄',justification='center')],
[sg.Output(size=(70, 20),font=("宋體", 10))],
[sg.FileBrowse('打開文件',key='folder',target='text1'), sg.Button('數據處理'), sg.Button('關閉')]
]
window = sg.Window('PCAP統計can_mirror : ', layout,font=("宋體", 15),default_element_size=(50,1))
while True:
event, values = window.read()
if event == '關閉' or event == sg.WIN_CLOSED: # 如果用戶關閉窗口或點擊`關閉`
break
if event == '數據處理':
if values['folder']:
print('{0}正在分析原文件{0}'.format('*'*10))
self.pacpfile_del(values['folder'])
print('{0}數據處理完畢{0}'.format('*'*10))
else:
print('請先選擇文件')
window.close()
if __name__ == '__main__':
deal_data = Pcap_analyze('can_mirror')
deal_data.windows()
完整的應用:
功能: 解析pcap報文,解析出需要的payload報文,并分析其中的數據書否丟幀
方法:
1.pacp的解析
2.窗口的創建
使用:
直接調用方法2,通過人機交互界面完成所有操做,無需輸入任何參數
如圖:

輸出:
1.解析的文件
2.最后一幀的報文
3.總的UDP幀數的統計
浙公網安備 33010602011771號