python怎样读取pcap文件

Python020

python怎样读取pcap文件,第1张

程序如下:

#!/usr/bin/env python

#coding=utf-8

#读取pcap文件,解析相应的信息,为了在记事本中显示的方便,把二进制的信息

import struct

fpcap = open('test.pcap','rb')

ftxt = open('result.txt','w')

string_data = fpcap.read()

#pcap文件包头解析

pcap_header = {}

pcap_header['magic_number'] = string_data[0:4]

pcap_header['version_major'] = string_data[4:6]

pcap_header['version_minor'] = string_data[6:8]

pcap_header['thiszone'] = string_data[8:12]

pcap_header['sigfigs'] = string_data[12:16]

pcap_header['snaplen'] = string_data[16:20]

pcap_header['linktype'] = string_data[20:24]

#把pacp文件头信息写入result.txt

ftxt.write("Pcap文件的包头内容如下: \n")

for key in ['magic_number','version_major','version_minor','thiszone',

'sigfigs','snaplen','linktype']:

ftxt.write(key+ " : " + repr(pcap_header[key])+'\n')

#pcap文件的数据包解析

step = 0

packet_num = 0

packet_data = []

pcap_packet_header = {}

i =24

while(i<len(string_data)):

#数据包头各个字段

pcap_packet_header['GMTtime'] = string_data[i:i+4]

pcap_packet_header['MicroTime'] = string_data[i+4:i+8]

pcap_packet_header['caplen'] = string_data[i+8:i+12]

pcap_packet_header['len'] = string_data[i+12:i+16]

#求出此包的包长len

packet_len = struct.unpack('I',pcap_packet_header['len'])[0]

#写入此包数据

packet_data.append(string_data[i+16:i+16+packet_len])

i = i+ packet_len+16

packet_num+=1

#把pacp文件里的数据包信息写入result.txt

for i in range(packet_num):

#先写每一包的包头

ftxt.write("这是第"+str(i)+"包数据的包头和数据:"+'\n')

for key in ['GMTtime','MicroTime','caplen','len']:

ftxt.write(key+' : '+repr(pcap_packet_header[key])+'\n')

#再写数据部分

ftxt.write('此包的数据内容'+repr(packet_data[i])+'\n')

ftxt.write('一共有'+str(packet_num)+"包数据"+'\n')

ftxt.close()

fpcap.close()

最终得到的result文件如下所示:字段显示的都是十六进制,其中的数据部分和wireshark打开,显示的十六进制窗口一样。

使用scapy、scapy_http就可以方便的对pcap包中的http数据包进行解析

#!/usr/bin/env python

try:

import scapy.all as scapy

except ImportError:

import scapy

try:

# This import works from the project directory

import scapy_http.http

except ImportError:

# If you installed this package via pip, you just need to execute this

from scapy.layers import http

packets = scapy.rdpcap('f:\\abc123.pcap')

for p in packets:

print '=' * 78

[python] view plain copy

#print p.show()

for f in p.payload.fields_desc:

if f.name == 'src' or f.name == 'dst':

ct = scapy.conf.color_theme

vcol = ct.field_value

fvalue = p.payload.getfieldval(f.name)

reprval = f.i2repr(p.payload,fvalue)

print "%s : %s" % (f.name, reprval)

for f in p.payload.payload.fields_desc:

if f.name == 'load':

ct = scapy.conf.color_theme

vcol = ct.field_value

fvalue = p.payload.getfieldval(f.name)

reprval = f.i2repr(p.payload,fvalue)

print "%s : %s" % (f.name, reprval)

其中,p为数据包,scapy_http将其分为:

Ethernet->TCP->RAW三个层次,

使用p.show()函数可以打印出如下结果:

###[ Ethernet ]###

dst = 02:00:00:00:00:39

src = 00:00:00:01:02:09

type = 0x800

###[ IP ]###

version = 4L

ihl = 5L

tos = 0x0

len = 1014

id= 7180

flags =

frag = 0L

ttl = 45

proto = tcp

chksum= 0xbbf9

src = 126.209.59.13

dst = 121.113.176.25

\options \

###[ Raw ]###

load = '.....'

第一层是网络层,包含源、目的mac、ip协议号,第二层是tcp层,第三层包含端口号、http报文

其中每一层均为上一层的payload成员

步骤:

1、标记文件开始,并用来识别文件自己和字节顺序。

2、Major:2Byte:当前文件主要的版本号。

3、Minor:2Byte:当前文件次要的版本号。

4、ThisZone:4Byte:当地的标准时间,直接写00000000。Python由荷兰数学和计算机科学研究学会的吉多范罗苏姆于1990年代初设计,作为一门叫做ABC语言的替代品,Python提供了高效的高级数据结构,还能简单有效地面向对象编程。