【转载】cap,pcap文件中的ipv4数据包转成ipv6数据包

news/2025/10/23 13:26:48/文章来源:https://www.cnblogs.com/wan9/p/19160303

来源:https://blog.csdn.net/mincheat/article/details/78180656

cap , pcap文件结构(解析),网上多得是,这里就不写了。  写这个,主要是工作中正好需要大量的ipv6数据包,但是ipv6数据包不太好找,干脆就直接写个简单的工具,把ipv4转成对应的ipv6,可用于测试。 

 

cpp代码:

// Ipv4ToIpv6_pCap.cpp : 定义控制台应用程序的入口点。
//
 
#include "stdafx.h"
#include <windows.h>#define  DLT_EN10MB 1struct pcap_file_header {UINT32 magic;UINT16 version_major;UINT16 version_minor;UINT32 thiszone;    /* gmt to local correction */UINT32 sigfigs;    /* accuracy of timestamps */UINT32 snaplen;    /* max length saved portion of each pkt */UINT32 linktype;    /* data link type (LINKTYPE_*) */
};struct pcap_pkthdr {struct timeval ts;    /* time stamp */UINT32 caplen;    /* length of portion present */UINT32 len;    /* length this packet (off wire) */
};struct EthernetPacket
{char MacDst[6];             ///< 目的网卡物理地址
    char MacSrc[6];             ///< 源网卡物理地址
    unsigned short PacketType; ///< 包类型, ip或ARP等
};struct PKT_IP
{UINT8 uHeaderLen:4;UINT8 uVersion:4;UINT8 uServType;UINT16 uTotalLen;UINT16 uIdent;UINT16 uFragOffset;UINT8 uTTL;UINT8 uProtocol;UINT16 uCheckSum;UINT32 addSrc;UINT32 addDst;
};struct PKT_IPV6
{union{UINT32 Vfc;struct{UINT8 uClass:4;UINT8 uVersion:4;};};UINT16 uPayloadLength;UINT8 uNextHeader;UINT8 uHopLimit;UINT8 addrSrc[16];UINT8 addrDst[16];
};inline UINT16 NTOH16(const UINT16& nData)
{return ((nData & 0xFF00) >> 8) | ((nData & 0x00FF) << 8);
}inline UINT32 NTOH32(const UINT32& nData)
{return ((nData & 0xFF000000) >> 24)| ((nData & 0x00FF0000) >> 8)| ((nData & 0x0000FF00) << 8)| ((nData & 0x000000FF) << 24);
}int _tmain(int argc, char* argv[])
{if (argc != 3){printf("arg: inputfile, outputfile! \n");//getchar();return -1;}FILE* pFileIn = fopen(argv[1], "rb");FILE* pFileOut = fopen(argv[2], "wb");bool bSucces = false;do {if (NULL == pFileIn || NULL == pFileOut){printf("open file fail \n");break;}pcap_file_header fileheader;memset(&fileheader, 0, sizeof(pcap_file_header));fread(&fileheader, 1, sizeof(fileheader), pFileIn);if (DLT_EN10MB != fileheader.linktype){printf("only support enthernet catch packets! \n");break;}fwrite(&fileheader, 1, sizeof(fileheader), pFileOut);pcap_pkthdr pkHdr;UINT32 packetTotalCount = 0;UINT32 packetTran = 0;UINT8  packetBuffer[5*1024] = {};do {if (sizeof(pkHdr) == fread(&pkHdr, 1, sizeof(pkHdr), pFileIn)){if (pkHdr.caplen != pkHdr.len){// add //printf("pkHdr.caplen != pkHdr.len     packetNum = %d \n", packetTotalCount+1);
                }if (pkHdr.caplen == fread(packetBuffer, 1, pkHdr.caplen, pFileIn) && pkHdr.caplen > sizeof(EthernetPacket)){EthernetPacket* pEPacket = (EthernetPacket*)packetBuffer;if (0x08 == pEPacket->PacketType)  // ipv4
                    {// PKT_IP* pIpHdr = (PKT_IP*)(packetBuffer + sizeof(EthernetPacket));pIpHdr->uTotalLen = NTOH16(pIpHdr->uTotalLen);if (pkHdr.caplen < pIpHdr->uTotalLen + sizeof(EthernetPacket))   // 后面有可能会有补的数据,所以caplen可以会大于后面的值
                        {printf("len error! packetNum = %d \n", packetTotalCount+1);break;}pEPacket->PacketType = 0xDD86;PKT_IPV6 pktIpv6Hdr;memset(&pktIpv6Hdr, 0, sizeof(pktIpv6Hdr));pktIpv6Hdr.uVersion = 6;//pktIpv6Hdr.Vfc = CSNTOH32(pktIpv6Hdr.Vfc);
 UINT16 paylen = pIpHdr->uTotalLen - pIpHdr->uHeaderLen*4;pktIpv6Hdr.uPayloadLength = NTOH16(paylen);pktIpv6Hdr.uNextHeader = pIpHdr->uProtocol;pktIpv6Hdr.uHopLimit = pIpHdr->uTTL;memcpy(pktIpv6Hdr.addrSrc+12, &(pIpHdr->addSrc), 4);memcpy(pktIpv6Hdr.addrDst+12, &(pIpHdr->addDst), 4);pkHdr.caplen = sizeof(EthernetPacket) + sizeof(PKT_IPV6) + paylen;pkHdr.len = pkHdr.caplen;fwrite(&pkHdr, 1, sizeof(pkHdr), pFileOut);   // 写pack headerfwrite(pEPacket, 1, sizeof(EthernetPacket), pFileOut);  // 写etherfwrite(&pktIpv6Hdr, 1, sizeof(PKT_IPV6), pFileOut);  // 写ipv6头UINT8* pOtherData = packetBuffer + sizeof(EthernetPacket) + pIpHdr->uHeaderLen*4;fwrite(pOtherData, 1, paylen, pFileOut); // 写剩下的数据
 packetTran++;}else{// 其他包,直接写入fwrite(&pkHdr, 1, sizeof(pkHdr), pFileOut);fwrite(packetBuffer, 1, pkHdr.caplen, pFileOut);}}else{printf("read packet caplen less    packetNum = %d \n", packetTotalCount+1);break;}packetTotalCount++;}else{if (feof(pFileIn)){//printf("read end!  \n");bSucces = true;}else{printf("Read less data! packetTotalCount = %d \n", packetTotalCount);}break;}} while (true/*!feof(pFileIn)*/);printf("totalPacket = %d, transPacket = %d\n", packetTotalCount, packetTran);} while (false);if (pFileIn){fclose(pFileIn);}if (pFileOut){fclose(pFileOut);}if (!bSucces){printf("Process %s fail! \n", argv[1]);DeleteFileA(argv[2]);}//getchar();//pcap_file_headerreturn 0;
}

另外还有个批处理文件 .bat

@echo off 
::cd %~dp0 set inputFolder=E:\work\vsproject\Ipv4ToIpv6_pCap\Debug
set outPutFolder=E:\work\vsproject\Ipv4ToIpv6_pCap\Debug\newFolder
set exepath=E:\work\vsproject\Ipv4ToIpv6_pCap\Debug\Ipv4ToIpv6_pCap.exe
set suffix=_ipv6.capfor /f "delims=\" %%s in ('dir /b /a-d /o-d %inputFolder%\*.pcap,*.cap') do (echo -------------handle filename = %%s ------------%exepath% %inputFolder%\%%s  %outPutFolder%\%%s%suffix%
)pause

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/944195.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为FusionCompute超融合上传ISO镜像方法教程

华为FusionCompute超融合上传ISO镜像方法教程 1、登录后点资源池,点存储2、点文件3、点上传文件4、选择镜像,点开始上传。5、等待上传完成,就可以选择华为FusionCompute超融合里面的ISO镜像了

QMPlay 编译

编译环境介绍 win11,msys2,vscode, cmake 首先下载相关依赖; 本文使用的ffmpeg5.1,qt6,libass。 安装libass pacman -S mingw-w64-x86_64-libass # 64位系统安装Ninja pacman -S mingw-w64-x86_64-ninja # 64位系…

2025 氧气/氮气/工业/氩气/高纯/液态/气体公司推荐榜:港骅 5 星领跑,黄骅及周边全品类供应,这些细分领域服务商更懂生产需求

随着工业生产对气体供应的稳定性、品类适配性要求提升,优质工业气体服务商成为保障生产效率的关键。这份结合供应能力、区域覆盖与用户口碑的推荐榜中,黄骅市港骅工业气体销售有限公司以 5 星实力稳居榜首,其余品牌…

Linux 命令 - 教程

Linux 命令 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Co…

详细介绍:如何实现多人协同文档编辑器

详细介绍:如何实现多人协同文档编辑器pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mon…

Java基础全面复盘:从入门到进阶的核心要点梳理

引言 Java作为一门经典的面向对象编程语言,自1995年诞生以来,始终保持着旺盛的生命力。无论你是刚刚接触Java的初学者,还是希望巩固基础的开发者,进行一次全面的基础复盘都大有裨益。本文将系统性地梳理Java核心知…

【STM32H743IIT6 系列】通过 LTDC接口驱动的 TFTLCD(RGB屏)显示

前言 SDRAM 配置 在开始此篇文章之前,首先要把 SDRAM 配置好,可以看我的上一篇文章:【STM32H743IIT6 系列】将外部SDRAM作为内部RAM使用的超简单方法没有将 SDRAM 作为内部 RAM 使用的朋友可以选择性看上面这篇文章…

10.22 —— 2024icpc沈阳D,E,B,M

D. Dot Product Game 首先将对两个数组的操作转变为对一个数组的操作:可以发现,对 \(a\) 的某个子数组循环左移 \(r\) 位 与 对 \(b\) 的某个子数组循环右移 \(r\) 位是等价的,因此修改某个情形,只需要对其中一个序…

AGV 系统的内部物流与装配智能化方案设计:应用场景与核心优势详解 - 实践

AGV 系统的内部物流与装配智能化方案设计:应用场景与核心优势详解 - 实践2025-10-23 12:55 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: …

报表过滤框设置默认组织提示死循环

原因:首次赋值当前组织时,BeforeSetItemValueByNumber中过滤范围权限,导致赋值失败,组织字段重新为空,又触发值更新,再次赋值。 解决:实体服务规则中不勾选“值更新”,即值更新时不触发。

第九章-NOP Team dmz-C

第九章-NOP Team dmz-C 1、攻击者通过攻击DMZ-B机器发现有密钥可以免密登录到DMZ-C机器里,,然后攻击者上传了一个挖矿程序,请将该挖矿程序的名称提交, 我们使用DMZ-B下载的私钥进行登录查看当前pytho版本启用交互式…

高级语言设计第二次作业

这个作业属于哪个课程:https://edu.cnblogs.com/campus/fzu/gjyycx 这个作业要求在哪里: https://edu.cnblogs.com/campus/fzu/gjyycx/homework/13570 学号:102500309 姓名:郑睿杰 一、课后练习:(具体思路都在代…

UiPath License

UiPath Lincense: 22年之前,一个独立的OC license官价是2万美金。 22年到25年, UiPath推行了一套Flex的license类型,特点是OC可以免费安装使用,但各个独立的产品license的价格做了上调,比如attened robot, unatte…

一些变换

这篇文章主要是做一个总结和铺垫。 我们做物理题时,常常要解一些复杂的微分方程(便便),但是我们对方程做一些变换往往会使微分方程变成线性方程,这是好的,于是专门研究一些变换是重要的。 一些记号 \[\begin{ali…

ANOMALYCLIP

对象无关的零样本异常检测 创新点有三个:(1)对象不可知文本提示关注图像的异常/正常,而不是对象语义;(2)文本编码器调优来优化原始文本空间;(3)DPAM(V-V)通过增强局部视觉语义来提高分割性能。 论文主要用…

vue项目浏览器内存不断增加

项目中用的jeecg-boot,排除其他内存泄漏的原因,最后发现将右侧点击组件Contextmenu改为v-if显示,内存就降下去了

基于伪距差分定位技术实现方案

基于伪距差分定位技术实现方案,包含原理详解与C++代码实现,结合差分修正与最小二乘解算算法一、定位原理详解 1.1 差分定位基本原理 核心原理:基准站已知精确坐标,计算伪距观测值与真实几何距离的差值(Δρ) 通过…

prometheus服务的客户端

prometheus服务的客户端环境 服务端 192.168.164.110 客户端 192.168.164.1111 添加主机到prometheus服务 # 客户端运行node-exporter docker run -itd \ -p 9100:9100 \ -v /:/rootfs:ro \ -v /sys:/sys:ro \ --name…

AI 辅助开发工具

一、引言:为什么 AI 辅助开发越来越重要?提升开发效率(代码生成、调试、文档) 降低认知负荷(自动补全、上下文理解) 加速学习新技术(解释代码、生成示例) 趋势:AI 成为现代开发者“第二大脑”二、主流 AI 辅助…

网安人必看!2025年最硬核的20+变现路径,学生党也能月入4位数。 - 详解

网安人必看!2025年最硬核的20+变现路径,学生党也能月入4位数。 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: …