课程设计个人报告

个人报告20211317李卓桐

a)列出自己的贡献

1.进行系统的Lua语言学习,以及Wireshark软件的使用复习,对数据包的各个字段进行学习和分析,最后通过编写测试插件并应用在Wireshark中进行初步尝试。

  • Lua是一种轻量级的脚本编程语言,经常用作嵌入式系统中的脚本语言。它是一种动态类型的语言,具有简洁的语法和高度可定制性。以下是一些关于Lua的简单介绍:
    轻量级: Lua的设计目标之一是轻量级,它的核心库非常小,这使得它非常适合用作嵌入式系统中的脚本语言。
    动态类型: Lua是一种动态类型语言,变量的类型在运行时确定。这使得编码更加灵活,但也可能导致一些类型相关的错误只能在运行时发现。
    垃圾回收: Lua具有自动内存管理,采用垃圾回收机制来管理内存。这使得开发者无需手动管理内存,减轻了一些与内存管理相关的负担。
    嵌入性: Lua被设计为嵌入到其他程序中的脚本语言。它可以很容易地集成到各种应用程序和系统中,例如游戏引擎、嵌入式设备和应用软件。
    简洁的语法: Lua的语法非常简洁和易学,它采用了类似于其他脚本语言的控制结构,如条件语句、循环语句等。
    面向过程和函数式编程: Lua支持面向过程和函数式编程范式。它有强大的函数支持,包括匿名函数和闭包。
    可扩展性: Lua具有良好的可扩展性,允许开发者通过C语言扩展其功能,从而满足更复杂的需求。
    跨平台: Lua是跨平台的,可以在多种操作系统上运行,包括Windows、Linux和macOS等。

入门语法

当你开始学习Lua时,了解一些基本的语法是很重要的。以下是一些Lua的简单入门语法:
注释:Lua使用两个连字符(--)表示单行注释。

-- 这是一个单行注释

变量和赋值:Lua是动态类型语言,不需要显式声明变量类型。变量名区分大小写。

-- 变量赋值
myVar = 10
anotherVar = "Hello, Lua!"

数据类型:Lua有基本的数据类型,包括数字、字符串、布尔值等。

num = 42
str = "Lua programming"
bool = true

条件语句:Lua使用if语句进行条件判断。

if num > 0 then
    print("Number is positive")
elseif num < 0 then
    print("Number is negative")
else
    print("Number is zero")
end

循环: Lua提供for和while循环。

-- for 循环
for i = 1, 5 do
    print(i)
end
-- while 循环
local counter = 0
while counter < 5 do
    print(counter)
    counter = counter + 1
end

函数:使用function关键字定义函数。

function greet(name)
    print("Hello, " .. name .. "!")
end
greet("Lua")

表(Table):表是Lua中的主要数据结构,类似于其他语言中的数组和字典。

-- 创建表
myTable = {1, 2, 3, key="value"}
-- 访问表元素
print(myTable[2])  -- 输出:2
print(myTable.key) -- 输出:"value"

字符串操作: Lua提供了丰富的字符串操作功能。

str1 = "Hello, "
str2 = "Lua!"
result = str1 .. str2 -- 字符串拼接
print(result)        -- 输出:"Hello, Lua!"

这些是Lua的一些基本语法.

用Lua编写Wireshark脚本的实践

实例

以下是一个简单的Lua脚本,作为Wireshark插件,用于解析并显示HTTP协议的信息:

-- Wireshark插件示例:解析HTTP协议
-- 插件的基本信息
do
    -- 插件的名称和版本
    plugin_info = {
        version   = "1.0.0",
        author    = "Your Name",
        repository= "Your Repository",
        lic_text  = "MIT License",
        -- 插件的主要描述
        description = "Custom Lua dissector for HTTP protocol",
    }
end
-- 解析HTTP协议
do
    -- 协议的名称和描述
    local http_protocol = Proto("custom_http", "Custom HTTP Protocol")
    -- 定义协议的字段
    local fields = http_protocol.fields
    fields.method  = ProtoField.string("custom_http.method", "Method")
    fields.uri     = ProtoField.string("custom_http.uri", "URI")
    fields.version = ProtoField.string("custom_http.version", "HTTP Version")
    -- 解析函数
    function http_protocol.dissector(buffer, pinfo, tree)
        -- 创建协议树
        local subtree = tree:add(http_protocol, buffer(), "Custom HTTP Protocol Data")
        -- 解析并显示字段信息
        subtree:add(fields.method, buffer(0, 3))
        subtree:add(fields.uri, buffer(4, 10))
        subtree:add(fields.version, buffer(15, 8))
        -- 添加协议描述到Packet Details面板
        pinfo.cols.protocol:set("Custom HTTP")
    end
    -- 将协议绑定到TCP端口80
    local tcp_table = DissectorTable.get("tcp.port")
    tcp_table:add(80, http_protocol)
