• pcapReader——源代码分析


    一、简单介绍 

           pcapReader是ndpi开源中的一个example。

    大家能够从<ndpi directory>/example/pcapReader.c中找到它的源码。通过pcaplib和ndpi相结合。进行深度包检測。尽管仅仅有短短的几行代码,可是他将展现的不仅是pcaplib和ndpi的用法,还有包分析的一些技巧。看完之后事实上外国人写的程序也就是那样,并没有什么特别之处。我们先来一起看看主要的函数结构。

            注:我们仅仅对源代码中的linux平台部分进行解释

             在main函数中,通过调用test_lib()对程序进行整合。

       

             
          这里限于篇幅,主要对runPcapLoop()函数中的动作进行分析。假设想理解其它函数或者更加具体的技术细节,能够阅读博客最后的源代码附录。里面有比較具体的凝视。假设还有问题,能够留言或者发一下私信。欢迎大家一起讨论。

    二、包分析

            runPcapLoop()函数中通过pcap_loop(_pcap_handle, -1, &pcap_packet_callback, NULL)进行循环抓包。pcap_loop是pcaplib中提供的api。

    _pcap_handle指向的是网卡设备,pcap_packet_callback是循环抓包之后的包处理函数,-1代表的是不停地抓直到抓包出错的时候停止。

    接下来我们针对pcap_packet_callback函数中的包处理进行分析


    1)pcap_packet_callback函数

    pcap_packet_callback函数中,按顺序分成4个主要部分:
             1、ndpi_ethhdr进行数据链路层的拆包分析。针对Linux Cooked Capture 和vlan的特殊包结构。

    对包头和信息进行了相应的偏移,而且记录在ip_offset变量中。

             2、ndpi_iphdr进行网络层的拆包。

    这里进行了ipv4和ipv6的检測。我们接下来仅仅对ipv4进行介绍。

             3、GTP隧道协议的处理
             4、packet_processing()函数进一步的包处理
             注:2中的网络层拆包存储在iph变量中,并在packet_processing()中作为ndpi协议检測的数据源
              
    packet_processing函数作为ndpi分析的主体,这里通过get_ndpi_flow函数分类会话。然后利用ndpi_detection_process_packet函数进行数据分析得到应用层协议。我们继续往下看看get_ndpi_flow是如何建立起数据结构的。
           注:get_ndpi_flow6针对ipv6进行了转换,最后还是通过get_ndpi_flow建立

    2)get_ndpi_flow函数

    get_ndpi_flow函数:
  • 原文地址:https://www.cnblogs.com/yxysuanfa/p/7198646.html
Copyright © 2020-2023  润新知