pcap-简单数据格式解析(初级)
来源:互联网 发布:明源地产软件 编辑:程序博客网 时间:2024/06/06 03:36
下面pcap文件格式介绍是在网上转的,根据理解,写了个程序来进行解析pcap文件,后续再实现合并pcap功能(wireshark已经自带命令行合并pcap文件工具,在这里只是为了分析pcap文件和学习)。
==========================
默认的*.pcap文件保存格式。
==========================
默认的*.pcap文件保存格式。
Pcap文件头24B各字段说明:
Magic:4B:0x1A 2B 3C 4D:用来标示文件的开始
Major:2B,0×02 00:当前文件主要的版本号
Minor:2B,0×04 00当前文件次要的版本号
ThisZone:4B当地的标准时间;全零
SigFigs:4B时间戳的精度;全零
SnapLen:4B最大的存储长度
LinkType:4B链路类型
常用类型:
0 BSD loopback devices, except for later OpenBSD
1 Ethernet, and Linux loopback devices
6 802.5 Token Ring
7 ARCnet
8 SLIP
9 PPP
10 FDDI
100 LLC/SNAP-encapsulated ATM
101 “raw IP”, with no link
102 BSD/OS SLIP
103 BSD/OS PPP
104 Cisco HDLC
105 802.11
108 later OpenBSD loopback devices (with the AF_value in network byte order)
113 special Linux “cooked” capture
114 LocalTalk
1 Ethernet, and Linux loopback devices
6 802.5 Token Ring
7 ARCnet
8 SLIP
9 PPP
10 FDDI
100 LLC/SNAP-encapsulated ATM
101 “raw IP”, with no link
102 BSD/OS SLIP
103 BSD/OS PPP
104 Cisco HDLC
105 802.11
108 later OpenBSD loopback devices (with the AF_value in network byte order)
113 special Linux “cooked” capture
114 LocalTalk
Packet 包头和Packet数据组成
字段说明:
Timestamp:时间戳高位,精确到seconds
Timestamp:时间戳低位,精确到microseconds
Caplen:当前数据区的长度,即抓取到的数据帧长度,由此可以得到下一个数据帧的位置。
Len:离线数据长度:网络中实际数据帧的长度,一般不大于caplen,多数情况下和Caplen数值相等。
Packet 数据: 即 Packet(通常就是链路层的数据帧)具体内容,长度就是Caplen,这个长度的后面,就是当前PCAP文件中存放的下一个Packet数据包,也就 是说:PCAP文件里面并没有规定捕获的Packet数据包之间有什么间隔字符串,下一组数据在文件中的起始位置。我们需要靠第一个Packet包确定。 最后,Packet数据部分的格式其实就是标准的网路协议格式了可以任何网络教材上找得到。
===========================
//// pcap.h// pcaptest//// Created by zc on 12-1-24.// Copyright 2012年 __MyCompanyName__. All rights reserved.//#ifndef pcaptest_pcap_h#define pcaptest_pcap_htypedef unsigned int bpf_u_int32;typedef unsigned short u_short;typedef int bpf_int32;/*Pcap文件头24B各字段说明:Magic:4B:0x1A 2B 3C 4D:用来标示文件的开始Major:2B,0x02 00:当前文件主要的版本号 Minor:2B,0x04 00当前文件次要的版本号ThisZone:4B当地的标准时间;全零SigFigs:4B时间戳的精度;全零SnapLen:4B最大的存储长度 LinkType:4B链路类型常用类型: 0 BSD loopback devices, except for later OpenBSD 1 Ethernet, and Linux loopback devices 6 802.5 Token Ring 7 ARCnet 8 SLIP 9 PPP */typedef struct pcap_file_header {bpf_u_int32 magic;u_short version_major;u_short version_minor;bpf_int32 thiszone; bpf_u_int32 sigfigs; bpf_u_int32 snaplen; bpf_u_int32 linktype; }pcap_file_header;/*Packet 包头和Packet数据组成字段说明:Timestamp:时间戳高位,精确到seconds Timestamp:时间戳低位,精确到microsecondsCaplen:当前数据区的长度,即抓取到的数据帧长度,由此可以得到下一个数据帧的位置。Len:离线数据长度:网络中实际数据帧的长度,一般不大于caplen,多数情况下和Caplen数值相等。Packet 数据:即 Packet(通常就是链路层的数据帧)具体内容,长度就是Caplen,这个长度的后面,就是当前PCAP文件中存放的下一个Packet数据包,也就 是说:PCAP文件里面并没有规定捕获的Packet数据包之间有什么间隔字符串,下一组数据在文件中的起始位置。我们需要靠第一个Packet包确定。*/typedef struct timestamp{bpf_u_int32 timestamp_s;bpf_u_int32 timestamp_ms;}timestamp;typedef struct pcap_header{timestamp ts;bpf_u_int32 capture_len;bpf_u_int32 len;}pcap_header;void prinfPcapFileHeader(pcap_file_header *pfh);void printfPcapHeader(pcap_header *ph);void printPcap(void * data,size_t size);#endif
//// pcap.c// pcaptest//// Created by zc on 12-1-24.// Copyright 2012年 __MyCompanyName__. All rights reserved.//#include <stdio.h>#include "pcap.h"void prinfPcapFileHeader(pcap_file_header *pfh){if (pfh==NULL) {return;}printf("=====================\n""magic:0x%0x\n""version_major:%u\n""version_minor:%u\n""thiszone:%d\n""sigfigs:%u\n""snaplen:%u\n""linktype:%u\n""=====================\n",pfh->magic,pfh->version_major,pfh->version_minor,pfh->thiszone,pfh->sigfigs,pfh->snaplen,pfh->linktype);}void printfPcapHeader(pcap_header *ph){if (ph==NULL) {return;}printf("=====================\n""ts.timestamp_s:%u\n""ts.timestamp_ms:%u\n""capture_len:%u\n""len:%d\n""=====================\n",ph->ts.timestamp_s,ph->ts.timestamp_ms,ph->capture_len,ph->len);}void printPcap(void * data,size_t size){unsigned short iPos = 0;//int * p = (int *)data;//unsigned short* p = (unsigned short *)data;if (data==NULL) {return;}printf("\n==data:0x%x,len:%lu=========",data,size);for (iPos=0; iPos < size/sizeof(unsigned short); iPos++) {//printf(" %x ",(int)( * (p+iPos) ));//unsigned short a = ntohs(p[iPos]);unsigned short a = ntohs( *((unsigned short *)data + iPos ) );if (iPos%8==0) printf("\n");if (iPos%4==0) printf(" ");printf("%04x",a);}/*for (iPos=0; iPos <= size/sizeof(int); iPos++) {//printf(" %x ",(int)( * (p+iPos) ));int a = ntohl(p[iPos]);//int a = ntohl( *((int *)data + iPos ) );if (iPos %4==0) printf("\n");printf("%08x ",a);}*/printf("\n============\n");}
//// main.c// pcaptest//// Created by zc on 12-1-24.// Copyright 2012年 __MyCompanyName__. All rights reserved.//#include <stdio.h>#include <stdlib.h>#include <string.h>#include <arpa/inet.h>#include "pcap.h"#define PCAP_FILE "test.pcap"#define MAX_ETH_FRAME 1514#define ERROR_FILE_OPEN_FAILED -1#define ERROR_MEM_ALLOC_FAILED -2#define ERROR_PCAP_PARSE_FAILED -3int main (int argc, const char * argv[]){printf("sizeof:int %lu,unsigned int %lu,char %lu,unsigned char %lu,short:%lu,unsigned short:%lu\n",sizeof(int),sizeof(unsigned int),sizeof(char),sizeof(unsigned char),sizeof(short),sizeof(unsigned short));pcap_file_header pfh;pcap_header ph;int count=0;void * buff = NULL;int readSize=0;int ret = 0;FILE *fp = fopen(PCAP_FILE, "rw");if (fp==NULL) {fprintf(stderr, "Open file %s error.\n",PCAP_FILE);ret = ERROR_FILE_OPEN_FAILED;goto ERROR;}fread(&pfh, sizeof(pcap_file_header), 1, fp);prinfPcapFileHeader(&pfh);//fseek(fp, 0, sizeof(pcap_file_header));buff = (void *)malloc(MAX_ETH_FRAME);for (count=1; ; count++) {memset(buff, 0, MAX_ETH_FRAME);//read pcap header to get a packet//get only a pcap head count .readSize=fread(&ph, sizeof(pcap_header), 1, fp);if (readSize<=0) {break;}printfPcapHeader(&ph);if (buff==NULL) {fprintf(stderr, "malloc memory failed.\n");ret = ERROR_MEM_ALLOC_FAILED;goto ERROR;}//get a packet contents.//read ph.capture_len bytes.readSize=fread(buff,1,ph.capture_len, fp);if (readSize != ph.capture_len) {free(buff);fprintf(stderr, "pcap file parse error.\n");ret = ERROR_PCAP_PARSE_FAILED;goto ERROR;}printPcap(buff, ph.capture_len);printf("===count:%d,readSize:%d===\n",count,readSize);if (feof(fp) || readSize <=0 ) { break;}}ERROR://freeif (buff) {free(buff);buff=NULL;} if (fp) {fclose(fp);fp=NULL;}return ret;}
objects=main.o pcap.otarget=pcaptestpcaptest:$(objects)gcc -o $(target) $(objects)main.o:pcap.hpcap.o:pcap.h.PHONY : cleanclean :rm $(target) $(objects)
0 0
- pcap-简单数据格式解析(初级)
- pcap文件解析(二)--初识IP包(初级)
- pcap文件解析--pcap文件头与包文件头(一)(初级)
- pcap编程深入解析
- pcap编程深入解析
- pcap文件解析
- pcap文件解析
- pcap文件格式解析
- 数据格式解析
- Winpcap 的PCap文件格式解析
- PCAP 文件内容解析命令
- pcap文件格式及文件解析
- pcap文件格式及文件解析
- pcap文件格式及文件解析
- 借助WireShark解析PCAP包
- Java之Pcap文件解析(一:Pcap格式分析)
- pcap
- PCAP
- ubuntu和win7共享文件
- 基于VC6.0开发环境的激光打标系统研究
- Surrounded Regions
- ArrayList对象遍历的两种方法
- C++ 引用
- pcap-简单数据格式解析(初级)
- Tool test
- grep 中文手册
- android 加密 解密
- Open Too Many files
- 语义网 相关
- 安装openssh for windows 3.8.1后,尝试启动opensshd服务,net start opensshd,失败
- C#程序以管理员权限运行
- [ javascript ] 司徒正美的fadeOut-fadeIn效果!
原创粉丝点击
热门IT博客
热门问题
老师的惩罚
人脸识别
我在镇武司摸鱼那些年
重生之率土为王
我在大康的咸鱼生活
盘龙之生命进化
天生仙种
凡人之先天五行
春回大明朝
姑娘不必设防,我是瞎子
茜茜公主故事拍
精灵公主妮娜
公主和皇叔在山洞hhhh
我是公主第二期
公主英文怎么读
公主房间图片
公主是什么意思
公主日记图片
迪士尼小公主
卡通公主图片
公主英语怎么读
公主画画图片
公主病是什么意思
小公主苏非亚
公主故事大全
公主英文怎么写
爱丽儿公主图片
苏菲亚小公主
贝儿公主的故事
儿童连衣裙公主
公主英语怎么说
公主用英语怎么说
公主照片大全
公主英文单词
安心公主 超h
公主的故事大全
公主故事大全童话故事
小公主的故事
公主童话故事全集
公主英语怎么写
儿童公主发型
公主什么意思
公主童话故事书
古代公主图片
公主化妆舞会
公主涂色炫彩华本
皇家公主邮轮
公主发型扎法图解
小孩公主发型
儿童公主房间
上海公主邮轮