本周我们共同学习了lua语言与编写wireshark插件的知识,并且按照微信读书上的教程,编写了一个可以识别foo报文租的小插件。
一、lua语言的学习
local foo=Proto("foo","Foo Protocol") Trans_ID=ProtoField.uint16("foo.ID","ID") Msg_Type=ProtoField.uint16("foo.Type","Type") Msg_Data=ProtoField.uint32("foo.Data","Data") foo.fields={Trans_ID,Msg_Type,Msg_Data} function foo.dissector(tvb,pinfo,tree) pinfo.cols.protocol="foo" local subtree=tree:add(foo,tvb(0)) subtree:add(Trans_ID,tvb(0, 2)) subtree:add(Msg_Type,tvb(2, 2)) subtree:add(Msg_Data,tvb(4, 4)) end DissectorTable.get("tcp.port"):add(10001,foo)
1.协议定义:
local foo = Proto("foo", "Foo Protocol")
此行定义了一个名为"foo"的新协议,并在Wireshark中显示为"Foo Protocol"。
2.协议字段:
Trans_ID = ProtoField.uint16("foo.ID", "ID") Msg_Type = ProtoField.uint16("foo.Type", "Type") Msg_Data = ProtoField.uint32("foo.Data", "Data")
这些行定义了三个协议字段(Trans_ID
、Msg_Type
和Msg_Data
),并指定了它们的类型和名称。
3.协议字段分配:
foo.fields = {Trans_ID, Msg_Type, Msg_Data}
此行将先前定义的字段分配给协议foo
。
4.解析器函数:
function foo.dissector(tvb, pinfo, tree) pinfo.cols.protocol = "foo" local subtree = tree:add(foo, tvb(0)) subtree:add(Trans_ID, tvb(0, 2)) subtree:add(Msg_Type, tvb(2, 2)) subtree:add(Msg_Data, tvb(4, 4)) end
此函数是协议foo
的解析器函数。它将协议列(pinfo.cols.protocol
)设置为"foo",然后在协议树中添加子树,并添加字段的值到相应的位置。
5.端口注册:
DissectorTable.get("tcp.port"):add(10001, foo)
此行将协议foo
注册到TCP端口10001,以便Wireshark能够使用此解析器来解析在该端口上捕获的数据。
二、wleshark插件的撰写
-- 定义新协议 local course_protocol = Proto("CourseDesign", "课程设计: Seq=0即通信建立") -- 定义协议字段 local seq_number = ProtoField.uint32("CourseDesign.SeqNumber", "Sequence Number") -- 将字段添加到协议中 course_protocol.fields = {seq_number} -- 定义协议解析函数 function course_protocol.dissector(tvb, pinfo, tree) pinfo.cols.protocol = "CourseDesign" local subtree = tree:add(course_protocol, tvb(0)) -- 从TCP头中提取Seq字段 local seq_value = tvb(0, 4):uint() -- 添加Seq字段到协议树中 subtree:add(seq_number, tvb(0, 4)):set_text("Seq Number: " .. seq_value) -- 如果Seq等于0,则显示通信建立的提示信息 if seq_value == 0 then pinfo.cols.info:set("Communication Establishment: Seq=0") end end -- 注册协议 local tcp_port_table = DissectorTable.get("tcp.port") tcp_port_table:add(0, course_protocol)
这个代码是为了检测tcp握手协议中的第一次握手,但存在一些小问题,后续继续修改。
三、foo协议的撰写
本功能是通过一中的代码实现,能够定义一个foo协议,能抓取foo包。
四、总结
在本周的学习中,我们深入探讨了Lua语言和Wireshark插件编写的知识,通过编写一个能够识别foo报文的插件,掌握了协议定义、字段设置和解析器函数的编写。同时,通过另一个例子学到了提取TCP头中的Seq字段的方法,实现了对通信建立的提示信息的显示。这次学习为我们打开了网络协议分析的大门,为更深入的探索提供了坚实的基础。
标签:课程设计,进展,Data,add,第二周,Msg,foo,Type,tvb From: https://www.cnblogs.com/liTCabcAbc/p/17858125.html