马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
本⽂重要先容 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)
- 界说协议字段
- 注册协议字段
- 界说分析函数
- 注册到协议端标语
分析器代码框架
- local ror = Proto("ror", "RTP over RTSP Protocol")
- -- 定义协议字段
- local pf_ror_magic = ProtoField.uint8("ror.magic", "Magic", base.HEX)
- local pf_ror_channel = ProtoField.uint8("ror.channel", "Interleaved Channel", base.HEX)
- local pf_ror_length = ProtoField.uint16("ror.length", "Length")
- -- 注册协议字段
- ror.fields = {
-
-
- pf_ror_magic ,
- pf_ror_channel ,
- pf_ror_length ,
- }
- -- 在此处定义你精妙绝伦的解析函数
- function ror.dissector(tvbuf, pinfo, root)
- -- tvbuf: TCP segment
- -- pinfo: packet column info
- -- root: node info in the display zone
- end
- -- 指定协议端⼝, 此处是tcp 端⼝
- local tcp_dissector_table = DissectorTable.get("tcp.port")
- 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 代码框架
- -- 定义感兴趣的字段
- -- wireshark 现已⽀持的协议的字段
- local mpeg_pid = Field.new("mp2t.pid")
- local mpeg_pkt = Field.new("mp2t")
- -- ⾃定义协议的字段
- local ror_channel = Field.new("ror.channel")
- -- 激活对话框时候的回调
- local function init_payload_dump(file, filter)
- local tap = Listener.new(nil, filter)
- -- this function is going to be called once each time our filter matches
- function tap.packet(pinfo, tvb)
- -- do some fancy work
- end
- retap_packets()
- tap:remove()
- end
- -- 窗⼝回调
- local functi
复制代码 |