最近在做网络课程设计,写了一个小程序,主要功能就是抓取网络上的报文进行过滤并分析,字段分析中最主要的是校验和的验证,本次主要做了MAC和ARP的过滤及分析,IP、ICMP、TCP、UDP的过滤、分析以及校验和的验证
下面是源代码:
from scapy.all import*
import socket
from binascii import hexlify
import struct
macNum=0arpNum=0
ipNum=0
icmpNum=0
tcpNum=0
udpNum=0
######################################################################### MAC帧过滤(OK)
# 08:d4:0c:4f:f2:63 84:d9:31:80:cd:f1
def mac_callback(packet):
print("0:源Mac 1:目的Mac 2:源Mac和目的Mac")
Type=input("请输入过滤条件:")
Type=int(Type)
if Type==0:
SrcMac=input('请输入源Mac地址:')
sniff(filter="ether src %s " %SrcMac,prn=macpacket_callback,count=0)
if Type==1:
DstMac=input('请输入目的Mac地址:')
sniff(filter="ether dst %s" %DstMac,prn=macpacket_callback,count=0)
if Type==2:
SrcMac=input('请输入源Mac地址:')
DstMac=input('请输入目的Mac地址:')
sniff(filter="ether src %s and ether dst %s"%(SrcMac,DstMac),prn=macpacket_callback,count=0)
# MAC帧解析(OK)
def macpacket_callback(packet):
global macNum
macNum=macNum+1
ts="捕获到第 "+str(macNum)+" 个以太帧"
print("***************我是MAC帧分界线***************************")
print(ts)
print("目的MAC:%s" % packet[Ether].dst)
print("源MAC: %s" % packet[Ether].src)
print("协议类型:%s" % packet[Ether].type)
# 输出数据包的结构信息,便于上层协议分析
print('************ 输出Mac帧的结构信息,便于上层协议分析 *************')
print(packet.show())
print('************************ 输出Mac帧完成 **************************')
macprotocol=packet[Ether].type
mac_protocol=int(macprotocol)
if mac_protocol==2054:
print("*******MAC上层报文类型为 ARP 报文*******")
arppacket_callback(packet)
if mac_protocol==2048:
print("*******MAC上层报文类型为 IP 报文*******")
ippacket_callback(packet)
# ARP过滤(OK)
#08:d4:0c:4f:f2:63 84:d9:31:80:cd:f1
def arp_callback(packet):
print("0:ARP报文 1:源Mac 2:目的Mac 3:源Mac和目的Mac")
Type=input("请输入过滤条件:")
Type=int(Type)
if Type==0:
print("所有 ARP 报文")
sniff(filter="arp",prn=arppacket_callback,count=0)
if Type==1:
SrcMac=input('请输入源Mac地址:')
sniff(filter="arp and ether src %s " %SrcMac,prn=arppacket_callback,count=0)
if Type==2:
DstMac=input('请输入目的Mac地址:')
sniff(filter="arp and ether dst %s" %DstMac,prn=arppacket_callback,count=0)
if Type==3:
SrcMac=input('请输入源Mac地址:')
DstMac=input('请输入目的Mac地址:')
sniff(filter="arp and ether src %s and ether dst %s"%(SrcMac,DstMac),prn=arppacket_callback,count=0)
# ARP解析(OK)
def arppacket_callback(packet):
global arpNum
arpNum=arpNum+1
ts="捕获到第 "+str(arpNum)+" 个ARP报文"
print("*****MAC帧***********")
print("目的MAC:%s" % packet[Ether].dst)
print("源MAC: %s" % packet[Ether].src)
print("协议类型:%s" % packet[Ether].type)
print("***************************我是ARP报分界线***************************")
print(ts)
print("硬件类型(2byte): %s" % packet[ARP].hwtype)
print("使用ARP的协议类型(2byte): %s"%hex(packet[ARP].ptype))
print("硬件地址长度(1byte):%s" % packet[ARP].hwlen)
print("协议地址长度(1byte):%s" % packet[ARP].plen)
print("操作类型(1请求,2应答,2byte): %s" % packet[ARP].op)#1请求,2应答
print("源Mac地址(6byte): %s" % packet[ARP].hwsrc)
print("源IP地址(4byte): %s" % packet[ARP].psrc)
print("目的Mac地址(6byte): %s" % packet[ARP].hwdst)
print("目的IP地址(4byte): %s" % packet[ARP].pdst)
# IP过滤 (OK)
def ip_callback(packet):
print("0:IP报文 1:源IP 2:目的IP 3:源IP和目的IP ")
Type=input("请输入过滤条件:")
Type=