wirshark解析自定义协议,并且从自定义协议截取部分字段保存文件

博客介绍了两项信息技术操作,一是用Wireshark解析自定义协议,二是在工具菜单添加项目,提取自定义协议中的payload并保存为原始数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.将自定义协议由wirshark解析

--myprotocol.lua

do
	local p_my_proto = Proto("mw", "mw")
	
	--定义header头的结构
	local f_header_id = ProtoField.uint8("id", "id", base.HEX) --头id 4字节
	--local f_header = ProtoField.uint8("my_proto.header","header", base.HEX)
	local f_header = ProtoField.bytes("header","header", base.DOT)
	local f_reserve = ProtoField.bytes("reserve","reserve", base.DOT) -- 保留字,4字节
	local f_data = ProtoField.bytes("payload", "payload",base.NONE) --h265 payload
	
	p_my_proto.fields = {f_header_id, f_header, f_reserve, f_data}
	
	--获取data解析器
	local data_dis = Dissector.get("data")
	
	local function mlw_dissector(buf, pkt,root)
		local buf_len = buf:len()
		if buf_len < 16 then return false end
		
		--自定义各个字段的长度
		local len_header_id = 4
		local len_reserve = 4
		local len_header = 24
		local len_data = buf_len-len_header_id-len_header-len_reserve
		local v_header_id = buf(0,len_header_id)
		
		--判断起始码是否符合
		if(v_header_id:uint()~=0x4d583144)
		then return false end
		
		--把data中的buf,放入对应的字段中
		local start_pos = len_header_id
		local v_header = buf(start_pos,len_header)
		start_pos = start_pos + len_header
		local v_reserve = buf(start_pos,len_reserve)
		start_pos = start_pos + len_reserve
		local v_data = buf(start_pos, len_data)
		
		--buf关联自定义的协议
		local t = root:add(p_my_proto, buf)
		
		pkt.cols.protocol = "mw"
		t:add(f_header_id, v_header_id)
		t:add(f_header, v_header)
		t:add(f_reserve, v_reserve)
		t:add(f_data, v_data)
		return true
	end
	
	--当目标符合要求时,自动显示
	function p_my_proto.dissector(buf, pkt, root)
		if mlw_dissector(buf, pkt, root) then
		else
			--当不是自己的协议,调用data
			data_dis:call(buf, pkt, root)
		end
	end
	
	local udp_encap_table = DissectorTable.get("udp.port")
	udp_encap_table:add(5061, p_my_proto)
end

2.通过在工具菜单下,加入一个菜单项目,将自定义协议中的payload提取后,保存为原始数据

--[[
	myprotocol_extractor.lua	
	从自定义的协议中,取出payload字段,写入文件中
 *]]
 
 
do
    local mw_payload = Field.new("payload")
    
    local function extract_h265_from_mw()
        local function dump_filter(fd)
            local fh = "mw";
            if fd ~= nil and fd ~= "" then
                return string.format("%s and (%s)", fh, fd)
            else    
                return fh
            end
        end

	--Listener用来设置一个监听条件,当条件发生时,执行定义的动作
        local mw_tap = Listener.new("ip", "mw")
        local text_window = TextWindow.new("mlw extractor")
        local fp = io.open("dump.h265", "wb")
        local seq_payload_table = { }
        local packet_count = 0
        local max_packet_count = 0;
        local pass = 0;
    
        local function log(info)
            text_window:append(info)
            text_window:append("\n")
        end
        
        local function remove() 
            if fp then 
                fp:close()
                fp = nil
            end
            mw_tap:remove()
        end
		
        local function on_opus_payload(seq, payload)
            table.insert(seq_payload_table, { key = tonumber(seq.value), value = payload.value })
        end
        
        
        function mw_tap.packet(pinfo, tvb)
            local payloadTable = { mw_payload() } 
            --local seqTable = { rtp_seq() }
            
            
            if pass == 0 then 
                for i, payload in ipairs(payloadTable) do
                    max_packet_count = max_packet_count + 1
                end
            else
                for i, payload in ipairs(payloadTable) do
					if payload.len < 20 then
						return
					end
					
                    packet_count = packet_count + 1
					local payload_data = payload.value --is ByteArray
					fp:write(payload_data:tvb()():raw())--把原始数据写到文件中
                end
                
            end 
        end
        
        function mw_tap.reset()
        end
		
        function mw_tap.draw() 
        end
        
        log("Start")
		
        text_window:set_atclose(remove)
        
        pass = 0
        retap_packets()
        log("phase 1 max_packet_count = "..tostring(max_packet_count))
        
        pass = 1
        retap_packets()
        
        log("End")
        
    end
  
    register_menu("Extract h265 stream from mw", extract_h265_from_mw, MENU_TOOLS_UNSORTED)
end

### 如何捕获和解析 MavLink 协议的数据 #### 捕获 MAVLink 数据 MAVLink 是一种轻量级的消息传递协议,广泛应用于无人机和其他航空电子设备之间。为了捕获 MAVLink 数据流,可以采用以下几种方法: 1. **通过串口捕获** 如果无人机与地面控制站之间的通信是基于串口连接的,则可以通过监听指定的串口号来获取原始数据帧。通常情况下,MAVLink 使用特定波特率(如 57600 或 115200)进行通信[^1]。 2. **网络接口捕获** 当 MAVLink 数据通过 UDP/TCP 进行传输时,可利用抓包工具(如 Wireshark)监控目标端口上的流量。Wireshark 支持解码 MAVLink 原始消息并显示其结构化内容[^2]。 3. **嵌入式开发板截取** 对于具备硬件访问权限的情况,在飞行控制器上运行自定义固件或者修改现有代码以记录所有进出的 MAVLink 报文也是一种可行方案。 #### 解析 MAVLink 数据 一旦成功捕获到了 MAVLink 的二进制字节序列之后就需要对其进行解释处理才能得到有用的信息: 1. **使用官方库解析** PX4 和 ArduPilot 等开源项目提供了成熟的 C/C++ 及 Python 版本的 MAVLink 库文件, 开发者可以直接调用它们完成初始化设置以及后续操作过程中的编码/解码工作. 以下是基于Python的一个简单例子展示如何加载预编译好的XML定义文件从而创建相应的对象实例来进行收发动作: ```python from pymavlink import mavutil # 创建mavlink链接 (假设UDP地址为localhost:14550) master = mavutil.mavlink_connection('udp:127.0.0.1:14550') while True: msg = master.recv_match(blocking=True) # 接受下一个可用的消息 if not msg: continue print(f"Received message {msg.get_type()}: ", end="") try: data_dict = dict(msg.to_dict()) for key,value in data_dict.items(): print(f"{key}={value},",end=" ") except Exception as e: pass finally: print("\n") ``` 上述脚本会持续读取消息直到程序终止,并打印每条接收到的消息类型及其字段值. 另外值得注意的是某些特殊标志位比如`LINK_NODE_STATUS`,它会在整个通讯链条里的各个节点处被周期性的更新并向外广播出去以便其他组件了解当前健康状况等等细节信息. ### 注意事项 - 不同版本间的兼容性问题可能会影响最终效果,请确认所使用的API是否匹配实际环境需求. - 安全因素考量下务必妥善保管私钥材料防止未授权方篡改指令造成严重后果.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值