如何开发无端口绑定的Profinet Wireshark Lua解析器提取特定位
PROFINET IO Cyclic层Lua解析器实现方案
Wireshark已注册的协议都会暴露对应的解析器表,不需要绑定TCP/UDP端口即可挂载,PROFINET IO Cyclic Service Data Unit对应的解析器表名为pn_io.cyclic.sdu,可以直接通过表名挂载自定义解析逻辑。
快速定位任意协议挂载点的方法:选中抓包内的目标协议层,打开菜单栏
分析->关于当前协议,弹窗中标注的Dissector table就是可直接挂载的解析表名,无需依赖端口、以太网类型等传输层标识。
方案1:链式解析器(推荐)
链式解析器会嵌入原有协议解析流程,解析结果和原生PROFINET内容展示在同一协议树,不会破坏原有解析逻辑,以下代码实现提取该层起始位置算起第5个字节最后3比特的功能(字节计数从1开始,对应代码内偏移量为4):
-- 定义自定义协议 local pn_cyclic_parser = Proto("pn_cyclic_custom", "自定义PROFINET Cyclic字段解析") -- 定义目标提取字段:掩码0x07对应二进制00000111,匹配单字节最后3个比特位 local f_last3bits = ProtoField.uint8( "pn_cyclic_custom.last3bits", "第5字节最后3比特值", base.DEC, nil, 0x07 ) pn_cyclic_parser.fields = {f_last3bits} -- 解析主逻辑 function pn_cyclic_parser.dissector(buf, pinfo, tree) -- 长度校验,避免访问越界 if buf:len() < 5 then return end -- 在协议树添加自定义节点 local custom_tree = tree:add(pn_cyclic_parser, buf(), "自定义提取字段") -- 提取偏移为4位置的1字节数据(即第5个字节),自动通过掩码取最后3比特 custom_tree:add(f_last3bits, buf(4, 1)) -- 调用原有PROFINET Cyclic解析器,保留原生解析结果 local original_pn_dissector = Dissector.get("pn_io_cyclic_sdu") if original_pn_dissector then original_pn_dissector:call(buf, pinfo, tree) end end -- 挂载到PROFINET IO Cyclic SDU解析表,无需绑定端口 local pn_dissector_table = DissectorTable.get("pn_io.cyclic.sdu") pn_dissector_table:add(0, pn_cyclic_parser)
方案2:Post-dissector(轻量字段提取场景用)
如果只需要额外提取字段、不需要修改原有解析流程,可以用后解析器,在所有原生协议解析完成后再运行提取逻辑:
local pn_post_parser = Proto("pn_cyclic_post", "PROFINET Cyclic后解析器") local f_last3bits = ProtoField.uint8( "pn_cyclic_post.last3bits", "第5字节最后3比特值", base.DEC, nil, 0x07 ) pn_post_parser.fields = {f_last3bits} function pn_post_parser.dissector(buf, pinfo, tree) -- 获取已解析完成的PROFINET Cyclic SDU层数据 local pn_sdu = Field.new("pn_io.cyclic.sdu") local sdu_buf = pn_sdu().tvb if not sdu_buf or sdu_buf:len() < 5 then return end local post_tree = tree:add(pn_post_parser, "自定义后提取字段") post_tree:add(f_last3bits, sdu_buf(4, 1)) end -- 注册为后解析器,自动对所有报文生效 register_postdissector(pn_post_parser)
使用步骤
- 将选中的代码保存为后缀
.lua的插件文件 - 打开Wireshark,进入
帮助->关于Wireshark->文件夹,找到个人Lua插件目录,将文件放入该目录 - 按快捷键
Ctrl+Shift+L重载Lua插件,或直接重启Wireshark即可生效 - 生效后可直接在协议树查看提取的字段,也可通过过滤表达式
pn_cyclic_custom.last3bits(链式解析器)或pn_cyclic_post.last3bits(后解析器)筛选对应报文。

内容的提问来源于stack exchange,提问作者maximusboscus
相关产品推荐
相关产品推荐

