专栏首页python3Python Scapy ARP

Python Scapy ARP

参考手册:https://fossies.org/dox/scapy-2.3.3/

当一台主机把以太网数据帧发送到位于同一个局域网上的另一台主机时,是根据48bit的以太网地址来确定目的接口的。

设备驱动程序从不检查IP数据包中的目的IP地址。

地址解析为这两种不同的地址形式提供映射:32bit的IP地址和数据链路曾使用的任何类型的地址。(FR环境)

ARP为IP地址到对应的硬件地址之间提供动态映射。我们之所以用动态这个词是因为这个过程是自动完成的,一般应用程序用户或系统管理员不必关心。

在ARP背后有有一个基本概念,那就是网络接口有一个硬件地址(一个48bit的值,标识不同的以太网或令牌环网络接口)。在硬件层次上进行的数据帧交换必须有正确的接口地址。但是TCP/IP有自己的地址:32bit的IP地址。知道主机的IP地址并不能让内核发送一帧数据给主机。内核(如以太网驱动程序)必须知道目的端的硬件地址才能发送数据。ARP的功能是在32bit的IP地址和采用不同网络技术的硬件地址之间提供动态映射。

点对点链路不使用ARP。当设置这些链路时(一般在引导过程进行),必须告知内核链路每一端的IP地址。像以太网地址这样的硬件地址并不涉及。

只有多路访问链路才需要ARP这样的技术。

ARP高效运行的关键是由于每个主机上都有一个ARP高速缓存。这个高速缓存存放了最近Internet地址到硬件地址之间的映射记录。高速缓存中每一项的生存时间一般为20分钟,起始时间从被创建时开始算起。

ARP请求包样例:

#!/usr/bin/python3.4
# -*- coding=utf-8 -*-

import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)#清除报错
from scapy.all import *

#配置各种信息,以便调用
localmac = '00:0c:29:8d:5c:b6'
localip = '202.100.1.138'
destip = '202.100.1.139'
ifname = 'eno33554944'

#######################源MAC为本地MAC####目的MAC为广播#########操作码为1(请求)#######################################################由于多个网卡所以需要指派iface###########
result_raw = srp(Ether(src=localmac, dst='FF:FF:FF:FF:FF:FF')/ARP(op=1, hwsrc=localmac, hwdst='00:00:00:00:00:00', psrc=localip, pdst=destip), iface = ifname, verbose = False)

'''
sr() function is for sending packets and receiving answers. The function #returns a couple of packet and answers, and the unanswered packets. 
sr1() is a variant that only return one packet that answered the packet (or #the packet set) sent. The packets must be layer 3 packets (IP, ARP, etc.). 
srp() do the same for layer 2 packets (Ethernet, 802.3, etc.).
send() function will send packets at layer 3. That is to say it will handle routing and layer 2 for you. 
sendp() function will work at layer 2.
'''

#print(result_raw)
#(<Results: TCP:0 UDP:0 ICMP:0 Other:1>, <Unanswered: TCP:0 UDP:0 ICMP:0 Other:0>) 一个元组,[0]收到响应的数据包,[1]未收到响应的数据包
#print(type(result_raw[0]))
#<class 'scapy.plist.SndRcvList'> #https://fossies.org/dox/scapy-2.3.1/classscapy_1_1plist_1_1SndRcvList.html
result_list = result_raw[0].res #res: the list of packets,产生由收发数据包所组成的清单(list)
#print(result_list)
#[(<Ether  dst=FF:FF:FF:FF:FF:FF src=00:0c:29:8d:5c:b6 type=ARP |<ARP  op=who-has hwsrc=00:0c:29:8d:5c:b6 psrc=202.100.1.138 hwdst=00:00:00:00:00:00 pdst=202.100.1.139 |>>, <Ether  dst=00:0c:29:8d:5c:b6 src=00:0c:29:43:52:cf type=ARP |<ARP  hwtype=0x1 ptype=IPv4 hwlen=6 plen=4 op=is-at hwsrc=00:0c:29:43:52:cf psrc=202.100.1.139 hwdst=00:0c:29:8d:5c:b6 pdst=202.100.1.138 |<Padding load=‘\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00’ |>>>)]
#一个列表,每一个item为一个元组,元组内包括一次ARP请求与回应

#result_list[0][1][0],[0]表示第一组数据包(收发),[1],表示收包(0为发包),[0]表示以太网头部
#print(result_list[0][1][0].fields) 以太网头部字段
#{'dst': '00:0c:29:8d:5c:b6', 'type': 2054, 'src': '00:0c:29:43:52:cf'}

#result_list[0][1][0],[0]表示第一组数据包(收发),[1],表示收包(0为发包),[1]表示ARP头部
#print(result_list[0][1][1].fields) ARP头部字段
#{'pdst': '202.100.1.138', 'hwtype': 1, 'hwdst': '00:0c:29:8d:5c:b6', 'plen': 4, 'ptype': 2048, 'hwsrc': '00:0c:29:43:52:cf', 'op': 2, 'hwlen': 6, 'psrc': '202.100.1.139'}

print('IP地址: ' + result_list[0][1][1].fields['psrc'] + ' MAC地址: ' + result_list[0][1][1].fields['hwsrc'])

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • python列表与元组的用法

    7.列表生成式   #[i*i for i in range(10)]       [i*i for i in range(10) if i>5]

    py3study
  • python之操作redis

    py3study
  • python学习(13)

    #coding=utf-8 result = [] for i in range(1,6): result.append(chr(97+i-1)+str(i))...

    py3study
  • MAC本遭遇ARP攻击的处理办法

    windows环境下,如果遭遇ARP攻击,解决方法很简单:“360安全卫士”或"QQ软件管理"的实时防护里,都有ARP防护功能(默认是关闭的),只要启用就行了。...

    菩提树下的杨过
  • 软件安全性测试(连载23)

    ARP(Address Resolution Protocol)即地址解析协议,是根据IP地址获取物理地址的一个TCP/IP协议。如图4-54所示。

    小老鼠
  • 让RT-Thread在frdm-k64上跑起来

    RT-Thread绝对算得上是国产RTOS操作系统里优秀的一支,也获得了风险投资,发展势头迅猛,合作伙伴也越来越多,基于RTT的产品也越来越多,有消费类电子的...

    用户1605515
  • Mac下Idea导入Git项目

    赵哥窟
  • Linux内核源码分析--内核启动之zImage自解压过程

    http://blog.chinaunix.net/uid-20543672-id-3018233.html

    用户3033338
  • Python算法题----1到100求和

    py3study
  • 关于移动web教程免费发布

    各位老铁大家好,最近经历了太多太多,精力一直不能集中做自己愿意做的事情。 移动Web课程一开始设置收费10块,其实本意是让大家感觉有支出,就会相对珍惜好好学习,...

    老马

扫码关注云+社区

领取腾讯云代金券