Appearance
Appearance
本页介绍 Lua 在 Wireshark 中的角色:它是一种用于原型开发、脚本编写和扩展 Wireshark 行为的轻量级语言。适合想快速验证解析逻辑、编写 post-dissector 或 tap、自动化 TShark 处理流程的用户。
| 主题 | 本页关注点 | 容易混淆的点 |
|---|---|---|
| Lua 语言本身 | Lua 是可嵌入应用程序的轻量级脚本语言 | 本页不是 Lua 语言教程,只说明它与 Wireshark 的关系 |
| Wireshark 中的 Lua | 用 Lua 编写 dissector、post-dissector 和 tap | Lua 适合原型和脚本;Wireshark 内置 dissector 通常用 C 编写以获得更高性能 |
| Lua/Dissectors | 另有页面专门讲 Lua dissector 写法 | 本页只给入口和背景,不展开 TCP 重组等 dissector 细节 |
| GPL | 使用 Wireshark 绑定的 Lua 代码涉及 GPL 分发要求 | 不清楚 GPL 影响时,应咨询律师 |
Lua 是一种功能强大的轻量级编程语言,设计目标是扩展应用程序。Lua 由巴西里约热内卢天主教大学(PUC-Rio)团队设计并实现,诞生并成长于 PUC-Rio 的计算机图形技术组 Tecgraf,现在由 Lua.org 托管。Tecgraf 和 Lua.org 都是计算机科学系的实验室。
关于 Lua 语言本身,可参考 Lua 主站点、Lua 参考手册、介绍 Lua 的书、lua-users wiki,以及 Introducing Lua。
Wireshark 以 GPL 发布,因此基于 Wireshark 的衍生作品必须按 GPL 条款发布。
即使你用 Lua 编写的代码本身不需要采用 GPL,使用 Wireshark 绑定的 Lua 代码仍必须按 GPL 条款分发。更多信息请参考 GPL FAQ。
至少有一位 Wireshark 作者不会允许以不同条款分发衍生作品。以不同条款分发使用 Wireshark 绑定的 Lua 代码,会明显违反 GPL。
如果你不清楚 GPL 是什么以及它如何运作,请咨询律师。
Lua 已加入 Wireshark,用作原型开发和脚本编写语言。常见用途如下:
| 用途 | 作用 | 适合场景 |
|---|---|---|
| dissector | 分析数据包数据的一部分 | 快速验证私有协议或逆向工程中的解析思路 |
| post-dissector | 在所有其他 dissector 运行后执行,可向解析树添加条目 | 基于已有字段补充派生字段,方便显示过滤 |
| tap | 在数据包解析后收集信息 | 统计、汇总或监听解析结果 |
虽然可以用 Lua 编写 dissector,但 Wireshark dissector 通常用 C 编写,因为 C 比 Lua 快很多。Lua 更适合 dissector 原型开发:在逆向工程过程中,你可以把时间用于弄清楚协议如何工作,而不是反复编译和调试 C dissector。
自 0.99.4 起,Wireshark 的 Windows 版本已随附 Lua。其他平台上的可用性各不相同。要查看当前 Wireshark 是否支持 Lua:
在一些较旧版本中,Lua 作为插件提供。
hello.lua,并放在当前目录中。-- hello.lua
-- Lua's implementation of D. Ritchie's hello world program.
print("hello world!")tshark -X lua_script:hello.lua你应该能看到类似输出:
$ 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 是控制台程序。
每次 Wireshark 启动时,都会在 Wireshark 的全局配置目录中搜索名为 init.lua 的脚本。如果找到此文件,Wireshark 会运行该脚本。
脚本加载顺序与控制变量如下:
| 阶段 | Wireshark 行为 |
|---|---|
| 1 | 运行全局配置目录中的 init.lua |
| 2 | 如果第一个 init.lua 将 disable_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 参考手册可在原站对应入口找到,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.com | Lua 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