Skip to content
Wireshark Wiki 中文翻译整理专题首页原始页面

Lua

本页介绍 Lua 在 Wireshark 中的角色:它是一种用于原型开发、脚本编写和扩展 Wireshark 行为的轻量级语言。适合想快速验证解析逻辑、编写 post-dissector 或 tap、自动化 TShark 处理流程的用户。

主题本页关注点容易混淆的点
Lua 语言本身Lua 是可嵌入应用程序的轻量级脚本语言本页不是 Lua 语言教程,只说明它与 Wireshark 的关系
Wireshark 中的 Lua用 Lua 编写 dissector、post-dissector 和 tapLua 适合原型和脚本;Wireshark 内置 dissector 通常用 C 编写以获得更高性能
Lua/Dissectors另有页面专门讲 Lua dissector 写法本页只给入口和背景,不展开 TCP 重组等 dissector 细节
GPL使用 Wireshark 绑定的 Lua 代码涉及 GPL 分发要求不清楚 GPL 影响时,应咨询律师

Lua 是什么

Lua 是一种功能强大的轻量级编程语言,设计目标是扩展应用程序。Lua 由巴西里约热内卢天主教大学(PUC-Rio)团队设计并实现,诞生并成长于 PUC-Rio 的计算机图形技术组 Tecgraf,现在由 Lua.org 托管。Tecgraf 和 Lua.org 都是计算机科学系的实验室。

关于 Lua 语言本身,可参考 Lua 主站点、Lua 参考手册、介绍 Lua 的书、lua-users wiki,以及 Introducing Lua。

GPL 注意事项

Wireshark 以 GPL 发布,因此基于 Wireshark 的衍生作品必须按 GPL 条款发布。

即使你用 Lua 编写的代码本身不需要采用 GPL,使用 Wireshark 绑定的 Lua 代码仍必须按 GPL 条款分发。更多信息请参考 GPL FAQ。

至少有一位 Wireshark 作者不会允许以不同条款分发衍生作品。以不同条款分发使用 Wireshark 绑定的 Lua 代码,会明显违反 GPL。

如果你不清楚 GPL 是什么以及它如何运作,请咨询律师。

Wireshark 中的 Lua 能做什么

Lua 已加入 Wireshark,用作原型开发和脚本编写语言。常见用途如下:

用途作用适合场景
dissector分析数据包数据的一部分快速验证私有协议或逆向工程中的解析思路
post-dissector在所有其他 dissector 运行后执行,可向解析树添加条目基于已有字段补充派生字段,方便显示过滤
tap在数据包解析后收集信息统计、汇总或监听解析结果

虽然可以用 Lua 编写 dissector,但 Wireshark dissector 通常用 C 编写,因为 C 比 Lua 快很多。Lua 更适合 dissector 原型开发:在逆向工程过程中,你可以把时间用于弄清楚协议如何工作,而不是反复编译和调试 C dissector。

入门:检查 Lua 是否可用

自 0.99.4 起,Wireshark 的 Windows 版本已随附 Lua。其他平台上的可用性各不相同。要查看当前 Wireshark 是否支持 Lua:

  1. 打开 Help → About Wireshark。
  2. 在 “Compiled with” 段落中查找 Lua。

在一些较旧版本中,Lua 作为插件提供。

用 TShark 测试 Lua

  1. 确认已按下一节说明在全局配置中启用 Lua。
  2. 创建一个简单脚本,命名为 hello.lua,并放在当前目录中。
text
-- hello.lua
-- Lua's implementation of D. Ritchie's hello world program.
print("hello world!")
  1. 从命令提示符运行:
text
tshark -X lua_script:hello.lua

你应该能看到类似输出:

text
$ tshark -X lua_script:hello.lua
hello world!
Capturing on en0
1 0.000000 111.123.234.55 -> 111.123.234.255 NBNS Name query NB XXX.COM<00>

如果运行 TShark 后第一行出现 “hello world!”,说明 Lua 可以使用。

注意:在 Windows 上运行 Wireshark 中的 Lua 脚本时,你可能看不到任何输出。如果启用了控制台窗口,它会在 Lua 引擎加载后打开。这不影响 TShark,因为 TShark 是控制台程序。

Lua 如何融入 Wireshark 启动流程

每次 Wireshark 启动时,都会在 Wireshark 的全局配置目录中搜索名为 init.lua 的脚本。如果找到此文件,Wireshark 会运行该脚本。

脚本加载顺序与控制变量如下:

阶段Wireshark 行为
1运行全局配置目录中的 init.lua
2如果第一个 init.luadisable_lua 设置为 true,Wireshark 停止读取脚本,并在该脚本运行后立即关闭 Lua 引擎
3全局 init.lua 运行完成后,Wireshark 在全局插件目录中搜索以 .lua 结尾的文件并运行
4如果 Wireshark 正以 suexec 运行,即以 root 身份运行但由另一个用户启动,会先检查 run_user_scripts_when_superuser 是否为 true,再决定是否加载后续脚本
5运行个人配置目录中的 init.lua(如果存在)
6在个人插件目录中搜索以 .lua 结尾的文件并运行
7按给定顺序运行通过 -X lua_script:xxx.lua 命令行选项传入的脚本

这些脚本都会在读取数据包之前、dissector 注册过程结束时运行。因此,脚本通常要注册一组函数,等处理数据包时再由 Wireshark 调用。

不同平台上的配置目录和插件目录位置不同。请参考 Wireshark 用户指南附录 B《文件和文件夹》。

Wireshark 的 Lua API

Wireshark 的 Lua API 参考手册可在原站对应入口找到,API 变更也有对应记录。如需查看 Lua API 内部结构以及创建 wsluarm 的步骤,可参考略微过时但基本正确的 doc/README.wslua

原页面还列出 220711_wslua_Index_DRAFT.pdf,说明它是 wsluarm 的索引草稿。

示例资源

资源说明
Lua-Users wiki 的 The Sample Code 页面通用 Lua 代码示例
Lua 示例 wiki 页面Wireshark 和 TShark 专用脚本示例入口
Contrib 仓库 wiki 页面Wireshark 相关贡献脚本入口
Wireshark 开发者指南中的 Lua Support in Wireshark开发者文档中的 Lua 支持说明
EASYPOST.lua用于复制字段、修改数据并作为新的 Protocol 字段添加的模板

外部资源

资源说明
Introducing Lua at Internet Archive / O'Reilly onlamp.comLua Primer
ZeroBrane Studio轻量级 Lua IDE
WireBait促进 Wireshark dissector 开发的 Lua 库,可在没有 Wireshark 的情况下让 dissector 针对数据包数据运行;数据包数据可来自十六进制字符串或 .pcap 文件
wireshark-ntop包含若干 Wireshark 开源扩展,其中一些用 Lua 编写;包括用于 sflow 统计的 sflow_tap.lua
wireshark-lua-plugin为 libwireshark API 提供 Lua 5.4 绑定的实验性外部项目,可用 Lua 而非 C 编写 Wireshark dissector;不同于 Wireshark 3.6 随附的 Lua 5.2 代码,并非 Wireshark 开发团队正式支持

导入自 https://wiki.wireshark.org/Lua ,时间为 2020-08-11 23:16:06 UTC

原始页面图片

Lua logo
Lua logo
lua-about.png
lua-about.png

相关 Wireshark Wiki 页面

网络分析技术档案