pcap文件解析

  • 1:pcap文件格式
  • 2:从pcap文件中读取以太网数据包
  • 3:c语言代码实现
  • 4 参考链接:

1:pcap文件格式

pcap文件主要包含了三个部分,pcap文件头,数据包头,数据包内容。在磁盘上的存储格式为

文件头 + 数据包头[0] + 数据包内容[0] + 数据包头[1] + 数据包内容[1] + … +数据包头[N] + 数据包内容[N]

每一部分包含的内容如下

Pcap文件头:保存着文件的读取方式,版本号等信息,解析数据包只需要关注magic字段。

  • Magic:4Bytes, pcap文件标识,用于识别文件并确定字节顺序。0xA1B2C3D4用来表示按照原来的顺序读取,0xD4C3B2A1表 示下面的字节都要交换顺序读取。一般会采用0xD4C3B2A1,即所有字节都需要交换顺序读取。
  • version_major: 2Bytes, 主版本号,一般为 0x0200【实际上因为交换读取顺序,所以计算机看到的应该是 0x0002】
  • version_minor: 2Bytes, 次版本号,一般为 0x0400【计算机看到的应该是 0x0004】
  • timezoon: 4Bytes, 当地的标准时间,如果用的是GMT则全零,一般都直接写 0000 0000
  • sigfigs: 4Bytes, 时间戳的精度,设置为全零即可
  • snaplen: 4Bytes, 最大的存储长度,如果想把整个包抓下来,设置为 ffff 0000,但一般来说 ff7f 0000就足够了【计算机看到的应该是 0000 ff7f 】
  • linktype: 4Bytes, 链路类型,一般为Ethernet 即0x1。

数据包头:pkt_hdr保存了数据包被捕获时候的时间戳和数据包长度。

  • tv_sec:时间戳秒字段
  • tv_usec:时间戳微妙字段
  • caplen:捕获的数据包的长度(保存在pcap文件中的长度)单位是 Byte。
  • len:离线数据长度:实际数据帧的长度,一般不大于caplen,多数情况下和Caplen数值相等。

