协议分析器

本文介绍了作者在做网络课程设计时,编写的一款小程序,该程序能抓取网络报文,进行过滤和分析,尤其关注校验和的验证。实现了对MAC、ARP协议的过滤,以及IP、ICMP、TCP、UDP协议的过滤、分析和校验和验证功能。
摘要由CSDN通过智能技术生成

最近在做网络课程设计,写了一个小程序,主要功能就是抓取网络上的报文进行过滤并分析,字段分析中最主要的是校验和的验证,本次主要做了MAC和ARP的过滤及分析,IP、ICMP、TCP、UDP的过滤、分析以及校验和的验证

下面是源代码:

from scapy.all import*
import socket
from binascii import hexlify

import struct

macNum=0
arpNum=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=
  • 0
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
包括源程序和详细的使用说明个,同时内付相关的软件 编程环境: 操作系统:Windows XP SP2 开发语言:C++ / MFC 编译环境:MS Visual C++6.0 第3方函数库:Winpcap3.1 使用说明: 1. 启动: 程序启动后首先出现网卡选择对话框,如图1所示,在设备列表中选择需要进行捕获的网卡。 2. 界面: 选择网卡后出现程序主界面,界面设计主要参照了一款比较优秀的网络协议分析工具Iris的图形化界面,采用切分窗口风格,整个程序界面分为三部分:左侧为树形视图,右侧上半部分为列表视图,右侧下半部分为编辑视图 3. 功能: 1) 如果不做任何设置,程序默认为混杂模式,点击按钮① 后,程序开始捕获网络上传输的所有数据包,并将它们显示在列表视图中。点击按钮② 停止捕获。 2) 点击列表视图中的某一行后,对应于该数据包的详细字段分析和原始数据将分别显示在左侧树形视图和右下的编辑视图中,如图2所示。 3) 列表视图中显示的最大数据包数量为2000条,超过后列表视图将清空并重新开始。另外程序还提供了在任意时刻清空当前列表视图中所有数据包的命令(提供该命令的原因是经常会有这样的情况:即列表视图中已经有了很多消息了,但目前只需要关注从即刻起之后到来的消息,这时以前的消息就不再有用并且会影响我们对所要消息的选择)。要使用该命令请在列表视图中任意位置单击鼠标右键,在弹出的菜单中选择“全部清空”

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值