贴一个用python实现了一个解析pcap文件的小工具

作为学习了一段时间的py和复习了一段网络有关的知识,就实现了如下的一个小工具,输入时pcap格式的文件,后序的话在实现用哈希来更好的存储吧。。
嗯。。写的有点乱。。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
import struct
import os
#x=os.system('cls')
def clear():os.system('cls')
#def clear():
# os.system('clear')
#huanying

def welcome():
print('\t******************************\n')
print ('\t* *\n')
print ('\t* oneturle sniffer *\n')
print ('\t* *\n')
print('\n\t******************************\n')
print('你想要了解什么呢?\n')
print('1.报文总数统计\n')
print('2.平均每秒字节数和每秒报文数的统计\n')
print('3.各种协议的每秒报文数统计和每秒字节数统计\n')
print('4.各种协议数据在流量中所占的比例\n')
print('5.退出\n')

#初始化参数
input_file=input('请输入文件名:\n')
output_file=input('请输出文件名:\n')
print("\n"*15)
m=0
n=0
tcp_n=0
udp_n=0
tcp_n=0
udp_n=0
egp_n=0
igp_n=0
ipv6_n=0
ospf_n=0
icmp_n=0
igmp_n=0
tcp_l=0
udp_l=0
tcp_l=0
udp_l=0
egp_l=0
igp_l=0
ipv6_l=0
ospf_l=0
icmp_l=0
igmp_l=0
ftime=0
ltime=0
ip_tlen=0

