Wireshark加载Lua插件分析DTLCP数据过程

admin 2026-07-12 05:55:04 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文详细介绍了Wireshark通过Lua插件解析DTLCP协议的过程,包括插件加载、协议注册、字段定义和解析逻辑,并对比了DTLCP与TLCP的差异,提供了可操作的实施步骤。 综合评分: 87 文章分类: 安全工具,网络安全,渗透测试,技术标准


cover_image

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数据过程》

评论:0   参与:  0