• 【wireshark】插件开发(二):Lua插件开发介绍


    1. Wireshark对Lua的支持

    本节相关内容可参考Wireshark开发指南第10章”Lua Support in Wireshark”。

    Wireshark集成了Lua解释器,以支持Lua脚本(自己编译的话根据编译配置决定是否支持Lua)。

    启动wireshark,依次点击“Help”,”About Wireshark“菜单,在打开的对话框中的”Wireshark”标签页上观察版本信息,如果如下图一样显示With Lua,说明此版本支持Lua插件。

    然后打开wireshark主目录下的init.lua文件,确保disable_lua的值为false,即开启了lua:

    在Wireshark中,可以使用Lua编写以下几种插件:

    • Dissectors
      协议解析器,用于解析报文
    • Post-dissectors
      后置解析器,在其他解析器之后被调用
    • Listeners
      监听器,用来收集解析后的信息

    还需要注意:

    1. wireshark启动时,会调用下图目录中的init.lua,顺序是先调用global目录的,再调用personal目录的;
    2. 通过命令行参数:
             -X lua_script:my.lua
      传入的my.lua将会在Init.lua之后被调用
    3. 所有的Lua脚本会在解析器注册过程的最后被调用,而这一过程是在wireshark启动时就发生的,早于报文被读取的时刻。

    2. Lua插件API简介

    本节相关内容可参考Wireshark开发指南第11节”Wireshark’s Lua API Reference”。

    Wireshark提供了丰富的Lua API供开发者使用,这里只介绍下文需要用到的一些。

    2.1 Proto

    表示一个新的Protocol,在Wireshark中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个参数

    2.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

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

    2.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() 返回原始偏移

    2.4 TvbRange

    表示Tvb的可用范围,常用来从Tvb中解出信息。主要接口有

    接口 说明
    tvb:range([offset], [length]) 从tvb创建TvbRange,可选参数分别是偏移和长度,默认值分别是0和总长度
    tvbrange:{type}() 将tvbrange所表示范围内的数据转换成type类型的值,type包括但不限于:uint,uint64,int,int64,float,ipv4,ether,nstime,string,ustring,bytes,bitfield等,其中某些类型的方法可以带一些参数

    2.5 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报文列表列(界面)

    取得报文列表列后,就可以设置该列的文本,比如

    pinfo.cols.info = “hello world”

    将Info列的文本设为hello world。

    2.6 TreeItem

    表示报文解析树中的一个树节点。主要接口有:

    接口 说明
    treeitem:add([protofield], [tvbrange], [value], [label]) 向当前树节点添加一个子节点
    treeitem:set_text(text) 设置当前树节点的文本
    treeitem:prepend_text(text) 在当前树节点文本的前面加上text
    treeitem:append_text(text) 在当前树节点文本的后面加上text

    2.7 DissectorTable

    表示一个具体协议的解析表,比如,协议TCP的解析表”tcp.port”包括http,smtp,ftp等。可以依次点击wireshark菜单“Internals”、“Dissector tables”,来查看当前的所有解析表。tcp.port解析表在“Integer tables”选项卡中,顾名思义,它是通过类型为整型的tcp端口号来识别下游协议的:

     

    DissectorTable的主要接口有:

    接口 说明
    DissectorTable.get(name) get名为name的解析表的引用
    dissectortable:add(pattern, dissector) 将Proto或Dissector对象添加到解析表,即注册。pattern可以是整型值,整型值范围或字符串,这取决于当前解析表的类型
    dissectortable:remove(pattern, dissector) 将满足pattern的一个或一组Proto、Dissector对象从解析表中删除

    3. 参考

  • 相关阅读:
    Exp4 恶意代码分析 20155223
    20155223 Exp3 免杀原理与实践 实验报告
    20155223 Exp2 后门原理与实践
    网络对抗第一次实验——PC平台逆向破解(5)M
    苏黄的假期学习报告3
    我的假期学习报告2
    苏黄永郦的假期报告——1
    20155223 《信息安全系统设计基础》课程总结
    2017-2018-1 20155223 《信息安全系统设计基础》第14周学习总结
    2017-2018-1 20155223 实验五 通讯协议设计
  • 原文地址:https://www.cnblogs.com/zzqcn/p/4827337.html
Copyright © 2020-2023  润新知