使用 Wireshark 和 Lua 脚本解析通讯报文

在复杂的网络环境中,Wireshark 凭借其强大的捕获和显示功能,成为协议分析不可或缺的工具。然而,面对众多未被内置支持的协议或需要扩展解析的场景,Lua 脚本的引入为Wireshark 提供了极大的灵活性和可扩展性。本文将详细介绍如何使用 Lua 脚本来增强Wireshark 的功能,实现对复杂通讯报文的解析,从基础入门到高级应用,带你领略 Lua 脚本在 Wireshark 中的强大威力。

一、为什么选择Lua?

Lua 作为一种轻量级脚本语言,在Wireshark中具有以下显著优势:

  1. 简单易学:Lua语法简洁,上手快,适合快速开发和原型设计。
  2. 集成方便:Wireshark内置Lua支持,无需重新编译即可加载脚本插件。
  3. 灵活性高:Lua提供丰富的API,可访问Wireshark核心功能,如协议解析、数据包处理等。
  4. 社区活跃:Lua在游戏开发和多个领域有广泛应用,社区支持强大,易于获取帮助。
二、准备环境

确保已安装最新版本的 Wireshark,并准备好 Python 环境(用于生成某些协议库,如MAVLink)。如果解析特定协议,还需下载协议定义文件(如 XML 格式)。

三、创建 Lua 解析脚本

首先,克隆 MAVLink GitHub 仓库,并按照说明安装 MAVLink 工具:

bash 复制代码
git clone https://github.com/mavlink/mavlink.git
cd mavlink
2. 生成 Lua 解析代码

使用mavgen工具生成 Lua 解析代码。例如,为 common.xml 生成 MAVLink 2 Wireshark 插件:

bash 复制代码
python3 -m pymavlink.tools.mavgen --lang=WLua --wire-protocol=2.0 --output=mavlink_2_common message_definitions/v1.0/common.xml

生成mavlink_2_common.lua文件,包含解析函数。

3. 修改插件文件

根据需要修改生成的Lua文件,指定监控端口。例如:

lua 复制代码
-- 绑定协议解析器到指定端口
local udp_dissector_table = DissectorTable.get("udp.port")
udp_dissector_table:add(14550, mavlink_proto)
udp_dissector_table:add(14580, mavlink_proto)
udp_dissector_table:add(18570, mavlink_proto)  -- 可能用于WSL2中的模拟
4. 添加自定义解析逻辑

对于非 MAVLink 协议或需要额外解析逻辑的情况,编写自定义 Lua 脚本。例如,解析假设的二进制协议:

lua 复制代码
-- 创建新协议对象
local myproto = Proto("myproto", "My Custom Protocol")

-- 定义字段
local f_field1 = ProtoField.uint8("myproto.field1", "Field 1", base.DEC)
local f_field2 = ProtoField.string("myproto.field2", "Field 2")
myproto.fields = {f_field1, f_field2}

-- 解析函数
function myproto.dissector(buffer, pinfo, tree)
    pinfo.cols.protocol = "MYPROTO"
    
    local subtree = tree:add(myproto, buffer(), "My Custom Protocol Data")
    
    -- 解析第一个字节为无符号整数
    local field1 = buffer(0, 1):uint()
    subtree:add(f_field1, buffer(0, 1))
    
    -- 解析剩余部分为字符串
    local field2 = buffer(1, buffer:len()-1):string()
    subtree:add(f_field2, buffer(1, buffer:len()-1))
end

-- 注册解码器
local udp_table = DissectorTable.get("udp.port")
udp_table:add(9000, myproto)  -- 假设协议使用UDP端口9000
四、导入 Lua 脚本到 Wireshark

将编写好的 Lua 脚本复制到 Wireshark 插件目录。路径因操作系统而异:

  • Linux~/.local/lib/wireshark/plugins~/.wireshark/plugins
  • WindowsProgram Files/Wireshark/plugins

启动 Wireshark,在 Help > About Wireshark > Plugins 中确认插件已加载。

在 Linux 系统中,可以使用 tcpdump 来捕获特定接口上的流。可以在笔记本电脑或外部计算机上执行此操作:

bash 复制代码
apt update
apt install tcpdump
tcpdump -i eth0 -w mavlink-capture.pcap

如果可以通过 SSH 访问远程机器,还可以将 tcpdump 流传输到本地机器,而不是将其记录到文件中。Wireshark 可以打开此流并使用上述工具和过滤器显示解码后的 MAVLink 消息,例如:

bash 复制代码
mkfifo /tmp/mavlink
wireshark -k -i /tmp/mavlink &
ssh root@10.41.1.1 -p 33333 "tcpdump -s 0 -U -n -w - -i lo not port 33333" > /tmp/mavlink

其中,需要根据远程机器的配置调整用户名、IP 和端口。

  • "mkfifo /tmp/mavlink" 创建一个命名管道用于流数据,
  • "wireshark -k -i /tmp/mavlink &" 启动 Wireshark 并将命名管道作为输入立即开始捕获,
  • "ssh" 命令在远程机器上启动数据流并将其管道传输到本地机器的命名管道中,
  • "-s 0" 设置快照长度为默认,
  • "-U" 流数据包输出为包缓冲,不等待完整缓冲区,
  • "-n" 不转换地址,
  • "-w -" 将原始数据写入标准输出(管道传输到本地机器),
  • "-i lo" 定义要监听的接口(这里是环回接口,也可以根据需要更改为以太网、USB 或调制解调器接口),
  • "not port 33333" 不捕获 SSH 会话创建的数据,还可以添加更多过滤器来减少传输的数据。
六、使用 Wireshark 分析
  1. 选择网络接口:选择适当的接口捕获。
  2. 应用过滤器 :使用协议名称(如myproto)过滤特定流。
  3. 查看消息详情 :点击消息查看详细信息,包括字段值和解释。
六、高级功能与应用

Lua 脚本在 Wireshark 中不仅限于基本解析,还可实现以下高级功能:

  • 统计分析:收集特定消息或事件的发生次数,生成图表或报告。
  • 实时响应:检测特定模式时触发警报或执行操作。
  • 自动化测试:模拟客户端行为,发送请求并验证响应,进行回归测试。
相关推荐
慢慢沉14 小时前
Lua(数据库访问)
开发语言·数据库·lua
慢慢沉14 小时前
Lua协同程序(coroutine)
lua
慢慢沉1 天前
Lua元表(Metatable)
lua
慢慢沉2 天前
Lua(字符串)
开发语言·lua
慢慢沉2 天前
Lua(数组)
开发语言·lua
慢慢沉2 天前
Lua(迭代器)
开发语言·lua
慢慢沉2 天前
Lua基本语法
开发语言·lua
Feng.Lee2 天前
接口测试Postman工具高级使用技巧
功能测试·测试工具·lua·postman·可用性测试
三翼鸟数字化技术团队3 天前
鸿蒙平台运行Lua脚本
lua·harmonyos