`
aigo
  • 浏览: 2680904 次
  • 性别: Icon_minigender_1
  • 来自: 宜昌
社区版块
存档分类
最新评论

使用LUA编写WIRESHARK协议解析插件

阅读更多

原文:http://www.cnblogs.com/wendellyi/p/3475461.html

 

一、平台

 

操作系统:windows 7

 

wireshark:1.10.3

 

lua:5.1

 

 

 

二、准备

 

lua 语言基本语法,特别是关于表操作和循环

 

wireshark 文档,包括用户使用文档和开发者文档,这些在 wireshark 官方网站都能找到

 

 

 

三、开始

 

我们首先定义一个简单的协议,我们使用 C 语言的语法描述,

struct foo
{
    char protocol_type[16];     /* request response notify */
    char service_type[16];      /* 我们定义的各种服务类型 */
    unsigned int msg_len;       /* 消息体的长度 */
    char msg_content[0];        /* 消息体的内容,由于是变长的所以采用此方法定义 */
};

 

现在可以让我们使用 lua 定义一个最基本的框架

do
    --[[
        创建一个新的协议结构 foo_proto
        第一个参数是协议名称会体现在过滤器中
        第二个参数是协议的描述信息,无关紧要
    --]]
    local foo_proto = Proto("foo", "Foo Protolcol")
    
    --[[
        下面定义字段
    --]]
    local foo_protocol_type = ProtoField.string("foo.prototype", "Protocol Type", base.NONE)
    local foo_service_type = ProtoField.string("foo.servicetype", "Service Type", base.NONE)
    local foo_msg_len = ProtoField.uint32("foo.msglen", "Message Length", base.DEC)
    local foo_msg_content = ProtoField.string("foo.msgcontent", "Message Content", base.NONE)
    
    -- 将字段添加都协议中
    foo_proto.fields = {
        foo_protocol_type,
        foo_service_type,
        foo_msg_len,
        foo_msg_content
    }
    
    --[[
        下面定义 foo 解析器的主函数,这个函数由 wireshark调用
        第一个参数是 Tvb 类型,表示的是需要此解析器解析的数据
        第二个参数是 Pinfo 类型,是协议解析树上的信息,包括 UI 上的显示
        第三个参数是 TreeItem 类型,表示上一级解析树
    --]]
    function foo_proto.dissector(tvb, pinfo, treeitem)
        
        -- 设置一些 UI 上面的信息
        pinfo.cols.protocol:set("FOO")
        pinfo.cols.info:set("Foo Protocol")
        
        local offset = 0
        local tvb_len = tvb:len()
        
        -- 在上一级解析树上创建 foo 的根节点
        local foo_tree = treeitem:add(foo_proto, tvb:range(offset))
        
        -- 下面是想该根节点上添加子节点,也就是自定义协议的各个字段
        -- 注意 range 这个方法的两个参数的意义,第一个表示此时的偏移量
        -- 第二个参数代表的是字段占用数据的长度
        foo_tree:add(foo_protocol_type, tvb:range(offset, 16))
        offset = offset+16        
        foo_tree:add(foo_service_type, tvb:range(offset, 16))
        offset = offset+16
        foo_tree:add(foo_msg_len, tvb:range(offset, 4))
        offset = offset+4
        
        -- 计算消息内容的长度
        local foo_content_len = tvb_len-offset
        foo_tree:add(foo_msg_content, tvb:range(offset, foo_content_len))
        offset = offset+foo_content_len
        
    end
    
    -- 向 wireshark 注册协议插件被调用的条件
    local tcp_port_table = DissectorTable.get("tcp.port")
    tcp_port_table:add(12345, foo_proto)
end

 

 

四、扩展

 

(1)单 TCP 分节多应用 PDU

 

这种情况可以在我们的协议解析函数中使用循环解决,但是应用层 PDU 一般都需要有我们自定义的分割标识符,不然无法区分,这里我们使用协议尾端标记的方式,采用0xFF分割,这里我们假设我们的协议体中不会出现这个值,也就是我们的消息体长度字段的值不会出现这个值。

 

(2)单应用 PDU 多 TCP 分节

 

这种情况就需要 wireshark 为我们重新拼接被 TCP 协议栈拆分的数据,不过这已经有接口可用了,下面是处理两种情况的框架

do
    -- 这里便于运算需要将数据类型进行转换
    local tvbrange = tvb:range(0)
    local bytearray = tvbrange:bytes()
    local offset = pinfo.desegment_offset or 0
    
    while true do
        local pdu_flg = false
        local pdu_end_index = 0
        
        -- ByteArray 类型的索引与 C 类似
        -- 这与 lua 本身处理表的方式有所区别
        for i = offset, tvb_len do
            if 0xFF == bytearray:get_index(i) then
                pdu_flg = true
                pdu_end_index = i
            end
        end
        
        -- 如果没有找到 PDU 的结束符,进行合包延迟解析
        if false == frame_end_flg then
            -- 如果明确知道这个应用协议还需要多少字节
            -- 可以明确地将需要的值填上,而不是使用下面的值
            -- 只是表示需要更多的分节
            pinfo.desegment_len = DESEGMENT_ONE_MORE_SEGMENT
            return
        end
        
        -- 下面是正常的处理流程,在上面的代码中已经有体现了
        -- 不过此时协议最大边界为 pdu_end_index
        
    end
end

 

 

五、完善

 

(1)谈到网络协议,如果涉及到整数必然会有字节序的问题,如果 wireshark 默认使用的是大端字节序,如果协议中的整数采用的是小端字节序,那么请考虑使用 TreeItem 类型的 le_add() 方法替代 add() 方法。

 

(2)在 add 和 le_add 方法中,我们可以显式设定我们自己的值,可以给 add 方法传递第三个值,例如,

local protocol_type = tvb:range(offset, 16):string()
foo_tree:add(foo_protocol_type, tvb:range(offset, 4), protocol_type)

 

这样显示的就是 protocol_type 的内容,另外这里的 protocol_type 类型一定要与上面定义 foo_protocol_type 让 wireshark 解析的一致,不然这个值是无效的,也就是说这个地方 protocol_type 如果是整数,就是无效,反过来也是一样。

 

(3)在协议解析树上增加节点不一定要提前定义字段,也就是字段的定义不是必须的,例如,

local protocol_type = tvb:range(offset, 16):string()
foo_tree:add(tvb:range(offset, 16), "Protocol Type: " .. protocol_type)

 

效果是一样的,但是在过滤器中无法使用此字段。

 

(4)pinfo.cols.info:set 方法可以延迟调用,也就说可以在确定了消息的各种属性之后在调用,这样可以更清晰的显示协议的摘要。

 

 

 

六、参考

 

(1)wireshark 用户手册,在 wireshark 的安装目录下有 chm 的版本,最值得参考的是第11章的数据类型和各种方法的解释。

 

(2)重组被拆分的 TCP 分节,http://stackoverflow.com/questions/13138088/how-do-i-reassemble-tcp-packet-in-lua-dissector

 

(3)处理一个分节多应用 PDU,http://stackoverflow.com/questions/14387426/reassembling-packets-in-a-lua-wireshark-dissector

 

(4)调用子协议的方法,http://blog.csdn.net/phunxm/article/details/5972904

分享到:
评论

相关推荐

    使用Lua脚本为wireshark编写自定义通信协议解析器插件

    使用Lua脚本为wireshark编写自定义通信协议解析器插件 .

    用lua语言编写Wireshark插件解析自定义协议.doc

    本文主要介绍了使用 Lua 语言编写 Wireshark 插件来解析自定义协议的方法。Wireshark 是一个功能强大且广泛使用的网络协议分析软件,但是它默认情况下只支持大量的通用协议,对于自定义协议则无能为力。本文介绍了一...

    wireshark 包解析插件

    即当wireshark不能及时解析一些新的协议时,可以自己动手根据新协议字段编写解析文件。有新协议的话可以基于此脚本改写. 使用方法: 1. 打开wireshark根目录中的init.lua文件, 将disable_lua=false 并在最后添加...

    用Wireshark解析自定义协议

    本主题将深入探讨如何使用Wireshark解析自定义协议,以portal协议为例,并结合LUA脚本来进行深入解释。 首先,让我们了解什么是自定义协议。在通信领域,自定义协议是为特定应用或系统设计的通信规则,不同于标准的...

    wireshark使用Lua编写dissector

    ### 使用Lua编写Wireshark Dissector #### 引言 Wireshark是一款广泛使用的网络协议分析工具,能够捕获和解析各种类型的网络流量。对于高级用户而言,Wireshark提供了强大的扩展功能,允许用户通过自定义插件来解码...

    wireshark Lua脚本插件源码

    在这个压缩包文件中,包含了一个使用Lua编写的Wireshark插件源码,以及一个相关的.pcap抓包文件,让我们来深入探讨一下这些内容。 首先,`ScoreBoard.lua`是Lua脚本文件,很可能用于解析特定的私有协议。在...

    wireshark GPON OMCI报文解析lua

    Wireshark支持使用Lua语言编写自定义解码器,以解析非标准或复杂的网络协议。通过Lua,我们可以对原始报文数据进行深入解析,提取出有意义的信息,如OMCI消息类型、MEI(Managed Entity Identifier,管理实体标识)...

    Wireshark+lua插件方式抓包及解析OMCI协议报文详细信息

    在Wireshark中使用Lua插件解析OMCI协议,可以帮助我们深入理解报文结构,有效地捕获和分析OMCI相关的网络流量。以下是使用Wireshark + Lua实现这一功能的详细步骤和知识点: 1. **安装Wireshark**:首先确保你已经...

    wireshark解析omci报文脚本

    Lua是一种轻量级的脚本语言,Wireshark允许用户使用Lua编写自定义解码器来扩展其功能。omci.lua脚本包含了OMCI报文结构的解析逻辑,可以将原始数据转换为可读性强的人类可理解的形式。 安装omci.lua脚本的方法通常...

    bmp-dissector:由lua编写的用于wireshark的BGP监控协议(BMP)解析器

    由 lua 编写的用于wireshark的BGP监控协议(BMP)解析器。 参考 用法 视窗 注释掉“%WIRESHARK%\init.lua”中的“disable_lua=true”。 (大概配置) bmp.lua 复制到“%WIRESHARK%\plugins\<version>\”或“%APP...

    wireshark从RTP包中提取出H264裸流数据脚本

    提供的两个脚本文件——`rtp_h264_export.lua` 和 `rtp_h265_export.lua`,很可能是为了解决这个问题而编写的自定义解码器或者插件。这些Lua脚本可以扩展Wireshark的功能,使其能够识别并提取出H264和H265的原始流...

    Wireshark:添加一个基础的解析器

    Wireshark解析器开发基础知识 Wireshark是一款功能强大的网络协议分析工具,它提供了一个强大的插件机制,允许开发者创建自己的协议解析器。下面我们将逐步设计一个基础的解析器,从而了解Wireshark解析器的开发...

    Wireshark网络抓包工具自定义解析器

    5. **集成与分享**:一旦你的自定义解析器运行稳定,可以考虑将其贡献给Wireshark社区,或者封装成插件供其他人使用。这将有助于提高Wireshark对更多协议的支持,并且能让你的解决方案被更广泛的用户群体所利用。 6...

    wireshark linux

    - 脚本语言支持:通过Lua或Python接口,可以编写自定义脚本,增强Wireshark的功能。 总之,Wireshark在Linux系统中是不可或缺的网络诊断和分析工具,无论是排查网络问题,还是进行网络安全研究,都发挥着重要作用...

    wireshark中文手册

    - 解析器插件:Wireshark支持扩展,用户可以根据需要编写或安装第三方解析器插件。 - 脚本支持:Wireshark可以通过lua脚本进行自动化分析和处理。 - 抓包文件导出:可以将捕获的数据包保存为pcapng或pcap格式,供...

    SMGP解码器 for Wireshark

    SMGP解码器是Wireshark的一个插件,专门用于解析和理解SMGP协议的数据包。 **SMGP协议** SMGP协议是基于TCP/IP的,设计用于在短信中心(SMSC, Short Message Service Center)之间以及SMSC与业务平台之间交换短信...

    dissectors:Wireshark解剖器

    2. 使用Lua编写解剖器:通过Lua,开发者可以创建自定义解剖器来解析特定的协议或者增强已有解剖器的解析能力。这通常涉及定义协议字段、处理数据包、设置颜色规则以及生成解剖显示。 三、解剖器的开发和调试 1. ...

    atlas:用于 ATLAS TDAQ 协议的 Wireshark 解剖器

    这可以通过编写 Lua 后解析器或超出本解析器范围的其他技术来解决。 改进解剖器连接到 Wireshark 的方式。 目前,它基本上取代了标准的 TCP 解析器,因为它在设置为 6 时使用ip.proto字段。 可以使用 TCP 端口号...

    Ethereal开发帮助资源

    开发者可以使用这些API编写插件,实现对新协议的支持或对已有功能的增强。 5. **编译与调试**:在开发过程中,开发者需要了解如何配置编译环境,编译源代码,并使用调试工具如GDB进行问题定位。 6. **图形用户界面...

Global site tag (gtag.js) - Google Analytics