ARP查询


前言

记录一些学习经验、遇到的问题


一、基础设置

1.ARP查询(版本1)

只查询单个IP
缺点1:查询单个IP是否存活(总时长254秒)

from scapy.all import *
from scapy.layers.l2 import ARP, Ether

### 查询单个IP的MAC地址
def arp1():
    ip = "192.168.1.1"  # 需要查询的IP

    arpPkt = Ether(dst="ff:ff:ff:ff:ff:ff") / ARP(pdst=ip)  
    # 报文格式:Ether广播,ARP查询IP
    # 发送arp请求,并获取响应结果。设置1s超时。
    res = srp1(arpPkt, timeout=1, verbose=1)  # srp1发送并接受,timeout 超时丢弃,verbose 显示详细内容

    if res:
        print(res.hwsrc)  # 输出查找IP的MAC地址
    else:
        print("不存在")

if __name__ == '__main__':
    arp1()

2.ARP查询(版本2)

通过while循环查询254个网段内IP
缺点1:每个报文超时1秒,所以耗时较长(总时长254秒)
缺点2:只能在通局域网、同vlan内查询

from scapy.all import *
from scapy.layers.l2 import ARP, Ether

###查询某个网段内IP对应的MAC地址
# (缺点1:每个报文超时1秒,所以耗时较长)
# (缺点2:只能在通局域网、同vlan内查询)
def arp2():
    network_ip = "192.168.1"  # 需要查询的IP网段
    t = 1
    while t < 255:
        ip = network_ip + '.' + str(t)

        arpPkt = Ether(dst="ff:ff:ff:ff:ff:ff") / ARP(pdst=ip)  # 报文格式:Ether广播,ARP查询IP
        # 发送arp请求,并获取响应结果。设置1s超时。
        res = srp1(arpPkt, timeout=1, verbose=0)  # srp1发送并接受,timeout 超时丢弃,verbose 显示详细内容
        if res:
            print("ip地址:" + ip + "  mac地址:" + res.hwsrc)  # 输出查找IP的MAC地址
        else:
            print("ip地址:" + ip + "不存在")
        t += 1
if __name__ == '__main__':
	arp2()

3.ARP查询(版本3)

通过创建5个进程,每个进程查询50个IP,并行查询
缺点1:每个报文超时1秒,所以耗时较长(五个进程并行查询,总时长54秒)
缺点2:只能在通局域网、同vlan内查询
缺点3:需要手动设置线程数量(5个)

from scapy.all import *
from scapy.layers.l2 import ARP, Ether
from PyQt5.QtCore import QThread  # 进程

###查询某个网段内IP对应的MAC地址(未完成)
# (缺点1:需要手动设置线程数量)
# (缺点2:只能在通局域网、同vlan内查询)
t1 = 1
network_ip = "192.168.1"  # 需要查询的IP网段

def arp3():
    global t1
    c = []

    c.append(qt1())
    c.append(qt2())
    c.append(qt3())
    c.append(qt4())
    c.append(qt5())

    c[0].start()
    c[1].start()
    c[2].start()
    c[3].start()
    c[4].start()

    while t1 <= 254:
        time.sleep(3)


class qt1(QThread):  ###创建进程
    def run(self):
        global t1,network_ip
        t = 1
        while t <= 50:
            ip = network_ip + '.' + str(t)
            print("1: " + str(ip))
            arpPkt = Ether(dst="ff:ff:ff:ff:ff:ff") / ARP(pdst=ip)  # 报文格式:Ether广播,ARP查询IP
            # 发送arp请求,并获取响应结果。设置1s超时。
            res = srp1(arpPkt, timeout=1, verbose=0)  # srp1发送并接受,timeout 超时丢弃,verbose 显示详细内容
            if res:
                print("ip地址:" + ip + "  mac地址:" + res.hwsrc)  # 输出查找IP的MAC地址
            else:
                print("ip地址:" + ip + "不存在")
            t += 1
            t1 +=1

class qt2(QThread):  ###创建进程
    def run(self):
        global t1
        t = 51
        while t <= 100:
            ip = network_ip + '.' + str(t)
            print("2: " + str(ip))
            arpPkt = Ether(dst="ff:ff:ff:ff:ff:ff") / ARP(pdst=ip)  # 报文格式:Ether广播,ARP查询IP
            # 发送arp请求,并获取响应结果。设置1s超时。
            res = srp1(arpPkt, timeout=1, verbose=0)  # srp1发送并接受,timeout 超时丢弃,verbose 显示详细内容
            if res:
                print("ip地址:" + ip + "  mac地址:" + res.hwsrc)  # 输出查找IP的MAC地址
            else:
                print("ip地址:" + ip + "不存在")
            t += 1
            t1 +=1

class qt3(QThread):  ###创建进程
    def run(self):
        global t1
        t = 100
        while t <= 150:
            ip = network_ip + '.' + str(t)
            print("3: " + str(ip))
            arpPkt = Ether(dst="ff:ff:ff:ff:ff:ff") / ARP(pdst=ip)  # 报文格式:Ether广播,ARP查询IP
            # 发送arp请求,并获取响应结果。设置1s超时。
            res = srp1(arpPkt, timeout=1, verbose=0)  # srp1发送并接受,timeout 超时丢弃,verbose 显示详细内容
            if res:
                print("ip地址:" + ip + "  mac地址:" + res.hwsrc)  # 输出查找IP的MAC地址
            else:
                print("ip地址:" + ip + "不存在")
            t += 1
            t1 +=1

class qt4(QThread):  ###创建进程
    def run(self):
        global t1
        t = 151
        while t <= 200:
            ip = network_ip + '.' + str(t)
            print("4: " + str(ip))
            arpPkt = Ether(dst="ff:ff:ff:ff:ff:ff") / ARP(pdst=ip)  # 报文格式:Ether广播,ARP查询IP
            # 发送arp请求,并获取响应结果。设置1s超时。
            res = srp1(arpPkt, timeout=1, verbose=0)  # srp1发送并接受,timeout 超时丢弃,verbose 显示详细内容
            if res:
                print("ip地址:" + ip + "  mac地址:" + res.hwsrc)  # 输出查找IP的MAC地址
            else:
                print("ip地址:" + ip + "不存在")
            t += 1
            t1 +=1

class qt5(QThread):  ###创建进程
    def run(self):
        global t1
        t = 201
        while t <= 254:
            ip = network_ip + '.' + str(t)
            print("5: " + str(ip))
            arpPkt = Ether(dst="ff:ff:ff:ff:ff:ff") / ARP(pdst=ip)  # 报文格式:Ether广播,ARP查询IP
            # 发送arp请求,并获取响应结果。设置1s超时。
            res = srp1(arpPkt, timeout=1, verbose=0)  # srp1发送并接受,timeout 超时丢弃,verbose 显示详细内容
            if res:
                print("ip地址:" + ip + "  mac地址:" + res.hwsrc)  # 输出查找IP的MAC地址
            else:
                print("ip地址:" + ip + "不存在")
            t += 1
            t1 +=1

if __name__ == '__main__':
	arp3()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值