首页 > 代码库 > pcapReader——源代码分析
pcapReader——源代码分析
一、简单介绍
pcapReader是ndpi开源中的一个example。
大家能够从<ndpi directory>/example/pcapReader.c中找到它的源码。通过pcaplib和ndpi相结合。进行深度包检測。尽管仅仅有短短的几行代码,可是他将展现的不仅是pcaplib和ndpi的用法,还有包分析的一些技巧。看完之后事实上外国人写的程序也就是那样,并没有什么特别之处。我们先来一起看看主要的函数结构。
注:我们仅仅对源代码中的linux平台部分进行解释
在main函数中,通过调用test_lib()对程序进行整合。
<script src="https://code.csdn.net/snippets/395684.js" type="text/javascript"></script>
这里限于篇幅,主要对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函数:
loop call capture 协议 pcaplib
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。