前段時間接到乙個公司關於解析pacp檔案的培訓(我是被培訓的),在完成了一部分的功能後決定把一些關於pcap檔案的了解記錄到部落格中。
在開始讀取pcap檔案之前,先讓我們來看看pcap檔案的大概結構。
如上圖所示在乙個pcap檔案中存在1個pcap檔案頭和多個資料報,其中每個資料報都有自己的頭和包內容。
下面我們先看看pcap檔案頭每個欄位是什麼意思:
magic為檔案識別頭,pcap固定為:0xa1b2c3d4。(4個位元組)
magor version為主版本號(2個位元組)
minor version為次要版本號(2個位元組)
timezone為
當地的標準時間(4個位元組)
sigflags為
時間戳的精度(4個位元組)
snaplen為
最大的儲存長度(4個位元組)
linktype為鏈路型別(4個位元組)
常用型別:
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
資料報頭則依次為:時間戳(秒)、時間戳(微妙)、抓包長度和實際長度,依次各佔4個位元組。
c**:
pcap_header.h
[cpp]view plain
copy
#pragma pack( push, 1)
// 為了保證在windows和linux下都能正常編譯,放棄使用int64或者_int_64
typedef
short
_int16;
typedef
long
_int32;
typedef
char
byte;
// pcap檔案頭
struct
__file_header
; // 資料報頭
struct
__pkthdr
; #pragma pack( pop)
main.c
[cpp]view plain
copy
#include
#include"pcap_header.h"
#include
#include
#include
intmain()
fseek( pfile, 0, seek_end);
long
ifilelen = ftell( pfile);
fseek( pfile, 0, seek_set);
byte* pbuffer = (byte*)malloc( ifilelen);
fread( (void
*)pbuffer, 1, ifilelen, pfile);
fclose( pfile);
memcpy( (void
*)&header, (
void
*)(pbuffer)
, sizeof
(struct
__file_header));
intiindex =
sizeof
(struct
__file_header);
intino = 1;
while
(iindex <= ifilelen)
free( pbuffer);
printf( "成功匯出%d個檔案"
, ino - 1);
return
1;
}
Pcap檔案格式解析
一 24位元組pcap檔案頭 乙個檔案只有乙個 linktype為鏈路層型別,決定資料幀頭結構,其他沒啥用 typedef struct pcapfileheader pcapfileheader t 二 pcap包頭 乙個檔案可以有很多個包 時間戳 typedef struct pcaptime ...
pcap檔案概述
檔案整體結構示意圖 檔案整體結構描述 magic 4b 0x1a 2b 3c 4d 用來標示檔案的開始 major 2b,0 02 00 當前檔案主要的版本號 minor 2b,0 04 00當前檔案次要的版本號 thiszone 4b當地的標準時間 全零 sigfigs 4b時間戳的精度 全零 s...
PCAP檔案格式
一 基本格式 檔案頭 資料報頭 資料報 資料報頭 資料報.二 檔案頭結構體 以下是資料值與鏈路層型別的對應表 0 bsd loopback devices,except for later openbsd 1 ethernet,and linux loopback devices 乙太網型別,大多數...