0
点赞
收藏
分享

微信扫一扫

Wireshark的LUA插件处理数据包遇到实际数据长度小于预期长度

洲行 2024-05-05 阅读 14

在Wireshark的LUA插件中处理数据包时,如果遇到实际数据长度小于预期长度(data_length)的情况,需要在代码中添加错误处理逻辑以避免解析错误或程序崩溃。这种情况可能会出现在数据包被截断或损坏时。以下是如何修改之前的解析器函数,以便正确处理这种情况的步骤:

修改解析器以处理数据长度问题

我们需要首先检查从TCP流中接收的数据包大小是否至少等于预期的数据头部长度(命令+长度字段)加上data_length指示的数据长度。如果不足,这可能意味着数据包已被截断,或是存在某种错误。

下面是包含错误处理逻辑的LUA脚本:

function p_myproto.dissector(buffer, pinfo, tree)
    pinfo.cols.protocol = p_myproto.name

    local subtree = tree:add(p_myproto, buffer())
    subtree:add(f_command, buffer(0,2))
    subtree:add(f_length, buffer(2,2))

    local data_length = buffer(2,2):uint()
    local actual_length = buffer:len() - 4  -- 从数据部分开始到包的末尾的长度

    -- 检查实际数据长度是否小于预期的数据长度
    if actual_length < data_length then
        -- 实际数据长度小于从长度字段中解析出的长度
        subtree:add_expert_info(PI_MALFORMED, PI_ERROR, "Data length mismatch: Actual data shorter than length field indicates")
        subtree:add(f_data, buffer(4, actual_length))  -- 只添加实际存在的数据
    else
        -- 数据长度匹配或者数据更长(通常情况下,应只有恰好相等的情况,除非协议有误)
        subtree:add(f_data, buffer(4, data_length))
    end
end

解释修改部分

  • buffer:len():此函数返回整个数据包的长度。
  • actual_length:这里计算实际的数据长度(去掉前4个字节的命令和长度字段后的长度)。
  • if actual_length < data_length then:通过这个条件判断,我们检查解析出的数据长度是否小于长度字段中指定的长度。
  • subtree:add_expert_info:当检测到数据长度不匹配时,向Wireshark的用户界面添加一个错误信息,提示数据长度不符。这有助于调试和识别问题。
  • buffer(4, actual_length):在数据长度不足的情况下,只添加实际可用的数据部分,防止尝试解析不存在的数据导致错误。

通过上述修改,插件能够更健壮地处理可能出现的数据包不完整情况,帮助维护解析过程的稳定性和可靠性。这种错误处理对于网络分析和协议开发非常关键,特别是在网络条件不稳定或存在恶意数据流的环境中。

举报

相关推荐

0 条评论