一、简单介绍
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函数:
相关阅读:
CART算法(转)
分类算法:决策树(C4.5)(转)
决策树与迭代决策树(转)
随机森林(Random Forest)详解(转)
Bagging和Boosting 概念及区别(转)
迭代器与生成器
Python代码这样写更优雅(转)
python进行EDA探索性数据分析
标准化与归一化(转)
最小树形图(poj3164)
-
原文地址:https://www.cnblogs.com/yxysuanfa/p/7198646.html
分类算法:决策树(C4.5)(转)
决策树与迭代决策树(转)
随机森林(Random Forest)详解(转)
Bagging和Boosting 概念及区别(转)
迭代器与生成器
Python代码这样写更优雅(转)
python进行EDA探索性数据分析
标准化与归一化(转)
最小树形图(poj3164)