【问题标题】:Recognize and parse fregmented packet with libpcap使用 libpcap 识别和解析分段数据包
【发布时间】:2020-08-19 10:23:57
【问题描述】:

我用libpcap嗅了嗅,得到了很多像这张图片这样的碎片包

是否有任何简单的方法来识别碎片数据包(当我用pcap_next_ex 读取这个数据包并用 C 代码对这个数据包进行碎片整理时?

【问题讨论】:

    标签: c linux libpcap packet-sniffers


    【解决方案1】:

    有什么简单的方法可以识别分片包

    这取决于你如何定义“简单”。

    您需要解析链路层标头以确定数据包是否为 IPv4 数据包。如果它一个 IPv4 数据包,您将需要解析 the IPv4 header 以查看是否 1)“标志”字段中设置了“更多片段”位或 2)“片段偏移量”字段非零。如果其中任何一个为真,则它是一个 IPv4 片段。

    并用 C 代码对该数据包进行碎片整理?

    您将需要一个按 IPv4 源地址和目标地址以及“标识”字段值索引的表。

    对于每个分段的 IPv4 数据包,查看该表以查看您是否找到具有与分段数据包标头中相同的 IPv4 源地址和目标地址以及相同标识字段值的条目。

    如果您没有找到它,请在表中添加一个条目,并将数据包的内容保存在该条目中。如果 Fragment Offset 值为 0,则保存整个 IPv4 标头以及数据包有效负载,以及它的 Fragment Offset 值、有效负载长度和更多片段标志(是的,这是多余的,因为您有完整的标头,但是您确实要求一个简单的方法:-));否则,只需保存有效负载及其片段偏移值、有效负载长度和更多片段标志。

    如果您确实找到它,那么,如果 Fragment Offset 值为 0,则将 IPv4 标头添加到条目中。然后,不管 Fragment Offset 值如何,将数据包有效负载及其 Fragment Offset 值、有效负载长度和更多片段标志添加到保存的数据包有效负载信息中。这意味着该条目具有 IPv4 标头和 set 数据包负载/片段偏移值/负载长度/更多片段标志组合。

    对于您添加的每个片段,在您添加后,检查是否:

    • 如果您按片段偏移值对片段进行排序,则对于除最后一个片段之外的所有片段,片段偏移值加上该片段的有效负载长度等于下一个片段的片段偏移值;
    • 最后一个片段没有设置了更多片段标志。

    如果是这样,您就拥有了所有片段,并且可以将它们重新组合成一个 IPv4 数据包,其标头是从第一个片段(片段偏移值为 0 的片段)中保存的标头,其有效负载是所有片段的有效载荷。

    (同样,您要求“简单”,所以我不讨论错误处理,例如重叠片段、未设置更多片段的多个片段等。)

    【讨论】:

      猜你喜欢
      • 2013-05-23
      • 2011-08-31
      • 2012-02-19
      • 1970-01-01
      • 2017-06-30
      • 2010-11-20
      • 1970-01-01
      • 2011-05-19
      相关资源
      最近更新 更多