数据内容: pkt_content里面保存着网络上捕获的原始数据帧。长度为数据包头里面的caplen长度。
[以太网帧格式] (https://www.cnblogs.com/lifan3a/articles/6649970.html)

2:从pcap文件中读取以太网数据包

1:读取pcap文件头(24 Bytes),从文件头magic字段中确定文件读取方式。

  • 如果为0xA1B2C3D4则按照正常顺序读取,如果为0xD4C3B2A1则按照交换顺序读取以读取文件头中的linktype字段为例,如果文件头第20-23字节为0x01 0x00 0x00 0x00,则0xA1B2C3D4正常顺序读取的结果为0x01000000(32 bit),0xD4C3B2A1交换顺序读取的结果为0x00000001
  • 交换顺序读取

    D4 C3 B2 A1交换顺序读取linktype:把[0x01 0x00 0x00 0x00]解释为0x00 00 00 01(十进制:1)
  • 正常顺序读取

    A1 B2 C3 D4正常顺序读取linktype: 把[0x00 0x00 0x00 0x01]解释为0x00 00 00 01(十进制:1)

2:读取一个数据包头(16 Bytes) header_0 ,确定紧接着这个数据包头后面的数据包内容content_0内容的长度caplen_0。

  • 数据包头里面第8-11字节为caplen字段,即数据包的长度。例如 ”0x42 0x05 0x00 0x00” 按照0xD4C3B2A1交换顺序读取的结果为caplen_0 = 1346,如果按照0xA1B2C3D4正常顺序存储那么 ”0x00 0x00 0x05 0x42” 才会被解析为caplen_0 = 1346。
  • 交换顺序读取

    D4 C3 B2 A1交换顺序读取caplen: 将[0x42 0x05 0x00 0x00]为0x00 00 05 42(十进制:1346)
    D4 C3 B2 A1交换顺序读取len: 将[0x42 0x05 0x00 0x00]为0x00 00 05 42(十进制:1346)
  • 正常顺序读取

    A1 B2 C3 D4正常顺序读取caplen: 将[0x00 0x00 0x05 0x42]为0x00 00 05 42(十进制:1346)
    A1 B2 C3 D4正常顺序读取len: 将[0x00 0x00 0x05 0x42]为0x00 00 05 42(十进制:1346)

3:读取数据包内容

第2步中已经解析出了header_0中的caplen,那么我们读取caplen个字节长度content_0, header_0描述的数据包内容即为content_0。

  • 例如header_0的caplen为1346,那么我们读取1346字节数据,这1346字节数据即为content_0的内容。

4:反复执行第2步和第3步,直到文件结束。

3:c语言代码实现

void test_pcap_file_read()
{unsigned char pcap_file_header[24] = { 0 };/*file header 24 bytes*/unsigned char pkt_hdr[16] = { 0 };/*pkt_hdr 16 bytes*/unsigned char udp_pkt_data[4096] = { 0 };/*content*/int len = 0;int pkt_cnt = 0;bool isLittleEndian = false;/*big endian*/FILE *pInFile = fopen("Test.pcap", "rb");/*open pcap file*/if (NULL == pInFile){return;}if (1 != fread(pcap_file_header, 24, 1, pInFile))/*read pcap file header*/{fclose(pInFile);}/*交换顺序读取*/if ((0xD4 == pcap_file_header[0]) && (0xC3 == pcap_file_header[1]) && (0xB2 == pcap_file_header[2]) && (0xA1 == pcap_file_header[3])){isLittleEndian = true;}while (1){if (1 != fread(pkt_hdr, 16, 1, pInFile))/*read a pkt_hdr 16 bytes*/{break;}if (isLittleEndian)/*get the pktcontent's length in the file following the pkt_hdr*/{len = (int(pkt_hdr[11]) << 24) + int((pkt_hdr[10]) << 16) + int((pkt_hdr[9]) << 8) + int(pkt_hdr[8]);}else{len = (int(pkt_hdr[8]) << 24) + int((pkt_hdr[9]) << 16) + int((pkt_hdr[10]) << 8) + int(pkt_hdr[11]);}/*read the length bytes from file, this is the pktcontent*/if (1 != fread(udp_pkt_data, len, 1, pInFile)){break;}pkt_cnt++;}printf("Total %d packets found\n", pkt_cnt);fclose(pInFile);
}

4 参考链接:

pcap文件格式: https://blog.csdn.net/u013793399/article/details/51474831
pcap包文件头: https://blog.csdn.net/yhangleo/article/details/8484597

从pcap文件中解析网络数据包相关推荐

  1. Packet Chasing:通过缓存侧信道监视网络数据包

    摘要 本文介绍了一种对网络的攻击–Packet Chasing,这种攻击不需要访问网络,无论接收数据包的进程的特权级别如何,都能发挥作用.一个间谍进程可以很容易地探测和发现网络驱动程序使用的每个缓冲区 ...

  2. 2.6的网络数据包时间戳

    本文档的Copyleft归yfydz所有,使用GPL发布,可以自由拷贝,转载,转载时请保持文档的完整性,严 禁用于任何商业用途. msn: yfydz_no1@hotmail.com 来源:http: ...

  3. pcap文件解析工具_【免费毕设】PHP网络数据包分析工具的设计与开发(源代码+论文)...

    点击上方"蓝字"关注我们目录 系统设计 网络数据包分析系统的设计 整个网络数据报分析工具采用模块化的设计思想,原因是许多程序太长或太复杂,很难写在单一单元中.如果把代码分为较小的功 ...

  4. python读取pcap获得端口_Python处理网络数据包示例(pcapy读pcap文件)

    Python处理网络数据包示例(pcapy读pcap文件) 最近在围观python,找了个pcapy处理pcap数据的代码 非常非常久以前的东西了,应该是在项目组做的半成品吧.今天重装机器,不经意翻出 ...

  5. 将任意文件转换为Pcap网络数据包传输

    本文将介绍一款能够直接将文件构造成为pcap数据包的工具,作为我的专栏<Pcap网络数据包处理方法大全>中的一篇. 在一些测试场景,尤其是安全测试的场景,对于一个文件在传输过程中生成的数据 ...

  6. 数据包过滤 系统 linux,Ubuntu16.04安装libpcap开发库对pcap文件中的数据包进行过滤...

    Ubuntu16.04下安装了Wireshark的话,应该是已经安装了libpcap0.8的包,如下图: 使用sudo apt-get install libpcap-dev安装开发包,安装后系统显示 ...

  7. 流量Ⅰ--一文了解pcap网络数据包的结构?

    一文了解pcap网络数据包如何分析 0x00 基础知识 1.OSI七层模型每层的作用 2.TCP/IP 结构及具有五层协议的结构体系 0x01 数据是如何在各层次间传输的 1.数据帧的封装 2.数据格 ...

  8. python应用系列教程——python使用scapy监听网络数据包、按TCP/IP协议进行解析

    分享一个朋友的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!大家可以看看是否对自己有帮助:点击打开 docker/kubernetes入门视频教程 全栈工程师开发手册 (作者:栾鹏) pyth ...

  9. python网络数据包分析_Pyshark:使用了WirdShark的Python数据包解析工具(Tshark)

    Pyshark Pyshark是一款针对tshark的Python封装器,在Pyshark的帮助下,广大研究人员可以使用wireshark的解析器来进行Python数据包解析.扩展文档:[Pyshar ...

最新文章

  1. javascript格式化时间(几秒钟前,几分钟前,几小时前,几天前...)
  2. 使用String.intern减少内存使用
  3. 【机器学习算法-python实现】svm支持向量机(1)—理论知识介绍
  4. Altium Designer -- 差分布线和阻抗匹配
  5. IBM T61 键盘没有反映。
  6. bing背单词交互流程 - Chongyang Bai
  7. SpringMVC之安全性(二)登录界面
  8. 将 Hexo 部署到阿里云轻量服务器
  9. 使用IDM的正确姿势
  10. flash代替epcs
  11. 智慧城市数字孪生IOC系统
  12. (7)数据分析-秩和检验
  13. fleaphp 快速开发php框架
  14. 基本矩阵运算法则之笔记
  15. OpenWrt开发必备软件模块——系统总线ubus
  16. 2021年中国消费贷款现状分析:消费贷款余额达54.88万亿元,同比增长10.73%[图]
  17. 中国国有资本投资运营公司“十四五”投资规划及发展动向展望报告2022-2028年
  18. 硬核小知识,网络管理员的技术职业规划《一》
  19. 易推宝网络推广效果怎么样?
  20. Bootstrap Table API 中文版(完整翻译文档)

热门文章

  1. Centos7 常用的命令
  2. CAD高版本转低版本的方法有哪些?你一定用的到哦
  3. 判断当前时间段是否在某个时间段内(当前小时是否在当日某个时间段)
  4. 廖雪峰讲python高阶函数求导_廖雪峰python课程笔记
  5. TCHAR与char相互转换
  6. 基于Java毕业设计新冠疫苗接种预约系统登录源码+系统+mysql+lw文档+部署软件
  7. 鸿蒙系统手机模拟器,鸿蒙系统2.0手机版
  8. 计算机组装部zho,PowerPC汇编实现BES Ⅲ数据获取读出系统机箱级数据组装
  9. vue-seamless-scroll 无缝滚动 使用方法
  10. 海思4G远程视频监控——4G插卡全网通远程监控摄像头——WiFi插卡摄像头开发板