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