wireshark通过Lua脚本解析自定义协议--Apple的学习笔记

一,前言

分析以太网数据很很多种方法,比如网络调试助手,比如wireshark,10年前我就玩过wireshark,当时为了学习tcpip协议分析报文,而本次的目的是分析udp中的自定义协议,基于网络调试助手保存的字符串通过python解析为excel已经完成了,但是我还是想玩下wireshark添加插件的方式来解析自定义协议。

二,调研

几年前我就想基于wireshark来做Doip的解析插件,不过后来没空,只是了解到有c++和Lua语言的插件。c++需要安装各种环境来使用,而Lua脚本就比较容易。但是具体Lua的接口是什么我都不清楚,所以本次选择Lua来重点研究,没想到百度一下很顺利找到了wireshark的Lua插件使用方法。

三,尝试用Lua语言制作插件

主要就是协议名称,字段定义,显示分支添加及绑定字段

my_proto = Proto("MYPRO","MY Protocol")
-- 第一个参数用于过滤器的字段,第二个是数据显示时的名称,第三个是数据类型
flag1 = ProtoField.uint16("myproto.flag1", "flag1", base.HEX)
flag2 = ProtoField.uint16("myproto.flag2", "flag2", base.HEX)
data = ProtoField.uint8("myproto.data", "data", base.HEX)
floatTest = ProtoField.float("myproto.floatdata", "floatdata")
-- 声明协议的字段
my_proto.fields = {
    flag1,
    flag2,
    data,
    floatTest
}


function my_proto.dissector(buffer,pinfo,tree)
    if buffer:len() == 0 then return end
    
    pinfo.cols.protocol = my_proto.name
    local subtree = tree:add(my_proto,buffer(),"my protocol data")
    -- 解析分支
    --local head_st = subtree:add(my_proto, buffer(), "header")
    local payload_st = subtree:add(my_proto, buffer(), "payload")
    
    -- 根据字段大小,添加到子树
    payload_st:add_le(flag1, buffer(12,2)) --little-endian,从0位置解析4个字节
    payload_st:add_le(flag2, buffer(14,2))
    
    -- 解析成具体的类型提示追加在字段后面
    payload_st:add_le(data, buffer(15,1))
    payload_st:add_le(floatTest, buffer(16,4))

end

local udp_port = DissectorTable.get("udp.port")
udp_port:add(30000,my_proto)

四,效果

image.png

五,小结

不需要精通Lua脚本,只要基于框架了解简单语法进行修改,就能实现从那么多数据中选择关键数据直接解析,直接观察,效果已经达到了,又掌握了一项提高工作效率的技能。
方法越多,效率越高,不想求人,就得自己掌握所有环节,摆脱一切依赖项,减少障碍,做事的时候可以一路畅通,这也是我学习各种技能的动力之一,哈哈~

你可能感兴趣的:(wireshark通过Lua脚本解析自定义协议--Apple的学习笔记)