个人报告(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