是TC

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

本周我们共同学习了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_IDMsg_TypeMsg_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字段的方法,实现了对通信建立的提示信息的显示。这次学习为我们打开了网络协议分析的大门,为更深入的探索提供了坚实的基础。

 

posted on 2023-11-26 22:38  是TC  阅读(35)  评论(0)    收藏  举报