当前位置: 首页 > news >正文

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

来源: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.hskmm.com/?act=detail&tid=37275

相关文章:

  • Linux 命令 - 教程
  • Java基础全面复盘:从入门到进阶的核心要点梳理
  • 【STM32H743IIT6 系列】通过 LTDC接口驱动的 TFTLCD(RGB屏)显示
  • 报表过滤框设置默认组织提示死循环
  • 第九章-NOP Team dmz-C
  • 高级语言设计第二次作业
  • UiPath License
  • 基于伪距差分定位技术实现方案
  • vue项目浏览器内存不断增加
  • 一些变换
  • ANOMALYCLIP
  • AI 辅助开发工具
  • Go开发者必备:5款提升代码质量的顶级Linter工具
  • 函数作用域在解决 JavaScript 自定义元素类跨环境兼容问题中的应用
  • React-router v6学生管理系统笔记 - 教程
  • 2025 年东莞石排到南通物流专线公司最新推荐榜:聚焦企业专利技术、品质管控及知名客户合作案例的权威解析
  • 钡铼技术预测:未来工业AI发展的七大趋势
  • 2025 年废气处理设备厂家最新推荐榜:聚焦企业专利技术、品质管控及知名客户合作案例的权威解析
  • 2025年国产助听器品牌推荐榜:聚焦专业适配,杭州爱听科技引领国产助听新体验​
  • 2025 年PPR家装管厂家最新推荐榜:聚焦企业专利技术、品质管控及知名客户合作案例的权威解析
  • 2025 年连接器厂家最新推荐榜单:聚焦电子 / Type-C / 板对板等品类,精选领军企业助力下游企业精准选型
  • 2025 年干燥机厂家最新推荐排行榜:聚焦闪蒸 / 气流 / 沸腾 / 闭路循环等多类型设备,精选优质企业深度解析
  • 2025 年北京订制旅游 / 精品旅游 / 旅游包车 / 精品小包团旅游旅行社推荐,北京汇通清源国际旅游公司专业服务解析
  • 2025 年北京品牌设计公司最新推荐榜,聚焦企业专业能力与服务价值深度剖析
  • 2025 年报警器经销商最新推荐排行榜:深度解析优质服务商,海湾 / 青鸟 / 利达等品牌优选,郑州安创消防实力领衔
  • 2025 年最新推荐!滑石粉厂家实力排行榜,超细 / 塑料级 / 涂料级 / 造纸级 / 工业级等多类型产品优质企业全解析
  • Linux的基本操作值vi操作对与文件
  • 2025 年最新推荐灭火器维修公司权威榜单:覆盖干粉 / 水基 / 二氧化碳 / 七氟丙烷 / 锂电池灭火器维修,帮您选出专业可靠服务单位
  • 连续与间断
  • 记一次 .NET 某光放测试系统 崩溃分析