# pcap_x64 **Repository Path**: lvengda/pcap_x64 ## Basic Information - **Project Name**: pcap_x64 - **Description**: lvengda - **Primary Language**: C/C++ - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 1 - **Created**: 2021-07-07 - **Last Updated**: 2022-11-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # pcap_x64 #### 介绍 本程序是基于winpcap的抓包分流工具,可对TCP及UDP数据流进行捕获和分析,并提取特征后存入哈希表中 哈希表主要结构为![哈希表结构图](https://images.gitee.com/uploads/images/2021/0708/153816_47d43bf2_5012615.png "哈希表结构图") #### 程序架构 程序大致架构为捕获---->分析---->存表,具体结构体及函数定义、实现在程序头文件 #### 运行环境 Windows 10 Visual Studio 2019 Release x64 Python 3.9 #### 更新 21-7-13 添加哈希表存储CSV文件功能; 添加调用Python读取CSV文件生成可视化图表功能(使用说明更新4-5) 21-7-27 添加开始抓包后每10s输出一个记录当前flows的可视化图表功能(使用说明更新6) 21-8-9 修改了哈希表的结构,新结构结合了Elastic Sketch算法的软件部分heavy part的实现,精简了哈希表的大小,改善了输出可视化图表的实现原理和图表结构,增加了图表的可读性(使用说明更新7) 21-8-19 添加了light part部分,与Elastic Sketch的区别是一个记录了包数超过阈值的流的ID信息的哈希表,而不是一个CM Sketch,并添加了包在到达后的处理逻辑说明(使用说明更新8) #### 使用说明 1. 在运行之前需要winpcap的开发包,下载地址为[https://www.winpcap.org/devel.htm](https://www.winpcap.org/devel.htm) 下载完成后需要修改一处代码,因为winpcap停止维护较早且本程序是64位,所以代码有点小问题 解压并打开下载好的winpcap开发包,打开WpdPack->Include->pcap->pcap.h文件,(大概)在代码第40行,将 ``` #if defined(WIN32) ``` 改为: ``` #if (defined(WIN32)||defined(WIN64)) ``` (WIN64为预处理器定义,如果编译器没有识别,可在属性->C/C++ ->预处理器->预处理器定义中手动添加,本程序已添加) 2. 点击克隆\下载按钮可下载本程序的ZIP压缩包,解压后点击运行.sln文件 下载完成后需要添加winpcap附加包及附加库 添加附加包:属性 -> C/C++ -> 常规 -> 附加包目录,按照格式修改为正确地址 添加附加库:属性 -> 链接器 -> 常规 -> 附加库目录,按照格式修改为正确地址 添加附加依赖项:属性 -> 链接器 -> 输入 -> 附加依赖项,从附加库目录中选择需要的库添加(已添加) 3. F5执行,执行过程中会简略输出包和哈希表的信息,使用Ctrl+C终止loop并输出详细哈希表,第一次使用Ctrl+C会显示未加载kernelbase.pdb ![异常信息](https://images.gitee.com/uploads/images/2021/0708/161856_de8d419d_5012615.png "异常信息") 需要将红框内选项点击勾选 4. 添加哈希表存储CSV文件及调用Python读取CSV文件生成可视化图表功能,其中table.csv中存储哈希表中flows数据,graph.py是被调用的python程序,作用为从table.csv文件中读取数据并绘图 实现C调用Python需要添加Python附加包及附加库,详细添加方式参照使用说明2. 程序使用Python 3.9 64位,如果版本不同请修改附加依赖属性中python39.lib字段,如果使用32位Python则之前所有附加包和库均需重新配置 程序需要运行在Release模式下(因为Python.h头文件在Debug模式下有和winpcap头文件中类似的Bug..,#ifdef语句有问题..,如果想要运行在Debug模式下,需要修改Python.h文件,参考[https://www.cnblogs.com/uestcman/p/9716341.html](https://www.cnblogs.com/uestcman/p/9716341.html) 5. 可视化图表: ![30flows](https://images.gitee.com/uploads/images/2021/0713/154811_d9b37a3a_5012615.png "30flows.png") 6. 当开始抓包后每过10s,程序会对当前哈希表内的流信息可视化输出,由于输出时可能会影响流处理部分的执行效率,故创建了一个新线程专门负责间隔10s输出一次图表,新线程输出图表的过程中没有使用4中方法,而是将graph.py打包成.exe可执行文件,再由C执行可执行文件输出图表,其中table_refresh.csv存放flows数据,10s刷新一次。这种方式的优点是C调用可执行文件较为简单,只需一行代码,缺点是打包后的可执行文件较大(80MB),输出图表的速度较慢(点击一次数秒后输出图表),并且不关闭当前图表就不会输出下一张图表。(待改进……) 7. 目前哈希表的结构调整如下: ![heavy_part](https://images.gitee.com/uploads/images/2021/0809/195253_f9595ade_5012615.png "结构图-Page-2.png") 当到来packet的ID与三个bucket的其中一个flow的ID匹配时,packet将会被插入匹配的flow之后,该flow的pkt_num加一,如果都不匹配,则抛弃该packet并使对应vote加1,若vote与pkt_num的比值大于一个阈值lambda,则将该flow抛弃,移入新的flow。 可视化图表结构调整如下: ![new_graph](https://images.gitee.com/uploads/images/2021/0821/132035_dd998e23_5012615.png "new.png") 其中将TCP流和UDP流分开显示,并添加了按到达时间显示,将所有流的第一个包到达时间设为0,单位为毫秒。标题冒号后的数字代表图中flows的数量。现在显示的逻辑为每隔5s刷新一次,并且循环输出图表的功能由graph.exe实现,改进了输出速度等问题。 目前程序执行逻辑为: ![流程图](https://images.gitee.com/uploads/images/2021/0811/085606_e15fd05c_5012615.png "结构图-Page-3 (1).png") 8. 目前的运行逻辑是,包到达后,获取包的ID信息,若ID在light part被找到,则证明该流的包数已经达到阈值,该流为一个满流,则对包不做任何处理;若ID在light part中未被找到,则记录该包的到达时间,payload等信息并查找heavy part,如果heavy part中没有该ID,且对应行有位置,则为该包初始化一个新flow,该包为新flow的第一个包,并插入到heavy part中;如果没有位置,则相应vote加1,并判断是否超过lambda与该行中最小pkt_num的乘积,若超过,则将行中最小的流移除并丢弃,并移入该flow,vote置为0;如果heavy part中有该ID,则直接插入,并判断插入后的flow包数是否超过阈值,如果未超过阈值,则插入完成,如果超过阈值,则将该flow的ID记录在light part,该flow的信息写入hp_full.csv,并将heavy part中的该位置ID置为0,释放掉该位置下连接的包信息,即删除。 ![插入包流程图](https://images.gitee.com/uploads/images/2021/0819/135145_5d567875_5012615.png "结构图-Page-4.png") #### 程序未完成待完善中 · · · #### 参与贡献 **By Lvengda**