一、设计方案及可行性分析
我们小组的课设选题为基于Wireshark插件的国密标准检测工具的设计与实现,该选题主要提及到的内容有wireshark和国密。国密标准是指我国国家密码管理局发布的密码算法标准,涉及对称加密、非对称加密、哈希算法等多个方面,了解国密标准的细节,包括SM2、SM3、SM4等算法。而Wireshark是一个开源网络协议分析工具,该工具支持通过插件扩展功能。设计插件需要深入了解Wireshark插件的开发框架,掌握相应的API,以实现对国密标准的网络流量检测。
本次课程设计的主要内容就是使用lua语言撰写一个wireshark工具的插件,用来分析在wireshark可以抓到的网络流量的数据包中涉及到国密算法的部分。如TLS通信的数据包中会显示使用的TLS版本、加密算法套件和握手阶段的信息,那么我们就要通过该插件,将本数据包的TLS版本和其在通信中所承担的角色(如更改密码规格协议ChangeCipherSpec、握手协议Handshake)直观地表现在该数据包的名字上。
因此,我们决定将本插件设计为一个可以通过名字简明扼要地说明所抓取数据包的信息的插件。由于TLS协议下所包含的主要子协议有以下几种:
1.握手协议 2.更改密码规格协议 3.告警协议 4.应用数据协议 5.其他协议
因此将所有抓取到的数据包按照以上子协议进行分类,对应以上五种类型,将数据包解析为以下五种:
1.Handshake 2.Change Cipher Spec 3.Alert
4.Application Data 5.Other TLS Content Type
并将对应数据包更名为以上五种,同时在数据包后显示所使用TLS协议的版本。
我们实现以上功能的方式为通过查找国密算法中对应协议在报文中的对应位置,然后在代码中通过检索并识别该位置数据,然后匹配到对应协议,再修改该数据包的名字来实现解析功能。
这个方案明显是可行的,因为在国密算法的网站中以及wireshark中可以找到这些加密算法的信息与位置,通过对lua语言的学习,我们也可以完成代码的撰写。
二、详细设计思路
1.系统体系结构,技术选择;
首先将整个代码分为三大部分。
1)content解析函数
本部分用来解析TLS记录层的content type字段,并根据其值设置协议名称。如果所提取到的字段为14,就是更改密码规格协议,命名为Change Cipher Spec;如果是15,命名为Alert;如果是16,命名为Handshake……
2)TLS解析函数
该函数用来提取 content_type 字段,并调用content解析函数设置协议名称。同时,本函数用来解析TLS的record.version字段和国密算法协商的加密套件,根据版本字段值和协商的加密套件值向wireshark的pktinfo.cols.info列添加其版本信息和国密算法信息。
3)接入函数
用来关联ssl vpn端口和启动对协议进行解析的功能。
2.说明程序中用到的关键数据类型的定义,绘制关键程序的流程图,以及各子模块间的调用关系图;
tvb (Type Value Buffer):这是Wireshark中的一种数据类型,代表了数据包的原始二进制形式。它提供了对数据包数据的访问和操作方法,允许检索特定位置的字节或将字节解释为不同的数据类型。
pktinfo:这个变量似乎是一个数据包信息结构,它包含有关数据包的各种信息,如源端口、目标端口等。通过pktinfo可以设置数据包信息的各种属性。
Proto:这是Wireshark中的一个函数,用于创建新的协议解析器。在这里,使用了Proto()来创建名为ssl_vpn的新协议解析器。
DissectorTable:这是Wireshark的一个函数,用于管理协议解析器的关联。通过 DissectorTable.get("tcp.port")可以获取TCP端口的解析器表。
root:这是Wireshark中的一个概念,表示一个根节点。在Wireshark的解析器中,通常使用这个根节点来构建和展示解析后的数据包树形结构。
函数调用关系:
ssl_vpn_protocol_init() -> dissect_tls_record() -> dissect_tls_record_content_type()
3.列出测试目的、测试内容、测试结果,并对结果进行分析
1)测试目的:
1. 验证插件是否能正确解析SSL VPN协议的数据包。
2. 验证插件是否能正确处理不同的TLS记录层内容类型。
3. 验证插件是否能正确解析和显示TLS版本和加密套件信息。
4. 验证插件是否能正确关联到默认的SSL VPN端口(443)。
2)测试内容:
1. 准备包含不同TLS记录层内容类型的SSL VPN协议数据包,观察插件是否能正确解析和显示这些数据包的内容。
2. 准备包含不同TLS版本和加密套件的SSL VPN协议数据包,观察插件是否能正确解析和显示这些数据包的内容。
3. 在Wireshark中捕获到端口为443的TCP数据包,观察插件是否能自动处理这些数据包。
3)测试结果:
正确解析SSL VPN协议的数据包、处理不同的TLS记录层内容类型。
关联到默认的SSL VPN端口(443)
正确解析和显示TLS版本和加密套件信息
4)结果分析:
插件能正确解析和显示所有测试数据包的内容,说明插件的功能是正确的。能够正确地解析SSL VPN协议,包括内容类型、握手类型、版本和加密套件等信息,并将这些信息正确地显示在Wireshark的信息列中。
三、设计特色
1. 协议解析层次清晰
代码中定义了三个主要的解析函数,分别对应于不同的协议层次。dissect_tls_record_content_type函数解析TLS记录层的内容类型,dissect_tls_record函数解析TLS记录层的其他字段,ssl_vpn_proto.dissector函数则是整个协议的入口,负责调用其他解析函数。这种设计使得代码结构清晰,易于理解和维护。
2. 协议字段解析灵活
代码中使用了多个if-elseif语句,根据字段的值动态地设置协议名称和添加信息列的文本。这种设计使得插件能够灵活地处理不同的协议字段值,提高了代码的通用性。
3. 支持国密算法
代码中特别处理了国密算法协商的加密套件,更符合国内网络安全需求。,显示了插件的定制化特性。
4. 协议关联
在ssl_vpn_protocol_init函数中,将自定义的协议解析器关联到了默认的SSL VPN端口(443)。使得插件能够自动处理对应端口的数据包,提高了使用的便利性。
5. 模块化设计
每个函数都有明确的功能,代码模块化程度高,易于维护和扩展。
四、源代码及注释
-- 这个函数根据TLS记录层的content_type字段设置协议名称
local function dissect_tls_record_content_type(tvb, pktinfo, root)
if tvb:len() < 1 then
return
end
-- 提取content_type字段的值
local content_type = tvb(0, 1):uint()
-- 根据content_type字段的不同值设置不同的协议名称
if content_type == 0x14 then
pktinfo.cols.protocol:set("Change Cipher Spec")
elseif content_type == 0x15 then
pktinfo.cols.protocol:set("Alert")
elseif content_type == 0x16 then
pktinfo.cols.protocol:set("Handshake")
elseif content_type == 0x17 then
pktinfo.cols.protocol:set("Application Data")
else
pktinfo.cols.protocol:set("Other TLS Content Type")
end
end
-- 这个函数解析TLS记录层,包括解析content_type、version和国密算法协商的加密套件
local function dissect_tls_record(tvb, pktinfo, root)
-- 记录层的content_type字段位于偏移量为0的位置
local content_type_offset = 0
-- 记录层的handshake_type字段位于偏移量为5的位置
local client_hello_offset = content_type_offset + 5
-- 提取记录层的handshake_type字段
if tvb:len() < client_hello_offset + 1 then
return
end
local client_hello = tvb(client_hello_offset, 1):uint()
-- 创建一个树节点来表示记录层
local record_item = root:add("TLS Record Layer")
-- 提取记录层的content_type字段
if tvb:len() < content_type_offset + 1 then
return
end
local content_type = tvb(content_type_offset, 1):uint()
record_item:add("Content Type: " .. tostring(content_type))
-- 调用函数根据content_type字段设置协议名称
dissect_tls_record_content_type(tvb(content_type_offset, 1), pktinfo, record_item)
-- 解析tls.record.version字段
local version_offset = content_type_offset + 1 -- 偏移量为1
if tvb:len() < version_offset + 2 then
return
end
local version = tvb(version_offset, 2):uint()
-- 根据版本字段值向信息列添加特定的文本信息
if version == 0x0101 then
pktinfo.cols.info:append(" Version: TLCP")
elseif version == 0x0303 then
pktinfo.cols.info:append(" Version: TLS 1.2")
elseif version == 0x0301 then
pktinfo.cols.info:append(" Version: TLS 1.0")
else
pktinfo.cols.info:append(" Version: Unknown")
end
-- 解析国密算法协商的加密套件
local cipher_suite_offset1 = content_type_offset + 46
local cipher_suite_offset2 = content_type_offset + 78
local cipher_suite_offset3 = content_type_offset + 76
-- 检查数据包长度以避免超出范围
if tvb:len() < cipher_suite_offset1 + 2 or tvb:len() < cipher_suite_offset2 + 2 or tvb:len() < cipher_suite_offset3 + 2 then
return
end
-- 提取国密算法协商的加密套件值
local cipher_suite1 = tvb(cipher_suite_offset1, 2):uint()
local cipher_suite2 = tvb(cipher_suite_offset2, 2):uint()
local cipher_suite3 = tvb(cipher_suite_offset3, 2):uint()
-- 根据协商的加密套件值添加信息
if client_hello == 0x01 then
if cipher_suite1 == 0xe013 then
pktinfo.cols.info:append(" Cipher Suite: ECC_SM4_CBC_SM3 ")
elseif cipher_suite1 == 0xc030 then
pktinfo.cols.info:append(" Cipher Suite: TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 ")
end
if cipher_suite2 == 0xe013 then
pktinfo.cols.info:append(" Cipher Suite: ECC_SM4_CBC_SM3 ")
elseif cipher_suite2 == 0xc030 then
pktinfo.cols.info:append(" Cipher Suite: TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 ")
end
end
if cipher_suite3 == 0x003c then
pktinfo.cols.info:append(" Cipher Suite: TLS_RSA_WITH_AES_128_CBC_SHA256 ")
end
end
-- 初始化SSL VPN协议解析
local function ssl_vpn_protocol_init()
local ssl_vpn_proto = Proto("ssl_vpn", "SSL VPN Protocol")
function ssl_vpn_proto.dissector(tvb, pktinfo, root)
local tree = root:add(ssl_vpn_proto, tvb())
-- 调用记录层解析函数
dissect_tls_record(tvb, pktinfo, tree)
end
-- 关联到默认的SSL VPN端口(443)
local tcp_table = DissectorTable.get("tcp.port")
tcp_table:add(443, ssl_vpn_proto)
end
-- 开始SSL VPN协议解析
ssl_vpn_protocol_init()
五、个人报告
1.小组贡献排序及依据(每个人的工作量):
王琛凯:完成40%
负责调整代码,完成了代码最重要的协议解析功能。在课程设计遇到瓶颈的时候找到了正确的方向,完成了协议解析和国密算法解析的代码。
李天赐:完成30%
负责推进小组各项工作,组织召开小组会议。负责前期收集资料,确定了课程设计思路和方向,完成了读取偏移量的代码。
邹雪梅:完成30%
负责完成国密相关内容的整理学习。负责代码功能的调试与漏洞的修复,解决了代码不能正常运行的问题。
2.个人报告(20211304王琛凯):
a) 列出自己的贡献:
程序框架设计及主要代码编写
b) 列出设计中遇到的问题及解决方法
(1)协议字段提取问题:
--问题描述:在解析记录层时,出现协议字段提取错误的问题,导致无法准确识别TLS记录的内容类型。
--解决方法:使用正确的偏移量和长度来提取协议字段。确保提取的字段与TLS协议规范相匹配,以便准确识别内容类型。根据国密标准和wireshark视窗可以得知不同字段在记录层的偏移量。
(2)版本字段解析问题:
--问题描述:解析TLS记录时,遇到版本字段提取错误,导致无法正确识别TLS版本。
--解决方法:确认版本字段的偏移量和长度是否正确。对比协议规范,使用正确的字节顺序解析版本字段,确保准确识别TLS版本。
(3)协议识别准确性问题:
--问题描述:解析器对不属于TLS协议的数据包进行错误解析,导致解析器识别错误。像有的TCP数据包被当作TLS协议的数据包进行解析。
--解决方法:增加更准确的协议识别逻辑,通过检查内容类型字段来确保仅对TLS协议的数据包进行解析。
(4)Wireshark Lua API使用问题:
--问题描述:在编写Lua解析器时,遇到对Wireshark Lua API函数的不熟悉或误用。
--解决方法:通过阅读API文档、查阅示例代码和在线资源来学习和了解Wireshark Lua API的使用方法。在使用新函数或方法时先进行简单的测试。
(5)性能优化问题:
--问题描述:解析器因数据包复杂性或低效算法导致性能下降。
--解决方法:优化代码逻辑,避免不必要的计算或循环。使用Wireshark Lua API提供的高效函数,并对复杂操作进行优化。
c) 列出调试过程中遇到的主要问题,并说明解决方法:
(1)字段提取错误:
--问题描述:在测试阶段发现提取字段值与预期不符合,导致协议字段解析错误。
--解决方法:使用调试语句打印提取字段的值,逐步确认偏移量和长度是否正确,从而定位并修复提取错误。
(2)错误处理问题:
--问题描述:在解析器中遇到未能正确处理异常情况的问题,如空包或字段缺失。
--解决方法:添加适当的错误处理机制,使用条件语句检测异常情况,并在出现异常时进行日志记录或提供警告信息。
d) 设计体会及收获:
规范与实现之间的桥梁:解析器的设计需要对协议规范有深入理解,同时结合Wireshark提供的Lua API实现具体的解析逻辑。将规范和实际实现有机地结合是设计过程中的重要一环。
灵活性与准确性的平衡:解析器需要保持足够的灵活性以适应不同数据包的解析,同时确保对协议的准确识别。平衡两者的关键是细致的测试和对协议规范的精准理解。
代码优化与性能:解析器的性能直接影响着Wireshark的效率。通过优化代码逻辑和合理利用API函数,可以提高解析器的性能,从而更好地应对大量数据包的解析。
更深入了解TLS协议:通过对TLS记录层的解析,我更深入地理解了TLS协议的结构和功能。这让我对网络安全领域有了更全面的认识。
学习和掌握Wireshark Lua API:通过实践和查阅文档,我更加熟悉了Wireshark Lua API的使用方法和特性,增强了自己的编程能力和问题解决能力。
错误排查和调试技能:解析器的开发过程中,遇到了不少问题,但通过逐一排查和调试,我学会了快速定位问题并提出解决方案的能力。
设计思维与工程实践:这次经历增强了我的设计思维,从理论到实践,需要深入分析并将其转化为实际的代码。这种转化过程是对工程实践的重要锻炼。
e) 参考资料(图书、网址…)
《Wireshark网络分析从入门到实践》
https://mp.weixin.qq.com/s/lPrgqnFGfqSDFwFN5cjSQQ
https://zhuanlan.zhihu.com/p/362748246
https://zhuanlan.zhihu.com/p/114669991
https://zhuanlan.zhihu.com/p/659794500
3.个人报告(20211315邹雪梅):
a)列出自己的贡献
代码运行报错修改,越界检查等辅助部分的编写,插件运行测试,参与插件设计,小组报告中负责:二、3列出测试目的、测试内容、测试结果,并对结果进行分析,三、设计特色部分的撰写。
b)列出设计中遇到的问题及解决方法
问题1:协议字段解析错误
解决方法:
正确理解SSL协议,通过查阅资料和抓包实践分析了解每个字段的位置和含义。然后,检查代码,确保要从数据包中提取字段的值的与代码中对应。注:过程中可以使用Wireshark的内置协议解析器作为参考。
问题2:插件无法正确关联到端口
解决方法:
检查DissectorTable.get和tcp_table:add调用是否正确。确保使用的端口号是正确的,有我们要解析的协议的数据包。
问题3:插件对特定协议版本的支持不完全
解决方法:
在设计插件时,需要确保对协议的各个版本都有充分的理解和支持。如果发现对某个版本的支持不完全,需要查阅相关的协议文档,理解版本之间的差异,并在代码中添加对新版本的处理逻辑。(目前没有发现统一的解决方法,只能在遇到不支持的协议时添加新的符合新协议的代码)
问题4:插件在处理特殊情况时出错
解决方法:
在某些包中可能出现解析出来的protocol名不是协议名而是一个字段值,这主要需要在设计插件时,需要考虑到协议的各种特殊情况,例如数据包的字段可能为空,或者数据包的长度可能超出预期等。对于这些特殊情况,需要在代码中添加相应的错误处理逻辑。以及在发现问题时新增解决对应问题的代码。
问题5:插件的兼容性问题
解决方法:我们组就出现了在其他两位成员电脑上能正确运行的代码到我这里报错的现象,尝试了两种解决方法,一开始是添加新的代码,使他兼容我的版本,另一种是将自己的wireshark换成和他们一样的版本。通过查阅资料我们了解搭配如果插件在某些版本的Wireshark上无法正常工作,可能是因为使用了一些不兼容的API。对于这种问题,需要查阅Wireshark的API文档,了解API的兼容性信息,并在代码中添加对不同版本Wireshark的兼容性处理。
c)列出调试过程中遇到的主要问题,并说明解决方法;
问题1:在按照示例插件制作博客测试示例代码时出现报错(插件无法加载)
解决方法:
去查找了另外的相关博客,将插件代码转移到plugins文件夹而不是直接放在wireshark根目录,也不需要修改根目录相关文件代码,在wireshark页面选择“分析”、“重新载入插件”即可正常运行。
问题2:代码报错range is our of bounds
解决方法:
在提取client_hello和content_type字段之前增加对tvb长度的检查,防止越界访问。
在提取cipher_suite1、cipher_suite2和cipher_suite3字段之前增加对tvb长度的检查,防止越界访问。
问题3:示例博客使用的xcap发送的包不能被wireshark抓取到
解决方法:
因为电脑之前创建过许多虚拟机,所以要找准正确的发包设备,在wireshark中合理使用筛选功能
问题4:命令行中可以执行单条lua代码但是不能运行lua文件
解决方法:
首先要正确配置环境(尤其是Windows,Linux下直接下载一般就可以用)然后注意不要进入lua文件夹,直接运行相关命令即可。
问题5:Lua语法错误
解决方法:
使用Lua语法检查工具,如luacheck,检查代码中的语法错误,并根据工具的反馈修正错误。
d)设计体会及收获
1. 理解协议的重要性:在设计Wireshark插件时,对协议的理解是非常重要的。只有深入理解协议的结构和含义,才能编写出正确的解析代码。这需要阅读大量的协议文档,甚至需要阅读协议的源代码。
2. 代码的可读性和可维护性:在编写代码时,需要注意代码的可读性和可维护性。这包括使用清晰的变量名,添加必要的注释,以及保持代码的结构清晰。这样不仅可以提高自己的开发效率,也可以方便其他人阅读和修改代码。我们组的代码属于可维护性较强的代码,这也使得我们在编写过程中增加新的协议变得很简单
3. 错误处理的重要性:在处理网络数据包时,需要考虑到各种可能的错误情况,例如数据包的字段可能为空,或者数据包的长度可能超出预期等。对于这些错误情况,需要在代码中添加相应的错误处理逻辑。我们组出现了两次越界报错,最后通过添加代码得以使插件正常运行,这也提醒我们在编写插件时要注意错误处理
4. 测试的重要性:在开发完插件后,需要进行充分的测试,确保插件的功能是正确的。这包括对插件的基本功能进行测试,也包括对插件的异常处理能力进行测试。只有经过充分的测试,才能确保插件在实际使用中的稳定性。我们组测试插件时发现在不同版本的wireshark,不同的数据包时,可能出现插件运行结果错误,所以多测试才能不断完善我们的插件。
5. 持续学习和改进:在开发过程中,可能会遇到各种未知的问题。这需要我们有持续学习和改进的精神,不断查阅相关的文档和资料,不断尝试新的解决方案,不断优化和改进我们的代码。此次课程设计过程中我们不仅学习了老师给的参考资料,还到微信读书,知乎,CSDN有找了其他博客和书籍进行学习,遇到问题也及时积极查找解决方法,过程中也发现了和lua语言相关的一些好用的软件,比如如果插件处理数据包的速度太慢,需要优化代码。可以使用Lua的性能分析工具,如luaprofiler,找出性能瓶颈,并优化相关的代码。
e)参考资料(图书、网址...)
《Wireshark网络分析从入门到实践》
《自己动手实现lua:虚拟机、编译器和标准库》
https://zhuanlan.zhihu.com/p/114669991
https://zhuanlan.zhihu.com/p/659794500
https://blog.csdn.net/Little_Eyelash/article/details/115242195
https://blog.csdn.net/qq_40421919/article/details/103516694
http://www.gmbz.org.cn/main/bzlb.html
2.个人报告(20211303李天赐):
a)列出自己的贡献:
小组整体工作的推进和程序设计思路的确立,完成了前期代码结构搭建和初步撰写。
b)列出设计中遇到的问题及解决方法
(1)思路问题:
--问题描述:在我们最开始设计程序的时候,先打算拿TLS协议中的三次握手协议的过程来练手,通过显示handshake这个信息来进行解析。当时的想法是,在握手协议中,SYN这个信息是会从0开始的,因此只要找到SYN为0的字段,就可以识别到这个数据包,然后更改其名称。但是编写代码并运行后,发现并不能准确地抓到这样的包,而且还会把所有TLS数据包过滤掉。
--解决方法:出现这个问题的原因是我们没有找到正确的条件。在代码中,我们是读取到SYN这个字段,如果它等于0,那么就改名。但事实上,TLS握手协议中只有极少数情况SYN是等于0的,而且这个代码编写的也不正确,反而将所有TLS包全部识别到,然后一口气全部不显示了。因此我们通过查阅资料、又结合课程设计要求,和别的小组同学讨论后,决定采用使用的偏移量和长度来提取协议字段并与TLS协议规范相匹配,以准确识别内容类型的方法。根据国密标准和wireshark视窗可以得知不同字段在记录层的偏移量。
(2)协议字段读取问题:
--问题描述:解析TLS协议中不同字段时,遇到版本字段提取错误,导致无法正确识别TLS的子协议。
--解决方法:出现这个问题的原因是因为我们用来读取字段的方式错误。我们使用了
local protocol_field = get_protocol_field()
这样一个方式来读取字段,但是它所索引的字段其实是一个空值,它没能定位到正确的初始值与偏移量。我们之后修改了代码,通过逐次使用正确的偏移量和长度来提取协议字段来确保提取的字段与TLS协议相匹配,以识别协议的类型。
(3)国密算法解析问题:
--问题描述:插件最开始并没有能够进行解析国密算法的功能,当时我们对于国密算法在TLS协议中的运用的理解不够深入。
--解决方法:通过学习TLS协议、国密算法和对wireshark所读取的数据包的分析,发现在很多TLS通信包中均可以找到国密算法的加密信息。通过查找其在数据包中的位置,然后修改代码,添加了显示加密算法的功能。
(4)Wireshark插件接入问题:
--问题描述:在编写插件时,遇到了不知道该怎么接入wireshak的问题
--解决方法:通过对于教程《Wireshark网络分析从入门到实践》中撰写wireshark插件的章节的学习,掌握了基础知识,进行了foo插件设计。
c)列出调试过程中遇到的主要问题,并说明解决方法:
(1)字段提取错误:
--问题描述:Lua: Error during loading:
C:\Program Files\Wireshark\plugins\4.0\Couredesign.lua:56: attempt to index a nil value
stack traceback:
C:\Program Files\Wireshark\plugins\4.0\Couredesign.lua:56: in function 'tls_protocol_identification'
C:\Program Files\Wireshark\plugins\4.0\Couredesign.lua:60: in main chunk
Lua: Error during execution of initialization:
C:\Program Files\Wireshark\plugins\4.0\Couredesign.lua:51: invalid field
Lua: Error during execution of initialization:
C:\Program Files\Wireshark\plugins\4.0\Couredesign.lua:51: Field__call: Fields cannot be used outside dissectors or taps
遇到了无法正确提取字段的错误。
--解决方法:没有使用正确的字段,导致读取到了错误的内容,没能进行正确匹配。在对照国密算法和TLS协议进行修改后解决。
(2)错误处理机制问题:
--问题描述:当插件出现问题的时候,没有相应的报错提示
--解决方法:加入适当的错误处理机制,以捕获并记录潜在的解析错误。
(3)加密套件检查问题
--问题描述:最开始对于加密套件没有进行合理的分类,导致只会粗略显示,不能有效解析
--解决方法:对于 client_hello 等于不同字段的情况,检查多个加密套件并进行匹配和相应的显示
d)设计体会及收获:
(1)一步步来的重要性
在最开始学习的时候,真的感觉到不能急于求成。我们一上来想的就是先做个代码试试,于是就用一种不合理的思路编写了一个有问题的代码出来,不仅无法实现想要的功能,还在调试和修改上花了很多时间,是很不值得的。归根结底就是想要一步登天,还没有学习国密算法和wireshark数据包、TLS通信数据包的特征就开始用自己的思路来解释这个程序,导致出现了插件与软件完全不匹配的情况。
在设计程序之前,应该进行充分的学习与了解,对于自己要使用的技术、要完成的功能、完成该功能的思路和方法有一个合理正确的设计以后再动手,可以减少不必要的时间精力损耗。
(2)理解协议结构
在设计 Wireshark 插件之前,深入了解要解析的协议结构是至关重要的。对于 TLS 协议而言,了解记录层、握手协议等组成部分的结构有助于编写有效的解析代码。而在代码中对协议字段的处理需要灵活和准确。
(3)代码的模块化设计
通过将不同功能拆分为独立的函数,可以实现更模块化的设计。在我们的代码中,设计时就划分了几个大块的功能,分别编写了处理记录层和处理记录层 content_type 的两个函数,提高了代码的可读性和可维护性。当然,良好的注释和命名规范也是编写代码时重要的一环。对函数和变量进行清晰的命名,有助于记录代码的功能和设计思路。
(4)版本处理与兼容性考虑
对于协议版本的处理需要谨慎,确保代码适用于多个版本。在代码中,对不同版本的 TLS 协议给出了相应的处理逻辑,并考虑了未知版本的情况。
e)参考资料(图书、网址…)
《Wireshark网络分析从入门到实践》
https://mp.weixin.qq.com/s/lPrgqnFGfqSDFwFN5cjSQQ
https://zhuanlan.zhihu.com/p/362748246
https://zhuanlan.zhihu.com/p/114669991
https://zhuanlan.zhihu.com/p/659794500
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类