精华内容
下载资源
问答
  • WireBait:在没有Wireshark的情况下运行和测试Lua Wireshark解剖器或捕获数据
  • 2. 安装好wiresshark后的目录(**/**/Wireshark)下创建一个 lua 文件夹。把root3.0放在当前文件夹下 并解压 3. 在wiresshark目录下 init.lua 文件目录添加上一行 dofile(DATA_DIR.."lua/robotV3_0/robot.lua"&#...
  • Wireshark lua 插件简介

    千次阅读 2020-01-05 10:26:58
    简单介绍在使用lua插件过程中可能会遇到的一些问题以及解决办法

    在我的专栏《wireshark从入门到精通》前面的章节中,学习了wireshark UI界面的使用技巧,学习了命令行工具的使用方法。除此之外为了方便使用者的灵活定制,比如说按需批量修改报文,完成某种私有协议的解析等方面的功能。wireshark提供了lua插件的功能,扩展了对于wireshark的使用。当然像我在上一节源码概览那一部分所述那样,也是可以写C插件的。但是如果就完成某个功能而言,通常还是使用lua插件,因为其编写起来相对的容易,能够快速的完成特定的需求,本节对此功能先做一次简单的介绍,重点还是使用过程中可能出现的问题以及解决办法,具体的使用示例及API接口解释在后续章节会一一道来。

    首先wireshark对外提供了lua接口,因此插件脚本需要使用lua语言进行编写。为了支持对于lua的解释,wireshark集成了lua的解释器,如图1:
    在这里插入图片描述
    图1

    Lua这门语言是在巴西一所大学实验室里面基于C语言开发出来,具有了很多现代高级语言的特性,因此其使用起来非常的方便。如果有学习过java,python,js等高级语言,相信对于lua会很快的上手。由于Lua的小巧,高效,易扩展等特性,经常用于嵌入式等方面的开发,如C混合编程等。Lua的语言特性和语法规则不是本文所涉及的内容,相关内容可自行学习。本专栏主要是

    展开全文
  • lua语言编写Wireshark插件解析自定义协议
  • 基于Lua语言的wireshark插件编写

    千次阅读 2019-12-12 21:43:20
    想要开发wireshark插件,我们可以使用C语言也可以使用Lua语言。如下图,是使用两种语言开发插件的对比。 如上图,我最后选择使用Lua语言进行开发wireshark插件。 二、插件功能 目前我有一个任务,需要解析RTP包的...

    一、两种语言开发插件的对比

    • 想要开发wireshark插件,我们可以使用C语言也可以使用Lua语言。如下图,是使用两种语言开发插件的对比。在这里插入图片描述
    • 如上图,我最后选择使用Lua语言进行开发wireshark插件。

    二、插件功能

    • 目前我有一个任务,需要解析RTP包的payload,这个payload前三个字节是自定义的字节,后面的才是H264的数据、或者OPUS的数据。
    • 因此我需要在RTP包的上层进行解析RTP包的payload,并且让H264的数据按照H264的格式或者OPUS的格式来显示。在这里插入图片描述

    本篇博文重点介绍如何基于Lua语言去编写wireshark插件。

    • 具备的基础:
      1. Lua语言基础,可以去这个网站去学习简单的Lua语言基础。https://www.runoob.com/lua/lua-miscellaneous-operator.html
      2. 熟悉wireshark的使用,并且去浏览一下wireshark支持Lua语言的API。https://www.wireshark.org/docs/wsdg_html_chunked/lua_module_Proto.html
      3. 剩下的就只需要看一下我的这篇博文就好了

    三、Lua插件API介绍

    3.1 Proto
    • 表示一个新的Protocol,在Wireshark中Protocol对象有很多用处,解析器是其中主要的一个。主要接口有:
    接口说明
    proto:__call (name,desc)创建Proto对象。name和desc分别是对象的名称和描述,前者可用于过滤器等
    proto.nameget名称
    proto.fieldsget/set字段
    proto.prefsget配置项
    proto.init初始化,无参数
    proto.dissector解析函数,3个参数tvb,pinfo,tree,分别是报文内容,报文信息和解析树结构
    proto:register_heuristic (listname, func)为Proto注册一个启发式解析器,被调用时,参数func将被传入与dissector方法相同的3个参数
    • 如下的例子,创建一个新的协议
    local NAME1          = "red"
    local PORT           = 5004
    local RTP_PROTO_TYPE = 106
    local red    = Proto(NAME1, "Red Protocol")
    
    3.2 ProtoField
    • 表示协议字段,一般用于解析字段后往解析树上添加节点。根据字段类型不同,其接口可以分为两大类。

    • 整型:
      • ProtoField.{type} (abbr, [name], [desc],[base], [valuestring], [mask])
      type包括:uint8, uint16, uint24, uint32, uint64, framenum

    • 其他类型
      • ProtoField.{type} (abbr, [name], [desc])
      type包括:float, double, string, stringz, bytes, bool, ipv4, ipv6, ether,oid, guid

    • 这些接口都会返回一个新的字段对象。方括号内是可选字段,花括号内是可替换的类型字段。

    • 如下图的例子,

    -- create fields of red
    fields_M             = ProtoField.uint8 (NAME1 .. ".M", "M", base.HEX,Payload_type,0x80)
    fields_pt            = ProtoField.uint8 (NAME1 .. ".PT", "PT", base.DEC,Payload_type,0x7F)
    fields_seqno         = ProtoField.uint16(NAME1 .. ".seqno", "Sequence number")
    fields_h264bytes     = ProtoField.bytes(NAME1 .. ".bytes", "H264Data")
    fields_fec           = ProtoField.bytes(NAME1 .. ".fec", "FEC Payload")
    
    • 当添加这写字段后,我们看如下图的实际加载情况
      在这里插入图片描述
    3.3 Tvb
    • Tvb(Testy Virtual Buffer)表示报文缓存,也就是实际的报文数据,可以通过下面介绍的TvbRange从报文数据中解出信息。主要接口有:
    接口说明
    tvb:__tostring()将报文数据转化为字符串,可用于调试
    tvb:reported_len()get tvb的(not captured)长度
    tvb:len()get tvb的(captured)长度
    tvb:reported_length_remaining()获取当前tvb的剩余长度,如果偏移值大于报文长度,则返回-1
    tvb:offset()返回原始偏移
    • 我们最常使用应该就是“tvb:len()”
    3.4 Pinfo
    • 报文信息(packet information)。主要接口有:
    接口说明
    pinfo.len pinfo.caplenget报文长度
    pinfo.abs_tsget报文捕获时间
    pinfo.numberget报文编号
    pinfo.src pinfo.dstget/set报文的源地址、目的地址
    pinfo.columns pinfo.colsget报文列表列(界面)
    • 取得报文列表列后,就可以设置该列的文本,比如
        -- show protocol name in protocol column
        pinfo.cols.protocol = red.name
    

    在这里插入图片描述

    • 如上图所示,我们就可以将协议名称修改为RED。
    3.5 DissectorTable
    • 表示一个具体协议的解析表,比如,协议TCP的解析表”tcp.port”包括http,smtp,ftp等。可以依次点击wireshark菜单“Internals”、“Dissector tables”,来查看当前的所有解析表。如下图,我们选择 rtp.pt解析表在“Integer tables”选项卡中,顾名思义,它是通过类型为整型的 rtp 端口号来识别下游协议的:
      在这里插入图片描述
    • DissectorTable的主要接口有:
    • 接口说明
    接口说明
    DissectorTable.get(name)get名为name的解析表的引用
    dissectortable:add(pattern, dissector)将Proto或Dissector对象添加到解析表,即注册。pattern可以是整型值,整型值范围或字符串,这取决于当前解析表的类型
    dissectortable:remove(pattern, dissector)将满足pattern的一个或一组Proto、Dissector对象从解析表中删除

    四、代码框架

    -- create a new dissector
    local NAME = "red"
    local PORT = 5004
    local red = Proto(NAME, "Red Protocol")
    
    
    -- dissect packet
    function red.dissector (tvb, pinfo, tree)
    end
    
    -- register this dissector
    DissectorTable.get("udp.port"):add(PORT, red)
    
    • 如上图,就是整体的三部分式的代码框架,首先需要定义一个新协议,就是给这个新协议起一个新的名字。
    • 接下来,就是对这个新协议进行解析,在 red.dissector 这个函数中写我们解析这种包的逻辑。
    • 最后就是将这个新协议添加到 udp 这个已有协议的的底下,用端口号进行区分。在这里插入图片描述

    五、完善代码

    local version_str = string.match(_VERSION, "%d+[.]%d*")
    local version_num = version_str and tonumber(version_str) or 5.1
    local bit = (version_num >= 5.2) and require("bit32") or require("bit")
    
    -- create a new dissector to decode rtp private payload
    local NAME1          = "red"
    local PORT           = 5004
    local RTP_PROTO_TYPE = 106
    
    
    local red            = Proto(NAME1, "Red Protocol")
    
    -- create fields of red
    fields_M             = ProtoField.uint8 (NAME1 .. ".M", "M", base.HEX,Payload_type,0x80)
    fields_pt            = ProtoField.uint8 (NAME1 .. ".PT", "PT", base.DEC,Payload_type,0x7F)
    fields_seqno         = ProtoField.uint16(NAME1 .. ".seqno", "Sequence number")
    fields_h264bytes     = ProtoField.bytes(NAME1 .. ".bytes", "H264Data")
    fields_fec           = ProtoField.bytes(NAME1 .. ".fec", "FEC Payload")
    
    red.fields           = { fields_M, fields_pt, fields_seqno, fields_h264bytes,fields_fec }
    
    local RTP_dis        = Dissector.get("rtp")
    local H264_dis       = Dissector.get("h264")
    local Data_dis       = Dissector.get("data")
    
    
    -- dissect packet
    function red.dissector(tvb, pinfo, tree)
    	length = tvb:len()
    	if length == 0 then return end
        -- decode private header
        local subtree = tree:add(red, tvb(0,3))
    	subtree:add(fields_M, tvb(0,1))
    	subtree:add(fields_pt, tvb(0,1))
        subtree:add(fields_seqno, tvb(1,2))
    
        -- show protocol name in protocol column
        pinfo.cols.protocol = red.name
       	
    	local fec_id = tvb(0,1):uint()
    	local fec_type = bit.band(fec_id,0x7F)
    	if fec_type == 109 then 
    		tree:add(fields_fec,tvb(3))
    	else 
    		H264_dis:call(tvb(3):tvb(), pinfo, tree)
    	end 
    end
    
    
    --decode first layer  as rtp
    local udp_dissector_table = DissectorTable.get("udp.port")
    udp_dissector_table:set(PORT,RTP_dis)
    
    -- register this dissector
    -- DissectorTable.get("rtp.pt"):add(PORT, red)
    --decode private protocol layer  3-bytes private datas + standard h264
    local rtp_dissector_table = DissectorTable.get("rtp.pt")
    rtp_dissector_table:set(RTP_PROTO_TYPE,red)
    
    • 如上的代码就是扩展代码框架来正确达成我的目的的。
    • 我们可以根据不同的需求编写不同的解析代码。

    六、加载到wireshark中

    • 将Lua文件保存到wireshark的根目录下。比如:在这里插入图片描述
    • 然后在 wireshark 的根目录下找到 “init.lua” 文件。 打开它,使用记事本或者notepad++或者其他软件都可以。在这个文件的开头修改”enable_lua = true“,请参考这段代码上面的注释,不同版本可能不一样。
      在这里插入图片描述
    • 接下来在这个文件”init.lua“ 的最后将我们增加到wireshark根目录的Lua文件添加。如下图:在这里插入图片描述
    • 这个时候Lua文件就已经被嵌入到wireshark中了,有两种启动Lua插件的办法,要么就是重启wireshark,要么就是在wireshark的”分析“菜单下点击“重新载入Lua插件”。在这里插入图片描述

    七、后记

    • 我的整体代码放在我githup上了,链接:https://github.com/zhangyi-13572252156/Wireshark-Plug-In
    • 如果需要交流,欢迎交流。QQ:1251108673
    展开全文
  • Lua编写wireshark插件基础

    万次阅读 2018-08-08 10:02:53
    最近在做物联网流量分析时发现, App在使用MQTT协议时往往通过SSL+WebSocket+MQTT这种方式与服务器通信,在使用SSL中间人截获数据后,Wireshark不能自动解析出MQTT语义,只能解析到WebSocket层,如图所示。...

    一、背景

    最近在做物联网流量分析时发现, App在使用MQTT协议时往往通过SSL+WebSocket+MQTT这种方式与服务器通信,在使用SSL中间人截获数据后,Wireshark不能自动解析出MQTT语义,只能解析到WebSocket层,如图所示。虽然在Data域中显示了去掉mask的WebSocket数据,但分析起来mqtt仍然很难受。所以打算写一个插件,利用wireshark自带的MQTT解析功能来分析Data部分的数据,而不是自己从头写一个完全新的解析器。注:很多教程是教如何添加一个新的协议,如设置协议的属性等,推荐参考【2】,本文主要梳理编写插件的条理。

    二、Lua编写wireshark插件基础

     有前辈介绍了用Lua写wireshark插件的基础教程,可以参考文末【1】【2】,这里再以自己的理解总结一下,因为实在没有一个文档让我有从入门到精通的感觉。

    1. 首先需要知道解析器(Dissector)和post-dissectors的相关概念【3】

    1)解析器(Dissector)是用来被wireshark调用解析数据包或部分数据包的,需要以Proto对象的形式注册后才能被wireshark调用。同时,我们还可以使用wireshark已经自带的解析器,注册一个解析器的例子代码如下所示。

    -- trivial protocol example
    -- declare our protocol
    --trival是协议名字,后面是说明,均需要在wireshark中唯一。
    
    trivial_proto = Proto("trivial","Trivial Protocol")
    -- create a function to dissect it
    function trivial_proto.dissector(buffer,pinfo,tree)
        pinfo.cols.protocol = "TRIVIAL"
        local subtree = tree:add(trivial_proto,buffer(),"Trivial Protocol Data")
        subtree:add(buffer(0,2),"The first two bytes: " .. buffer(0,2):uint())
        subtree = subtree:add(buffer(2,2),"The next two bytes")
        subtree:add(buffer(2,1),"The 3rd byte: " .. buffer(2,1):uint())
        subtree:add(buffer(3,1),"The 4th byte: " .. buffer(3,1):uint())
    end
    -- load the udp.port table
    udp_table = DissectorTable.get("udp.port")
    -- register our protocol to handle udp port 7777
    udp_table:add(7777,trivial_proto)

    2)解析器注册分为很多种,可以使用函数register_postdissector(trivial_proto)注册为postdissectors,即在所有解析器执行完后执行;也可以在DissectorTable上注册,这样就可以使用wireshark自带的上一层协议解析后的结果。比如,协议TCP的解析表”tcp.port”包括http,smtp,ftp等。例如,你写的解析器想解析tcp端口7777上的某个协议,就使用下面的代码,而不必从tcp或者ip层开始解析。

    -- load the udp.port table
    udp_table = DissectorTable.get("udp.port")
    -- register our protocol to handle udp port 7777
    udp_table:add(7777, trivial_proto)

    这个功能非常强大。直观地,如果想解析WebSocket上的mqtt协议,可以这么写【6】(但是不知什么原因我这么写一直无法成功解析。):

    local mqtt_dissector = Dissector.get("mqtt")
    local ws_dissector_table = DissectorTable.get("ws.port")
    ws_dissector_table:add(8083, mqtt_dissector)

    通过上面这段代码我们学习到,直接获得wireshark中解析器的方法Dissector.get,更多的方法可以参考官方文档11章【7】,比如我们如何获得已经支持的所有协议呢?mqtt协议的解析器关键字是大写还是小写?可以这么写【8】:

    local t = Dissector.list()
    
    for _,name in ipairs(t) do
        debug(name)
    end
    
    --查看所有支持的table
    local dt = DissectorTable.list()
    
    for _,name in ipairs(dt) do
        debug(name)
    end

    3)被调用时,wireshark会传递给解析器三个参数:数据缓冲区(一个Tvb 对象【4】)、包的信息(Pinfo对象【5】)以及显示在图形化中的树形结构(TreeItem 对象 )。注意,理解这三个参数至关重要,同时注意它们不是Lua自身具有的数据类型,经常需要调用对象中的方法转换。通过这三个参数, 解析器就可以获得和修改包的相关信息。

    Tvb就是包的数据内容,可以像这样来提取内容。通常,我们需要提取出来包的内容当做字符串处理,或者提供字符串转换成Tvb来让解析器处理,这时候需要进行一些转换,如下代码所示【10】,详细可参考【9】。

    local b = ByteArray.new(decipheredFrame)
    local bufFrame = ByteArray.tvb(b, "My Tvb")

     Pinfo经常被解释为报文信息,个人理解简单的说就是给了按照图中这个条访问报文的接口,最常见的例子就是修改协议列名称或者info列显示的消息,如pinfo.cols.protocol = "MQTT over Websocket" ,更多的属性从参考文献【5】中可以获取。

     

    TreeItem 对象表示报文解析树中的一个树节点,获得了这个就可以动态往图形化界面里添加节点。

     

    2.调试与启用插件

    启动

    wireshark在启动时会加载init.lua脚本, windows平台在wireshark安装目录下,linux在etc/wireshark下。想要执行我们写的插件,只需在该脚本最后加上dofile(".\\plugins\\mqttoverwebsocket.lua")来执行即可。重新加载Lua脚本的快捷键是Ctrl+Shift+L

    调试

    若脚本有语法错误,wireshark图形界面在加载时会弹出提示;若有运行时错误,会在图形化的协议树中显示;wireshark还有一个Lua终端来执行编写的插件脚本、打印错误信息,通过“工具——Lua——console”打开,动态执行脚本通过“工具——Lua——evaluate”。注意看到输出需要使用wireshark提供的内置函数如debug(text)来输出【14】。

    三、实现解析Websocket上的MQTT协议

     由于不明原因将mqtt协议解析器注册到ws.port或ws.protocol上仍然无法自动解析MQTT,所以我选择首先获得已经解析好去掉mask后的WebSocket的data字段,然后再将其转换成tvb到mqtt解析器中自动解析。获得包解析后内容的方法主要参考【11】和【12】中的解析树的例子,使用fieldinfo类与全局函数all_field_infos()来获得解析树的各个部分内容。

    由于传入mqtt解析器的tree就是这个包的树根,所以也会自动添加一个节点。最后取得了不错的效果。另附github链接:https://github.com/a3135134/Wireshark-Plugin-MQTToverWebSocket.git

     

    do
        -- calling tostring() on random FieldInfo's can cause an error, so this func handles it
        local function getstring(finfo)
            local ok, val = pcall(tostring, finfo)
            if not ok then val = "(unknown)" end
            return val
        end
        
        -- Create a new dissector
        MQTToverWebsocket = Proto("MQTToverWebsocket", "MQTT over Websocket")
        mqtt_dissector = Dissector.get("mqtt")
        -- The dissector function
        function MQTToverWebsocket.dissector(buffer, pinfo, tree)
            local fields = { all_field_infos() }
            local websocket_flag = false
            for i, finfo in ipairs(fields) do
                if (finfo.name == "websocket") then
                    websocket_flag = true
                end
                if (websocket_flag == true and finfo.name == "data") then
                    local str1 = getstring(finfo)
                    local str2 = string.gsub(str1, ":", "")
                    local bufFrame = ByteArray.tvb(ByteArray.new(str2))
                    mqtt_dissector = Dissector.get("mqtt")
                    --mqtt_dissector:call(finfo.source, pinfo, tree) #9 BUG
                    mqtt_dissector:call(bufFrame, pinfo, tree)
                    --mqtt_dissector:call(finfo.value, pinfo, tree)
                    websocket_flag = false
                    pinfo.cols.protocol = "MQTT over Websocket"
                end
        end
            
            --ws_dissector_table = DissectorTable.get("ws.port")
            --ws_dissector_table:add("443",mqtt_dissector)
        end
        -- Register the dissector
        --ws_dissector_table = DissectorTable.get("ws.port")
        --ws_dissector_table:remove(443, mqtt_dissector)
        --ws_dissector_table:add(443, MQTTPROTO)
        --ws_dissector_table:add_for_decode_as(mqtt_dissector)
        register_postdissector(MQTToverWebsocket)
    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】http://www.cnblogs.com/zzqcn/p/4827251.html

    【2】https://mika-s.github.io/wireshark/lua/dissector/2017/11/04/creating-a-wireshark-dissector-in-lua-1.html

    【3】https://wiki.wireshark.org/Lua/Dissectors#Dissectors

    【4】https://wiki.wireshark.org/LuaAPI/Tvb#Tvb

    【5】https://wiki.wireshark.org/LuaAPI/Pinfo#Pinfo

    【6】https://ask.wireshark.org/question/1480/mqtt-over-websocket/

    【7】https://www.wireshark.org/docs/wsdg_html_chunked/lua_module_Proto.html#lua_class_Dissector

    【8】https://osqa-ask.wireshark.org/questions/32288/can-over-ethernet-lua-dissector

    【9】https://www.wireshark.org/docs/wsdg_html_chunked/lua_module_Tvb.html

    【10】https://osqa-ask.wireshark.org/questions/43013/conversion-of-string-into-userdata-type-like-wiresharks-buffer

    【11】https://www.wireshark.org/docs/wsdg_html_chunked/lua_module_Field.html#lua_class_Field

    【12】https://wiki.wireshark.org/Lua

    【13】https://wiki.wireshark.org/Lua/Examples#View_Packet_Tree_of_Fields.2FFieldInfo

    【14】https://wiki.wireshark.org/LuaAPI/Utils

       [15] https://www.cnblogs.com/lvdongjie/p/4073241.html

     

    By ascii0x03, 2018/4/10,转载请注明出处

    展开全文
  • Wiresharklua脚本介绍

    2021-03-26 14:15:03
    Wiresharklua脚本介绍 概述 Wireshark是非常强大的报文解析工具,是网络定位中不可缺的使用工具,在物联网中很多为自定义协议,wireshark无法解析,此时lua脚本就有了用武之地。Lua是一个脚本语言,不需要编译...

    Wireshark中lua脚本介绍

    概述

    Wireshark是非常强大的报文解析工具,是网络定位中不可缺的使用工具,在物联网中很多为自定义协议,wireshark无法解析,此时lua脚本就有了用武之地。Lua是一个脚本语言,不需要编译可以直接调用,完美解决了自定义报文解析。

    代码框架

    -- create a new dissector
    local NAME = "Doip"
    local PORT = 13400
    local Doip = Proto(NAME, " Doip Protocol")
    -- dissect packet
    function Doip.dissector (tvb, pinfo, tree)
    end
    -- register this dissector
    DissectorTable.get("udp.port"):add(PORT, Doip)
    

     

    如上一个简单的lua代码分为三部分:

    1. 创建Proto对象
    2. 创建dissector方法
    3. 注册解析器

    加载解析器到wireshark

    将lua文件放在wirekshark的安装目录,在wireshark的根目录中找到init.Lua,打开后将文件中的enable_lua设置为true,并在文件目录中增加我们编写的lua脚本,使用的为dofile(DATA_DIR.."DoIP.lua”)。

    uploading.4e448015.gif转存失败重新上传取消

    Figure 1lua脚本放置位置

    uploading.4e448015.gif转存失败重新上传取消

    Figure 2修改enable_lua为true

    uploading.4e448015.gif转存失败重新上传取消

    Figure 3注册新编写脚本

    重新打开wireshark或者shift+ctrl+L快捷键进行lua加载即可进行解析。

     

    Lua插件API接口

    1. Proto对象

    表示一个新的protocol,使用

    接口

    说明

    proto:__call (name,desc)

    创建Proto对象。name和desc分别是对象的名称和描述,前者可用于过滤器等

    proto.name

    get名称

    proto.fields

    get/set字段

    proto.prefs

    get配置项

    proto.init

    初始化,无参数

    proto.dissector

    解析函数,3个参数tvb,pinfo,tree,分别是报文内容,报文信息和解析树结构

    proto:register_heuristic (listname, func)

    为Proto注册一个启发式解析器,被调用时,参数func将被传入与dissector方法相同的3个参数

     

    常用使用:

    local NAME1          = "red"

    local PORT           = 5004

    local RTP_PROTO_TYPE = 106

    local red    = Proto(NAME1, "Red Protocol")

    1. Protofield

    此对象为协议字段,用于解析字段后在描述字上添加节点,根据接口不同可以分成两大类:

    整型:

    ProtoFiled.{type}(abbr,[name],desc,base,valuestring,mask)

    Type包括:uint8,uint16,uint24,uint32,uint64,framenum

    Abbr:过滤器的名字

    Name:在解析树中的名字

    Base:One of base.DEC, base.HEX or base.OCT, base.DEC_HEX, base.HEX_DEC, base.UNIT_STRING or base.RANGE_STRING.

    Valuestring:可以用表的形式来进行解析,也可以理解为switch语句

    Mask:类型掩码

    Desc:字段描述

    其他类型:

    ProtoField.{type},(abbr,[bane],[desc])

    Type包括:float,double,string,stringz,bytes,bool,ipv4,ipv6,ether,oid,guid.

    []内的事可选字段,{}中的事可替换字段。

    示例如下:

    -- create fields of red

    fields_M = ProtoField.uint8 (NAME1 .. ".M", "M",base.HEX,Payload_type,0x80)

    fields_pt = ProtoField.uint8 (NAME1 .. ".PT", "PT", base.DEC,Payload_type,0x7F)

    fields_seqno   = ProtoField.uint16(NAME1 .. ".seqno", "Sequence number")

    fields_h264bytes = ProtoField.bytes(NAME1 .. ".bytes", "H264Data")

    fields_fec        = ProtoField.bytes(NAME1 .. ".fec", "FEC Payload")

    这些字段添加到结构树种后显示如下:

    uploading.4e448015.gif转存失败重新上传取消

    1. Tvb

    Testy vitual Buffer表示报文缓存,也就是实际报文数据,可以通过一下方法将报文数据中解析出信息,接口如下:

    tvb:__tostring()

    将报文数据转化为字符串,可用于调试

    tvb:reported_len()

    get tvb的(not captured)长度

    tvb:len()

    get tvb的(captured)长度

    tvb:reported_length_remaining()

    获取当前tvb的剩余长度,如果偏移值大于报文长度,则返回-1

    tvb:offset()

    返回原始偏移

     

     常用的字段是tvb:len()

    1. Pinfo

    报文信息(packet information),接口如下:

    接口

    说明

    pinfo.len pinfo.caplen

    get报文长度

    pinfo.abs_ts

    get报文捕获时间

    pinfo.number

    get报文编号

    pinfo.src pinfo.dst

    get/set报文的源地址、目的地址

    pinfo.columns pinfo.cols

    get报文列表列(界面)

    获得列表信息后就可以设备该列文本,比如

    -- show protocol name in protocol column

    pinfo.cols.protocol = “RED”

    如上,可以将协议类型显示为RED

     

     

    1. Treeitem

    解析树,用来展示字段的树形结构

    接口

    说明

    tree_item:add_packet_field(protofield, [tvbrange], encoding, [label])

    使用协议字段创建一个子树,可以根据入参调整大小字节序ENC_BIG_ENDIAN or ENC_LITTLE_ENDIAN

    treeitem:add([protofield], [tvbrange], [value], [label])

    增加一个子树,并返回该子树,使用大字节序解析

    treeitem:add_le([protofield], [tvbrange], [value], [label])

    增加一个子树,并返回该子树,使用小字节序解析

    treeitem:append_text

    附加文本到这个表

    treeitem:prepend_text(text)

    在表前增加文本

    treeitem:add_proto_expert_info(expert, [text])

    设置树项的专家标志并将专家信息添加到包中。

     

    1. DissectorTable

    这个是一个具体协议解析表,比如TCP的解析表tcp.port包括http,SMTP,ftp等

    此对象的接口如下:

    接口

    说明

    DissectorTable.get(name)

    get名为name的解析表的引用

    dissectortable:add(pattern, dissector)

    将Proto或Dissector对象添加到解析表,即注册。pattern可以是整型值,整型值范围或字符串,这取决于当前解析表的类型

    dissectortable:remove(pattern, dissector)

    将满足pattern的一个或一组Proto、Dissector对象从解析表中删除

    1. 其他API接口

    https://www.wireshark.org/docs/wsdg_html_chunked/lua_module_Proto.html

     

     

     

    1. 样例:

     

    local version_str = string.match(_VERSION, "%d+[.]%d*")

    local version_num = version_str and tonumber(version_str) or 5.1

    local bit = (version_num >= 5.2) and require("bit32") or require("bit")

     

    -- create a new dissector to decode rtp private payload

    local NAME1          = "red"

    local PORT           = 5004

    local RTP_PROTO_TYPE = 106

     

    local red            = Proto(NAME1, "Red Protocol")

     

    -- create fields of red

    fields_M             = ProtoField.uint8 (NAME1 .. ".M", "M", base.HEX,Payload_type,0x80)

    fields_pt            = ProtoField.uint8 (NAME1 .. ".PT", "PT", base.DEC,Payload_type,0x7F)

    fields_seqno         = ProtoField.uint16(NAME1 .. ".seqno", "Sequence number")

    fields_h264bytes     = ProtoField.bytes(NAME1 .. ".bytes", "H264Data")

    fields_fec           = ProtoField.bytes(NAME1 .. ".fec", "FEC Payload")

     

    red.fields           = { fields_M, fields_pt, fields_seqno, fields_h264bytes,fields_fec }

     

    local RTP_dis        = Dissector.get("rtp")

    local H264_dis       = Dissector.get("h264")

    local Data_dis       = Dissector.get("data")

     

    -- dissect packet

    function red.dissector(tvb, pinfo, tree)

        length = tvb:len()

        if length == 0 then return end

        -- decode private header

        local subtree = tree:add(red, tvb(0,3))

        subtree:add(fields_M, tvb(0,1))

        subtree:add(fields_pt, tvb(0,1))

        subtree:add(fields_seqno, tvb(1,2))

     

        -- show protocol name in protocol column

        pinfo.cols.protocol = red.name

       

        local fec_id = tvb(0,1):uint()

        local fec_type = bit.band(fec_id,0x7F)

        if fec_type == 109 then

            tree:add(fields_fec,tvb(3))

        else

            H264_dis:call(tvb(3):tvb(), pinfo, tree)

        end

    end

     

    --decode first layer  as rtp

    local udp_dissector_table = DissectorTable.get("udp.port")

    udp_dissector_table:set(PORT,RTP_dis)

     

    -- register this dissector

    -- DissectorTable.get("rtp.pt"):add(PORT, red)

    --decode private protocol layer  3-bytes private datas + standard h264

    local rtp_dissector_table = DissectorTable.get("rtp.pt")

    rtp_dissector_table:set(RTP_PROTO_TYPE,red)

     

     

    附录:

    red.dissector(tvb, pinfo, tree)

     

    参考:https://blog.csdn.net/qq_40421919/article/details/103516694

    展开全文
  • 完善后的使用方法 文件命名为xxx.lua,然后放置在wireshark/plugins/ 目录下面再重启wireshark即可。 !完善后,因此这里提供的你需要根据需求进行改造的。 要点 解析主要有bit位,单字节byte,单字节uint8,4字节...
  • lua脚本语言在WireShark中的使用浅析

    千次阅读 2016-05-31 21:58:14
    lua语言在wireshark中的使用浅析  最近项目中使用了一直没接触过的wireshark,从基本的使用到过滤条件的书写,数据的获取查看一步步的都要学习。一直很好奇过滤条件是怎么实现的,借助于api和一些博客的介绍,自己...
  • 基于LUAwireshark插件,利用listener搭建一个对esp协议包的包序号连续性检验的提示器
  • 根据官网的提示,我需要编出一个pb.dll放到wireshark目录中,然后就可以在我自己的lua脚本中快乐地使用了。我装了vs,所以不需要考虑使用luarocks或者Python的方法,只需要考虑最后一种方式: cl /O2 /LD /Fepb.dll /...
  • wireshark 使用lua解析自定义包

    万次阅读 2016-06-02 16:22:43
    先看一段lua脚本 --[[ 创建一个新的协议结构 foo_proto 第一个参数是协议名称会体现在过滤器中 第二个参数是协议的描述信息,无关紧要 --]] local foo_proto = Proto("GSM", "GSM Protolcol") --[[ 下面定义...
  • 在ICT人员用于网络分析的兵器库中,wireshark无疑是倚天剑,虽历史悠久,其锋利程度丝毫不减,由于开源,便于用户二次开发,这就使得此剑的颜值、功能都近乎完美。如果能够熟练的使用此剑,对于行走江湖也是百利而...
  • 项目上需要用到UDP传输私有协议栈数据 ...但是其中有些语法现在的Wireshark不支持了,改了!! 我这里附上自己编的插件的Lua源码供参考,涉及公司的部分已经去掉了 do -----------------------...
  • 编写wireshark lua插件 解析私有协议

    千次阅读 2018-07-05 11:18:40
    1:本文很多写法并不合理,因为我不知道wireshark框架,也从来没写过lua。。纯属瞎捉摸出的结果。 2:文本以解析websocket协议为例。 准备lua文件 我的wireshark安装目录在:C:\Program Files (x86)\Wireshark\ ...
  • http://www.360doc.com/content/13/1226/15/15257968_340284574.shtml http://www.360doc.com/userhome.aspx?userid=15257968&cid=9 ... htt...
  • wiresharklua语言全面解析usb协议规则  捕获USB协议内容: local usb_table_out = DissectorTable.get("usb.product") 捕获usb过滤协议,首先要得到解析器表, 解析器表的列表可以在 视图--&...
  • wireshark抓取OMCI报文使用的omci.lua 1.把文件copy至wireshark安装目录(还有一个BinDecHex.lua文件也要复制到该目录),如C:\Program Files (x86)\Wireshark 2.更改init.lua文件,打开文件后,文件最后添加dofile...
  • wireshark插件omci.lua

    2018-09-20 16:05:46
    添加插件后wireshark可以解析OMCI的报文,过滤条件直接使用OMCI即可过滤。
  • LuaWireshark配合,调试通信程序

    千次阅读 2012-04-25 23:05:34
    对于 网络 通信程序的调试,我们一般是这样进行的: ... 客户端 服务器端 ...方法,需要对程序添加打印... 示例脚本中用到了wireshark所提供的API函数,更多信息和函数说明,可参考wireshark自带的使用说明。
  • WiresharkLua插件

    2020-06-08 21:44:17
    在ICT(ICT,information and communications technology)人员用于网络分析的兵器库中,wireshark无疑是倚天剑,虽历史悠久,其锋利程度丝毫不减,由于开源,便于用户二次开发,这就使得此剑的颜值、功能都近乎完美...
  • 汽车以太网SOME / IP和SOME / IP-SD Wireshark LUA解剖器(Autosar CP和AP,Foundation 1.5.0) 安装 为了使用此LUA插件,需要将它们添加到Wireshark的“个人插件”文件夹中。 如果您不想直接将解剖器文件复制到...
  • 由于工作需要,我编写过一个解析内部通信协议的wireshark的插件,插件是使用lua语言编写的,所以wireshark必须要支持lua接入才行。一般在windows下的wireshark使用安装包安装后,都是支持lua的。只是默认lua支持是...
  • Lua语言在Wireshark中使用

    千次阅读 2011-08-20 00:28:35
    1. 检查Wireshark的版本是否支持Lua 打开Wireshark,点击“HelpàAbout Wireshark”菜单,查看弹出的对话框,如果有“with Lua 5.1”表示支持Lua语言扩展,如果有“without Lua”表示不支持Lua扩展。   2. ...
  • wiresharklua编写

    2020-07-17 17:06:33
    作为一名硬件工程师,来理解C语言,如果之前学习的过得我不多说,如果没有学习过得那就很头疼了,关于这个方面,我也刚刚入手写了一个wireshark的解析文件,用的是verilog的思路来进行解释的,如果有解释不对的地方...
  • 1 确认你的Wireshark支持lua 如果Wireshark安装目录下面有init lua文件就说明支持Lua 2 将rtp h264 lua拷贝到Wireshark的安装目录下 3 需要启动对Lua的支持 默认不启动对Lua的支持 编辑 init lua文件 在“disable ...
  • Wireshark lua插件

    千次阅读 2017-03-26 12:26:43
    源地址:... 参考:  http://yoursunny.com/t/2008/Wireshark-Lua-dissector/  http://yoursunny.com/study/IS409/ScoreBoard.htm  http://www.360doc.com/content/13/1021
  • WiresharkLUA 扩展,用于打印服务器处理 NFS 请求所花费的时间。 用法: # for life capture $ tshark -q -X lua_script:nfs.lua -f " port 2049 " # or if nfs trafic is not on a standard port ( pNFS DS ...
  • Lua脚本开发的一种私有协议的解析插件的源码,附有.pcap抓包文件,简小精短。
  • wireshark Lua脚本编写

    2020-11-02 11:03:36
    wireshark Lua脚本编写 Lua语言是脚本语言,只需要编写相关协议解析的脚本内容,然后由wireshark加载即可(Wireshark自带Lua解析器),wireshark封装丰富的接口给Lua使用,一些有用的docs: ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,469
精华内容 587
关键字:

luawireshark