文章总结: 本文详细介绍了Wireshark通过Lua插件解析DTLCP协议的过程,包括插件加载、协议注册、字段定义和解析逻辑,并对比了DTLCP与TLCP的差异,提供了可操作的实施步骤。 综合评分: 87 文章分类: 安全工具,网络安全,渗透测试,技术标准
Wireshark加载Lua插件分析DTLCP数据过程
原创
利刃信安 利刃信安
利刃信安
2026年7月10日 13:00 北京
在小说阅读器读本章
去阅读
Wireshark加载Lua插件
分析DTLCP数据过程
Lua插件 · DTLCP协议解析 · UDP数据包分析 · Epoch/Sequence Number
01
PART
插件加载过程
PLUGIN LOADING PROCESS
1.1 启动扫描
Wireshark启动时,会自动扫描以下目录寻找Lua插件:
Windows系统:
%APPDATA%\Wireshark\plugins\ — 个人插件目录
C:\Program Files\Wireshark\plugins\ — 全局插件目录
Linux/Mac系统:
~/.wireshark/plugins/ — 个人插件目录
/usr/share/wireshark/plugins/ — 全局插件目录
1.2 初始化配置
Wireshark首先读取配置文件 init.lua ,检查关键配置:
…lua
disable_lua = false — 必须设置为false才启用Lua支持
run_user_scripts_when_superuser = false — 安全控制
1.3 加载顺序
Wireshark 按以下顺序加载插件:
1 读取 init.lua 配置文件
2 检查Lua是否启用( disable_lua 值)
3 按字母顺序扫描插件目录中的所有 .lua 文件
4 逐个执行Lua插件脚本
5 插件注册协议和解析器到Wireshark系统
02
PART
DTLCP Lua插件注册过程
DTLCP LUA PLUGIN REGISTRATION
2.1 协议对象创建
插件首先创建DTLCP协议对象,定义协议的基本信息:
…lua
local dtlcp_protocol = Proto(“DTLCP”, “DTLCP协议”, “数据报传输层密码协议”)
这告诉Wireshark:
协议名称: DTLCP
显示名称: DTLCP协议
协议描述: 数据报传输层密码协议
DTLCP与TLCP的区别:
| 特性 | TLCP | DTLCP | | — | — | — | | 传输层 | TCP | UDP | | 协议标准 | GB/T 38636-2020 | GM/T 0128-2023 | | 数据包格式 | TLS Record格式 | DTLCP Record格式(含epoch/seq) | | 连接特性 | 有连接、可靠 | 无连接、需重传机制 |
2.2 字段定义
接着定义DTLCP协议中包含的所有字段,相当于建立”数据字典”:
…lua
local fields = dtlcp_protocol.fields
— DTLCP特有的字段结构(基于UDP)
fields.epoch = ProtoField.uint16(“dtlcp.epoch”, “Epoch”, base.HEX)
fields.sequence_number = ProtoField.uint64(“dtlcp.sequence_number”, “序列号”, base.HEX)
fields.content_type = ProtoField.uint8(“dtlcp.content_type”, “内容类型”, base.HEX)
fields.version = ProtoField.uint16(“dtlcp.version”, “协议版本”, base.HEX)
fields.length = ProtoField.uint16(“dtlcp.length”, “长度”, base.DEC)
fields.cipher_suite = ProtoField.uint16(“dtlcp.cipher_suite”, “密码套件”, base.HEX)
fields.signature = ProtoField.bytes(“dtlcp.signature”, “签名数据”)
DTLCP Record格式:
…record
DTLCP Record结构(共13字节头部):
┌──────────────┬──────────────────┬──────────────┬──────────────┬──────────────┬───────────────┐
│ 偏移0-1字节 │ 偏移2-7字节 │ 偏移8字节 │ 偏移9-10字节 │ 偏移11-12字节│ 偏移13+字节 │
│ Epoch (2B) │Sequence Number(6B)│Content Type(1B)│ Version (2B) │ Length (2B) │Fragment/Payload│
└──────────────┴──────────────────┴──────────────┴──────────────┴──────────────┴───────────────┘
DTLCP Content Type定义:
…lua
— DTLCP消息类型常量
local CONTENT_TYPE = {
CHANGE_CIPHER_SPEC = 0x14, — 密码切换
ALERT = 0x15, — 告警
HANDSHAKE = 0x16, — 握手
APPLICATION_DATA = 0x17, — 应用数据
}
关键字段说明:
Epoch :会话周期标识(握手成功后epoch递增)
Sequence Number :48位序列号(防重放攻击)
Content Type :消息类型(Handshake/AppData/Alert等)
2.3 解析器注册
DTLCP基于UDP,需要注册到UDP端口:
…lua
— 注册到UDP端口(DTLCP通常使用自定义UDP端口)
local udp_table = DissectorTable.get(“udp.port”)
udp_table:add(443, dtlcp_protocol) — 监听UDP 443端口
udp_table:add(9000, dtlcp_protocol) — 监听UDP 9000端口(示例)
DTLCP端口监听策略:
DTLCP通常使用自定义UDP端口(非标准443)
可以监听多个UDP端口(测试环境可能使用不同端口)
支持动态端口配置(通过Preference设置)
03
PART
DTLCP数据包解析过程
DTLCP PACKET PARSING PROCESS
3.1 数据包到达触发
当Wireshark捕获到符合条件的UDP数据包时,会自动调用已注册的DTLCP插件解析器。
触发条件:
…trigger
UDP端口匹配 → 协议识别 → 触发DTLCP解析器
例:UDP端口443或9000 → 数据包到达 → 调用dtlcp_protocol.dissector
3.2 解析器接收参数
DTLCP解析器函数接收三个关键参数:
…lua
function dtlcp_protocol.dissector(buffer, pinfo, tree)
— buffer: DTLCP Record数据字节流(从DTLCP头部开始,不包含UDP/IP/Ethernet头部)
— pinfo: 包信息(序号、时间、源/目标UDP端口等)
— tree: 协议树(用于添加DTLCP解析结果)
end
参数说明:
pinfo.src_port 和 pinfo.dst_port — UDP源端口和目标端口
buffer:len() — DTLCP Record数据总长度(从Epoch开始到数据包结束)
buffer参数指向DTLCP Record起始位置,不包括UDP/IP/Ethernet头部
3.3 DTLCP数据读取与解析
DTLCP解析器按GM/T 0128-2023标准逐字节读取数据:
安全检查(必须):
…lua
function dtlcp_protocol.dissector(buffer, pinfo, tree)
— 安全检查:buffer必须至少有13字节(DTLCP头部)
if buffer:len() < 13 then
return
end
— 然后再读取字段
local epoch = buffer(0, 2):uint()
— …
end
完整解析步骤:
…parsing
第1步:读取DTLCP Record头部(固定13字节)
├─ Epoch (0-1字节) → buffer(0, 2):uint()
├─ Sequence Number (2-7字节) → buffer(2, 6):uint64() — 读取6字节,按uint64解析
├─ Content Type (8字节) → buffer(8, 1):uint()
├─ Version (9-10字节) → buffer(9, 2):uint()
└─ Length (11-12字节) → buffer(11, 2):uint()
第2步:根据Content Type判断消息类型
├─ 0x14 (ChangeCipherSpec) → 解析密码切换
├─ 0x15 (Alert) → 解析告警消息
├─ 0x16 (Handshake) → 解析握手消息
└─ 0x17 (Application Data) → 解析应用数据
第3步:解析Fragment/Payload(变长,根据Length字段)
├─ 读取Length指定的字节数 → buffer(13, length)
├─ 如果是加密数据,解析加密结构
└─ 如果是握手消息,解析握手子消息
第4步:特殊字段处理
├─ 加密Record:解析IV + 密文 + MAC/AuthTag
├─ 握手Record:解析Handshake Header + 消息内容
└─ 分片处理:DTLCP支持消息分片传输
3.4 DTLCP特有的解析逻辑
Epoch和Sequence Number处理:
…lua
— Epoch标识会话周期
local epoch = buffer(0, 2):uint()
if epoch == 0 then
— Epoch 0:握手阶段,明文传输
subtree:add(fields.epoch, buffer(0, 2)):append_text(” (握手阶段)”)
else
— Epoch > 0:加密传输阶段
subtree:add(fields.epoch, buffer(0, 2)):append_text(” (加密阶段)”)
end
— Sequence Number防重放
local seq_num = buffer(2, 6):uint64() — 读取6字节序列号,按uint64解析
subtree:add(fields.sequence_number, buffer(2, 6))
— 验证序列号是否递增(防重放攻击)
UDP分片处理:
DTLCP基于UDP,可能需要处理消息分片:
…lua
— DTLCP消息分片处理(示例)
local function handle_fragment(subtree, buffer, offset, length)
local fragment_tree = subtree:add(buffer(offset, length), “Fragment”)
fragment_tree:append_text(” (可能包含分片信息)”)
end
3.5 结果添加到协议树
DTLCP解析出的每个字段都添加到Wireshark的协议树中显示:
…lua
— 创建DTLCP协议树
local subtree = tree:add(dtlcp_protocol, buffer())
— 添加DTLCP Record头部
subtree:add(fields.epoch, buffer(0, 2))
subtree:add(fields.sequence_number, buffer(2, 6))
subtree:add(fields.content_type, buffer(8, 1))
subtree:add(fields.version, buffer(9, 2))
subtree:add(fields.length, buffer(11, 2))
— 添加Payload/Fragment
if length > 0 then
local payload_tree = subtree:add(buffer(13, length), “Payload”)
— 根据Content Type继续解析…
end
Wireshark界面显示DTLCP解析结果:
…display
DTLCP Protocol (UDP Port 443)
├─ Epoch: 0x0001 (加密阶段)
├─ Sequence Number: 0x000000000001 (防重放)
├─ Content Type: 0x17 (Application Data)
├─ Version: 0x0101 (DTLCP 1.1)
├─ Length: 64 bytes
└─ Payload:
├─ IV: 16 bytes (SM4-CBC加密)
├─ Encrypted Data: 48 bytes
└─ MAC/AuthTag: 16 bytes (HMAC-SM3或SM4-GCM AuthTag)
04
PART
完整工作流程总结
COMPLETE WORKFLOW SUMMARY
4.1 DTLCP解析流程图
…flow
Wireshark启动
↓
读取init.lua配置
↓
扫描插件目录
↓
加载dtlcp_analyzer.lua
↓
创建DTLCP协议对象
↓
定义DTLCP字段(epoch/seq/content_type等)
↓
注册UDP端口解析器
↓
监听UDP网络端口
↓
捕获UDP数据包
↓
触发DTLCP解析器函数
↓
读取Epoch和Sequence Number
↓
判断Epoch阶段(握手/加密)
↓
读取Content Type
↓
根据类型解析Payload
↓
处理加密/分片逻辑
↓
添加到协议树显示
↓
用户查看DTLCP解析结果
4.2 关键环节说明(DTLCP特有)
| 环节 | TLCP(TCP) | DTLCP(UDP) | 关键差异 | | — | — | — | — | | 传输层监听 | TCP端口 | UDP端口 | UDP无连接,需监听多个端口 | | 协议识别 | TLS Record Header | DTLCP Record Header | DTLCP含epoch/sequence_number | | 数据结构 | ContentType+Version+Length | Epoch+Seq+Type+Version+Length | DTLCP头部多5字节(epoch+seq) | | 防重放机制 | TCP序列号 | DTLCP序列号(48位) | UDP需显式序列号防重放 | | 加密阶段标识 | 无显式标识 | Epoch字段 | Epoch标识握手完成与否 | | 分片处理 | TCP自动分片 | DTLCP需手动处理分片 | UDP需应用层分片重组 |
4.3 DTLCP数据包解析循环
对于每个捕获的UDP数据包,DTLCP解析器都会执行:
…loop
UDP包到达 → 解析器调用 → 读取epoch+seq → 判断阶段
→ 读取Content Type → 解析Payload → 处理分片/加密 → 显示结果
关键差异:
TLCP(TCP) :可靠传输,自动分片重组,无显式序列号
DTLCP(UDP) :无连接,需epoch/seq防重放,应用层分片处理
05
PART
实际应用示例:DTLCP协议解析
PRACTICAL APPLICATION EXAMPLE
5.1 DTLCP握手阶段解析
第一阶段:插件加载
…loading
Wireshark启动 → 读取init.lua → 扫描plugins目录
→ 发现dtlcp_analyzer.lua → 执行脚本
→ 创建DTLCP Proto对象 → 定义epoch/seq等字段
→ 注册解析器到UDP端口(443/9000)
第二阶段:Epoch 0握手数据捕获
…handshake
UDP端口监听 → 捕获UDP数据包(epoch=0x0000)
→ 识别为DTLCP握手阶段 → 触发dtlcp_analyzer解析器
→ 解析Epoch=0 → 明文传输阶段
→ 解析Content Type=0x16 (Handshake)
→ 解析握手消息(ClientHello/ServerHello等)
第三阶段:Epoch 1加密数据解析
…encrypted
握手完成 → Epoch递增为1 → 捕获UDP加密数据包
→ 解析Epoch=0x0001 → 加密传输阶段
→ 解析Sequence Number → 验证防重放
→ 解析Content Type=0x17 (AppData)
→ 解析加密Payload → SM4-CBC/SM4-GCM解密
→ 解析AuthTag/HMAC → 完整性校验
→ 所有字段添加到协议树 → 用户界面显示结果
5.2 DTLCP解析结果展示
Wireshark界面显示DTLCP解析结果的完整结构:
…result
Packet Details:
Frame 1: 80 bytes on wire
├─ Ethernet II
├─ Internet Protocol Version 6
├─ User Datagram Protocol (Src Port: 9000, Dst Port: 9000)
└─ DTLCP Protocol (Epoch 0x0001)
├─ Epoch: 0x0001 (加密阶段)
├─ Sequence Number: 0x000000000001 (防重放序列号)
├─ Content Type: 0x17 (Application Data)
├─ Version: 0x0101 (DTLCP 1.1)
├─ Length: 64 bytes
└─ Encrypted Payload:
├─ IV (CBC): 16 bytes
│ 0x01cb7997f77ee792a871e70ece4c148e
├─ Encrypted Data: 48 bytes
│ [SM4-CBC加密的应用数据]
└─ MAC/AuthTag: 16 bytes
[HMAC-SM3完整性校验或SM4-GCM AuthTag]
DTLCP vs TLCP显示差异:
| 显示元素 | TLCP (TCP) | DTLCP (UDP) | | — | — | — | | 传输层 | Transmission Control Protocol | User Datagram Protocol | | 连接状态 | 有连接状态 | 无连接,显示端口 | | 序列号 | TCP序列号(隐式) | DTLCP Sequence Number(显式) | | 阶段标识 | 无显式标识 | Epoch字段显示握手/加密阶段 | | 分片信息 | TCP自动处理 | 可能显示DTLCP分片标记 |
06
PART
关键技术要点(DTLCP特有)
KEY TECHNICAL POINTS
6.1 DTLCP数据读取技巧
固定头部字段:
…reading
Epoch: buffer(0, 2):uint() — 16位会话周期标识
Sequence Number: buffer(2, 6):uint64() — 读取6字节序列号,按uint64解析(高2字节为0)
Content Type: buffer(8, 1):uint() — 消息类型标识
Version: buffer(9, 2):uint() — 协议版本(0x0101)
Length: buffer(11, 2):uint() — Payload长度
变长Payload解析:
…payload
根据Length字段读取Payload: buffer(13, length)
根据Content Type判断Payload结构:
├─ Handshake → 解析握手子消息
├─ AppData → 解析加密结构(IV+密文+MAC)
└─ Alert → 解析告警级别和描述
6.2 DTLCP协议树结构
DTLCP协议树采用层级结构,体现UDP和DTLCP特性:
…tree
顶层:DTLCP协议对象
├─ 第一层:DTLCP Record Header
│ ├─ Epoch(会话周期)
│ ├─ Sequence Number(防重放)
│ ├─ Content Type(消息类型)
│ ├─ Version(协议版本)
│ └─ Length(数据长度)
├─ 第二层:Payload内容
│ ├─ 加密数据结构
│ │ ├─ IV(初始化向量)
│ │ ├─ Encrypted Data(加密内容)
│ │ └─ MAC/AuthTag(完整性校验)
│ └─ 或握手消息结构
│ ├─ Handshake Type
│ ├─ Handshake Length
│ └─ Handshake Content
└─ 第三层:分片信息(如有)
├─ Fragment Offset
└─ Fragment Length
6.3 解析器触发条件(UDP特性)
DTLCP解析器在满足UDP端口条件时触发:
UDP端口匹配 :监听特定UDP端口(443、9000等)
协议识别 :通过DTLCP Record Header识别
动态配置 :通过Preference动态设置监听端口
UDP vs TCP触发差异:
| 特性 | TCP (TLCP) | UDP (DTLCP) | | — | — | — | | 端口监听 | 单端口监听即可 | 可能监听多个UDP端口 | | 连接识别 | TCP流自动识别 | UDP包无连接,需端口匹配 | | 分片重组 | TCP自动重组 | UDP需应用层重组(DTLCP分片) | | 序列号 | TCP隐式序列号 | DTLCP显式Sequence Number |
6.4 DTLCP防重放机制解析
…lua
— 全局表存储每个epoch的序列号历史
local epoch_seq_history = {}
— 在解析器函数中验证Sequence Number递增
local epoch = buffer(0, 2):uint()
local curr_seq_num = buffer(2, 6):uint64() — 读取6字节序列号,按uint64解析
— 初始化该epoch的序列号历史
if not epoch_seq_history[epoch] then
epoch_seq_history[epoch] = 0
end
— 验证序列号递增
if curr_seq_num <= epoch_seq_history[epoch] then
— 检测到重放攻击
subtree:add(fields.sequence_number, buffer(2, 6))
:append_text(” ⚠️ 序列号异常(可能重放攻击)”)
else
— 序列号正常
subtree:add(fields.sequence_number, buffer(2, 6))
:append_text(” ✓ 序列号正常”)
epoch_seq_history[epoch] = curr_seq_num
end
07
PART
总结
SUMMARY
7.1 Wireshark加载Lua插件分析DTLCP数据的完整过程
第一阶段:启动与加载
1 Wireshark扫描插件目录,发现 dtlcp_analyzer.lua
2 执行Lua脚本,创建DTLCP Proto对象
3 定义DTLCP字段(epoch、sequence_number、content_type等)
4 注册UDP端口解析器(监听443/9000等UDP端口)
第二阶段:UDP数据捕获
1 监听UDP端口,捕获UDP数据包
2 触发DTLCP解析器函数
3 读取DTLCP Record Header(13字节)
4 解析Epoch和Sequence Number
第三阶段:DTLCP协议解析
1 根据Epoch判断阶段(握手/加密)
2 根据Content Type解析Payload类型
3 处理加密结构或握手消息
4 处理UDP分片逻辑
第四阶段:结果显示
1 所有字段添加到协议树
2 Wireshark界面显示完整解析结果
3 用户查看DTLCP数据包详情
第五阶段:持续循环
1 持续捕获UDP数据包
2 持续解析DTLCP协议
3 持续更新显示结果
7.2 DTLCP与TLCP解析的关键差异
| 对比维度 | TLCP (TCP) | DTLCP (UDP) | Lua插件实现差异 | | — | — | — | — | | 传输层监听 | tcp.port | udp.port | 使用 DissectorTable.get(“udp.port”) | | 协议头部 | 5字节 | 13字节(含epoch/seq) | 解析更多头部字段 | | 序列号 | TCP隐式 | DTLCP显式48位 | 需读取并验证sequence_number | | 阶段标识 | 无显式 | Epoch字段 | 根据epoch判断握手/加密阶段 | | 分片处理 | TCP自动 | DTLCP手动 | 需处理DTLCP消息分片 | | 防重放 | TCP内置 | DTLCP序列号 | 需验证序列号递增 |
7.3 DTLCP Lua插件的核心价值
通过Lua插件,Wireshark能够:
✅ 解析DTLCP特有的Epoch和Sequence Number字段
✅ 识别DTLCP基于UDP的传输特性
✅ 处理DTLCP消息分片和重组
✅ 验证DTLCP防重放机制(序列号检查)
✅ 解析DTLCP加密结构(SM4-CBC/SM4-GCM)
✅ 完整展示DTLCP协议数据(符合GM/T 0128-2023)
整个过程自动化执行,用户只需:
1 编写DTLCP Lua插件脚本(定义epoch/seq等字段)
2 放置到正确目录(%APPDATA%\Wireshark\plugins\)
3 启动Wireshark捕获UDP数据包
4 查看DTLCP解析结果
我是利刃信安,网络安全和密码安全、数据安全领域的小白。
如果你觉得今天这篇有收获,欢迎点赞、在看、转发三连,我们下篇见
点赞
在看
转发
如有疑问,请联系: Mannix6
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:利刃信安 利刃信安 利刃信安《Wireshark加载Lua插件分析DTLCP数据过程》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。








评论