You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何开发无端口绑定的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 23:24:23