with open(output_file,'w') as g:
with open(input_file,'rb') as f:
total=f.read(24)
total=struct.unpack('LHHLLLL',total)#BHL
while True:
b=f.read(16)
if b==b'':
break
#for i in range(18):
#b=f.read(16) #shujutou
b=struct.unpack('4i',b)
if m==0:
ftime=b[0] #shujudaodashijian
else:
ltime=b[0]
#n=n+b[3] #jisuanshujuchangdu
#g.write('%d '%b[1])
#print('%d'%b[3])
f.read(12) #mac
frametype=f.read(2) #panbianip leixing
if frametype!=b'\x08\x00':
f.read(b[2]-14)
#if frametype!=b'\x08\x00':
#f.read(b[2]-14)
else:
g.write('%6d '%b[1])
n=n+b[2]
version=f.read(1) #ipv4 or ipv6
g.write('IPV'+str(int(struct.unpack('B',version)[0]/16))+' ')
TOS=f.read(1) #fuwu lei xing
total_length=f.read(2) # chang du
ip_tlen=ip_tlen+total_length[1] #jisuan changdu
ID=f.read(2)
Flag_segment=f.read(2)
life=f.read(1)
xieyi=f.read(1)
#print(xieyi)
check=f.read(2)
#xieyi=struct.unpack('B',xieyi)
#print('%d'%xieyi)
ip_from=f.read(4) #ip address
ip_from=struct.unpack('4B',ip_from)
ip_to=f.read(4)
ip_to=struct.unpack('4B',ip_to)
port_from=f.read(2) #duan kou
port_to=f.read(2)
port_from=port_from[0]*256+port_from[1]
port_to=port_to[0]*256+port_to[1]
#port_from=struct.unpack('H',port_from)
#port_to=struct.unpack('H',port_to)
seq=f.read(4) #xu lie hao
ac=f.read(4) #ack renzheng
g.write('.'.join(['%3d'%i for i in ip_from])+':%d'%port_from)
g.write('==>')
g.write('.'.join(['%3d'%i for i in ip_to])+':%d '%port_to)
f.read(b[3]-34-12)#shuju chang du -shuju tou -shuju neirong
#if frametype==b'\x08\x00':
m=m+1 #ip bao geshu
if xieyi==b'\x06':
g.write('TCP')
tcp_n=tcp_n+1
tcp_l=tcp_l+b[2]
elif xieyi==b'\x11':
g.write('UDP')
udp_n=udp_n+1
udp_l=udp_l+b[2]
elif xieyi==b'\x01':
g.write('ICMP')
icmp_n=icmp_n+1
icmp_l=icmp_l+b[2]
elif xieyi==b'\x02':
g.write('IGMP')
igmp_n=igmp_n+1
igmp_l=igmp_l+b[2]
elif xieyi==b'\x08':
g.write('EGP')
egp_n=egp_n+1
egp_l=egp_l+b[2]
elif xieyi==b'\x09':
g.write('IGP')
igp_n=igp_n+1
igp_l=igp_l+b[2]
elif xieyi==b'\x29':
g.write('IPV6')
ipv6_n=ipv6_n+1
ipv6_l=ipv6_l+b[2]
elif xieyi==b'\x4f':
g.write('OSPF')
ospf_n=ospf_n+1
ospf_l=ospf_l+b[2]#3
g.write(' ')
g.write('%dbyte'%b[2]) #dan ge baowen changdu
g.write('\n')
#print('%d'%f.tell())
welcome()
k=m
while True:
f=input('请输入:\n')
f=int(f)
if f==1:
print('\n\n\n报文大小为: %ld byte\n'%n)
flag=input('是否继续,y or n?\n')
if flag=='y':
print("\n"*15)
welcome()
elif flag=='n':
exit(0)
if f==2:
print("\n\n\n平均每秒字节数为:%4.2f b/s\n"%(n/(ltime-ftime)))
print("平均每秒报文数为:%8.6f m/s\n"%(k/(ltime-ftime)))
flag=input('是否继续,y or n?\n')
if flag=='y':
print("\n"*15)
welcome()
elif flag=='n':
exit(0)
if f==3:
print("\n"*5)
print('\n\n\nICM2P:协议的每秒报文数统计:%4.2f b/s\n'%(icmp_l/(ltime-ftime)))
print("每秒字节数统计:%4.2f m/s\n"%(icmp_n/(ltime-ftime)))
print("IGMP:\t协议的每秒报文数统计:%4.2f b/s\n"%(igmp_l/(ltime-ftime)))
print("每秒字节数统计:%4.2f m/s\n"%(igmp_n/(ltime-ftime)))
print('TCP:协议的每秒报文数统计:%4.2f b/s\n'%(tcp_l/(ltime-ftime)))
print("每秒字节数统计:%4.2f m/s\n"%(tcp_n/(ltime-ftime)))
print("EGP:\t协议的每秒报文数统计:%4.2f b/s\n"%(egp_l/(ltime-ftime)))
print("每秒字节数统计:%4.2f m/s\n"%(egp_n/(ltime-ftime)))
print('IGP:协议的每秒报文数统计:%4.2f b/s\n'%(igp_l/(ltime-ftime)))
print("每秒字节数统计:%4.2f m/s\n"%(igp_n/(ltime-ftime)))
print("UDP:\t协议的每秒报文数统计:%4.2f b/s\n"%(udp_l/(ltime-ftime)))
print("每秒字节数统计:%4.2f m/s\n"%(udp_n/(ltime-ftime)))
print('IPV6:协议的每秒报文数统计:%4.2f b/s\n'%(ipv6_l/(ltime-ftime)))
print("每秒字节数统计:%4.2f m/s\n"%(ipv6_n/(ltime-ftime)))
print("OSPF:\t协议的每秒报文数统计:%4.2f b/s\n"%(ospf_l/(ltime-ftime)))
print("每秒字节数统计:%4.2f m/s\n"%(ospf_n/(ltime-ftime)))
flag=input('是否继续,y or n?\n')
if flag=='y':
print("\n"*15)
welcome()
elif flag=='n':
exit(0)

if f==4:
print("\n"*18)
print('\n\n\nICMP :%4.2f'%(icmp_n/k*100)+'%\n')
print('IGMP :%4.2f'%(igmp_n/k*100)+'%\n')
print('TCP :%4.2f'%(tcp_n/k*100)+'%\n')
print('EGP :%4.2f'%(egp_n/k*100)+'%\n')
print('IGP :%4.2f'%(igp_n/k*100)+'%\n')
print('UDP :%4.2f'%(udp_n/k*100)+'%\n')
print('IPV6 :%4.2f'%(ipv6_n/k*100)+'%\n')
print('OSPF :%4.2f'%(ospf_n/k*100)+'%\n')
flag=input('是否继续,y or n?\n')
if flag=='y':
print("\n"*15)
welcome()
elif flag=='n':
exit(0)
if f==5:
print('\n\n再见~\n\n')
exit(0)