end

运行流程

  1. 编写插件脚本: 创建一个Lua脚本,按照Wireshark插件的编写规范编写。确保脚本中包含插件信息、协议定义以及解析函数等必要内容。
  2. 保存脚本: 将编写好的Lua脚本保存到Wireshark的插件目录中。Wireshark的插件目录通常位于安装目录的plugins文件夹下。在Windows系统中,可能是C:\Program Files\Wireshark\plugins,在Linux系统中,可能是/usr/share/wireshark/plugins。
  3. 检查插件加载: 打开Wireshark,然后在菜单栏中选择“Help” > “About Wireshark”。在弹出的对话框中,你应该能够看到已加载的插件列表。确保你的插件在列表中出现。
  4. 捕获数据: 开始进行网络数据捕获。Wireshark将会自动应用你的插件来解析和显示符合你定义的协议的数据包。

  5. 查看解析结果: 在捕获窗口中,你可以选择特定的数据包,然后在“Packet Details”面板中查看插件解析的协议信息。

    成功解析到custom http的协议内容

2.通过相应lua插件编程知识,对团队成员编写的代码进行改进和优化,增加了错误处理的代码并实现了更加详细的信息的解析,包括TLS版本信息、密码套件信息、证书信息等。代码如下:

    -- 提取TLS版本信息
    local tls_version = tvb(1, 2):uint()
    pktinfo.cols.info:set("TLS版本: " .. tostring(tls_version))

    -- 提取密码套件信息
    local cipher_suites_offset = 43
    local cipher_suites_length = tvb(cipher_suites_offset, 2):uint()
    local cipher_suites_data = tvb(cipher_suites_offset + 2, cipher_suites_length)
    local cipher_suites = parse_cipher_suites(cipher_suites_data)
    pktinfo.cols.info:append("密码套件: " .. table.concat(cipher_suites, ", "))

    -- 解析证书信息
    local certificates_offset = cipher_suites_offset + cipher_suites_length + 2
    local certificates_length = tvb(certificates_offset, 3):uint24()
    local certificates_data = tvb(certificates_offset + 3, certificates_length)
    local certificates = parse_certificates(certificates_data)
    pktinfo.cols.info:append("证书信息: " .. table.concat(certificates, ", "))
  • 错误处理代码如下
