Wireshark Lua 插件教程

[复制链接]
发表于 2025-10-24 11:41:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
本⽂重要先容 Lua 脚本在 Wireshark 中的应⽤, Lua 脚本可以在 Wireshark 中完成如下功能:

      
  • 从⽹络包中提取数据, 大概统计⼀些数据包(Dumper)
      
  • 必要分析⼀种 Wireshark 不提供原⽣⽀持的协议(Dissector)

⽰例

协议分析

VREP 协议是 NOGD 框架对于 TRIP 协议的⼀种延伸和扩展. Wireshark 原⽣并不提供对于 VREP 协议的⽀持, 下图展⽰了脚本前后对⽐.
(a) VREP 原始字节省如下

(b) 脚本分析事后的信息

数据流提取

Wireshark 对 RTP 和 RTSP 均提供⽀持, 但是没提供对于 RTP over RTSP 协议的⽀持, 可以利⽤此处脚本提供的协议对此完身分析. 下图展⽰了这种差别.
(a) RTP over RTSP 原始信息

(b) 脚本加强分析后的信息

使⽤⽅法

假定你要使⽤ foo.lua 脚本
      
  • 将脚本拷⻉到 Wireshark home ⽬录, 如 C:\Program\Files\Wireshark\foo.lua  
  • 修改 init.lua 脚本(C:\Program\Files\Wireshark\init.lua), 在末端添加⼀⾏ dofile("foo.lua")  
  • 重启 Wireshark 使脚本⽣效
差别范例的脚本的使⽤⽅法:

      
  • Dissector 在选定的数据流中右击 -> 解码为… -> 选择脚本注册的协议, 如 RTPP.  
  • Dumper 在⼯具菜单下⾯选择注册的 dumper.(如 Dump MPEG TS Packet)
分析器(Dissector)

注册新协议

注册新协议的⼀般步调.
      
  • 注册新协议
         
    • 基于 UDP 相对而⾔⽐较简单, 逐个分析 IP 包即可   
    • 基于 TCP 分析器⽐较复杂, 必要思量 TCP 重组(TCP Reassembly)   
       
  • 界说协议字段
      
  • 注册协议字段
      
  • 界说分析函数
      
  • 注册到协议端标语

分析器代码框架

  1. local ror = Proto("ror", "RTP over RTSP Protocol")
  2. -- 定义协议字段
  3. local pf_ror_magic = ProtoField.uint8("ror.magic", "Magic", base.HEX)
  4. local pf_ror_channel = ProtoField.uint8("ror.channel", "Interleaved Channel", base.HEX)
  5. local pf_ror_length = ProtoField.uint16("ror.length", "Length")
  6. -- 注册协议字段
  7. ror.fields = {
  8.    
  9.    
  10.     pf_ror_magic ,
  11.     pf_ror_channel ,
  12.     pf_ror_length ,
  13. }
  14. -- 在此处定义你精妙绝伦的解析函数
  15. function ror.dissector(tvbuf, pinfo, root)
  16.     -- tvbuf: TCP segment
  17.     -- pinfo: packet column info
  18.     -- root: node info in the display zone
  19. end
  20. -- 指定协议端⼝, 此处是tcp 端⼝
  21. local tcp_dissector_table = DissectorTable.get("tcp.port")
  22. tcp_dissector_table:add(554, ror)
复制代码
TCP 包重组标题

作为 tcp 分析器必须要⽤能⼒处置惩罚下⾯⼏种环境
      
  • TCP 数据段只含有协议数据包的前⼀部门  
  • TCP 数据段含有多个协议数据包  
  • 协议数据包在 TCP 数据段的中央部门, 由于协议包的前⼀部门大概没有被捕获到  
  • 数据包大概有被截断的环境  
  • 以上⼏种环境的恣意组合
对以上标题的应对计谋.
      
  • 针对 4, 简单来说就是不分析堵截的包(return 0)  
  • 针对 3, 分析函数必须要做⼀定的合法性查抄, 如果不是属于该协议的包, 那么就扬弃该包(return 0)  
  • 针对 2, 在分析函数⾥⾯做⼀个 while 循环(return 已分析的⻓度)  
  • 针对 1, 尽最⼤大概去确定协议数据包的⻓度, 如果不能确定, 那么就返回⼀个默认值 DESEGMENT_ONE_MORE_SEGMENT
dissector 函数的返回值如下:
      
  • 如果 TCP 数据段携带的数据不属于当前协议, 那么返回 0  
  • 如果必要更多的数据才气继承分析, 那么设置 desegment_len, desegment_offset, 返回值为 nil 大概已分析的⻓度都可以  
  • 如果不必要更多数据, 那么返回 nil 大概已经分析的⻓度都可以
Dumper

可以导出指定的协议字段到⽂件. 可选的字段:
      
  • 来⾃预界说的字段(ip.src, tcp.port, rtsp.length)  
  • ⾃界说的字段(ror.magic)
Dumper 代码框架

  1. -- 定义感兴趣的字段
  2. -- wireshark 现已⽀持的协议的字段
  3. local mpeg_pid = Field.new("mp2t.pid")
  4. local mpeg_pkt = Field.new("mp2t")
  5. -- ⾃定义协议的字段
  6. local ror_channel = Field.new("ror.channel")
  7. -- 激活对话框时候的回调
  8. local function init_payload_dump(file, filter)
  9.     local tap = Listener.new(nil, filter)
  10.     -- this function is going to be called once each time our filter matches
  11.     function tap.packet(pinfo, tvb)
  12.         -- do some fancy work
  13.     end
  14.     retap_packets()
  15.     tap:remove()
  16. end
  17. -- 窗⼝回调
  18. local functi
复制代码
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表