• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

thtrll

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

以太网帧解析并保存成解析的数据

# -*- 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帧数的统计

posted on 2021-11-24 13:36  thtrll  阅读(220)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3