if not success then
            pktinfo.cols.protocol:set("SSL VPN - 解析错误")
            pktinfo.cols.info:append("错误信息: " .. tostring(error_message))
        end`


SSL/TLS - Record Layer Protocol: 描述了该数据包所使用的协议和协议的层次。在这里,它是SSL/TLS协议的Record Layer。

b)列出设计中遇到的问题及解决方法

  • 问题1:在刚开始收到题目时对题目的理解不够清晰,不清楚具体要如何实现。对于密标委的协议也不是很清晰
  • 解决方法:在与团队成员和老师的沟通中,对题目有了更加清晰的认识和理解,明白了具体要用lua插件编写什么样的代码实现协议的功能。在查阅了相关CSDN博客,并运用ChatGPT了解相关知识后,对插件的设计有了深层次的理解,通过对sslvpn的六个子协议进行分析设计,实现更加详细信息的编写。
  • 问题2:对于lua插件的编写过程中,不知道如何在vs code中对代码进行调试和运行,是否可以运行等。
  • 在询问了ChatGPT后,得知Wireshark 提供了一个 Lua 控制台,可以通过 Tools -> Lua -> Console 打开。在这个控制台中,你可以运行 Lua 代码,并查看输出结果。这对于快速测试和调试 Lua 代码片段非常方便。
  • 问题3 在编写 Lua 插件时,遇到对 Wireshark API 不熟悉导致无法正确解析协议字段的问题。
  • 解决方法:深入学习 Wireshark API 文档,了解不同的函数和方法,以确保正确地提取和解析协议字段。查看 Wireshark 的文档、示例插件以及社区论坛,这些资源都可以提供关于 API 的详细信息和实际用例。在编写插件的过程中,不断尝试并查看调试输出,确保每个步骤都按预期执行。在遇到问题时,可以将代码片段贴到相关的技术社区上,寻求其他开发者的帮助和建议。

c)列出调试过程中遇到的主要问题,并说明解决方法;

  • 问题1:最初在编写测试lua插件时无法在Wireshark中加载。
  • 解决方法:在编写好lua插件后需要将插件文件放置在与wireshark插件的对应文件夹中,在我的电脑里即C:\Program Files\Wireshark\plugins
  • 问题2:我在用lua编写wireshark测试插件时,发现解析的是不正确的字段,同时输出不够清晰,或者出现分析错误的情况。
  • 解决过程:我在关键位置添加详细的调试信息,包括变量值、执行流程等。使用print或io.write输出信息,并在Wireshark的控制台查看。可以使用debug库提供更丰富的调试信息。例如,使用debug.print() 或 debug.dump() 输出变量值、表格内容等。添加错误处理机制,如输入验证、异常处理等,以应对不规范或异常的报文
  • 问题3:插件在解析特定协议字段时,wireshark报错,导致 Wireshark 运行崩溃。
  • 解决方法,在检查了代码后发现出现了不必要的循环和重复操作,插件稳定性差导致Wireshark在运行中缓慢甚至崩溃,通过优化 Lua 插件的代码,并重启Wireshark实现。

d)设计体会及收获

    在这次的课程设计中,我负责设计并优化了基于Wireshark插件的国密标准检测工具。一开始对于题目的理解并不是很清晰,但在后面与同学和老师的沟通后,我逐渐明确了任务,就是针对SSL_VPN协议进行Lua插件编写和解析。
    在查阅了SSL_VPN0024密码标准协议后,我成功地编写了Wireshark插件的Lua代码。通过该插件,我实现了对SSL VPN相关数据的深度解析,涉及了Alert Protocol、client hello、Record Layer Protocol等多个方面的检测。以下是我的一些心得体会:
    首先,深入理解协议标准是整个工程的关键。通过详细研读SSL_VPN0024密码标准,我能够准确地捕捉和解析SSL VPN流量中的关键信息。这种深度理解对于正确实现解析器至关重要。
    其次,良好的模块化设计使得代码更易读、易维护。将不同功能划分成独立的函数,使得代码结构清晰,也方便今后对代码的扩展和修改,这对于团队协作和长期维护是非常有帮助的。
    调试和输出信息是我设计中另一个关注点。通过添加调试信息和输出信息,我能够及时发现并解决代码中的问题。这在实际调试过程中起到了关键作用,也有助于代码的优化和改进。
    在插件的设计中,我采用了灵活的协议检测方法,通过检查端口号和TCP三次握手来确定SSL VPN流量。这种设计使得我的工具更具通用性和适应性,可以适用于不同的环境和配置。
    最后,我在插件中进行了对SSL握手和记录层等不同协议的详细解析。这使得我的工具能够提供更为丰富的信息,不仅仅是检测SSL VPN流量,还能深入到协议的细节,为网络分析提供更全面的视角。
    这次课程设计让我更深入地了解了网络协议和Wireshark插件开发,也提升了我的实际动手能力。通过不断挑战和解决问题,我对网络安全领域有了更深层次的认识。我期待继续学习和应用这些知识,不断提升自己在网络安全领域的技术水平。

e)参考资料(图书、网址…)

  • 《Lua程序设计(第四版)》
    我在第一周就开始通过微信读书阅读这本书学习相关lua语言的相应插件编写基础,并通过实操学会了算术运算、关系运算、输入输出等编程规则。

  • CSDN博客:如何用wireshark加载自定义.lua脚本
    这篇博客教会了我如何使用自定义的lua脚本,然后在wireshark将自定义的lua脚本加载到内存中。

  • 《SSL VPN技术规范GM/T 0024–2014》
    下载链接: 原创立文档

    通过研读这篇0024国家密码标准,我理解了SSL_vpn协议的相关子协议如记录层协议、握手协议、网关到网关协议、密钥规格变更协议等。

  • SSL网关国密标准GMT0024-2014

posted @ 2023-12-16 17:45  LLLZTTT  阅读(7)  评论(0编辑  收藏  举报
$