作为学习了一段时间的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
def clear():os.system('cls')
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) while True: b=f.read(16) if b==b'': break b=struct.unpack('4i',b) if m==0: ftime=b[0] else: ltime=b[0] f.read(12) frametype=f.read(2) if frametype!=b'\x08\x00': f.read(b[2]-14) else: g.write('%6d '%b[1]) n=n+b[2] version=f.read(1) g.write('IPV'+str(int(struct.unpack('B',version)[0]/16))+' ') TOS=f.read(1) total_length=f.read(2) ip_tlen=ip_tlen+total_length[1] ID=f.read(2) Flag_segment=f.read(2) life=f.read(1) xieyi=f.read(1) check=f.read(2) ip_from=f.read(4) ip_from=struct.unpack('4B',ip_from) ip_to=f.read(4) ip_to=struct.unpack('4B',ip_to) port_from=f.read(2) port_to=f.read(2) port_from=port_from[0]*256+port_from[1] port_to=port_to[0]*256+port_to[1] seq=f.read(4) ac=f.read(4) 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) m=m+1 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] g.write(' ') g.write('%dbyte'%b[2]) g.write('\n') 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)
|