python arp扫描_python实现的arp扫描

#!/usr/bin/python

import sendpkt

import dpkt

import os

import re

import socket

import struct

import string

import sys

import signal

iface = "eth0"

mac   = "00:09:5B:98:0D:85"

inet  = "10.29.1.61"

debug = False

# this should be somewhere is dpkt ?

ETH_ADDR_BROADCAST = '\xff\xff\xff\xff\xff\xff'

ETH_ADDR_UNSPEC = '\x00\x00\x00\x00\x00\x00'

def eth_ntoa(buffer):

# Convert binary data into a string.

macaddr = ''

for intval in struct.unpack('BBBBBB', buffer):

if intval > 15:

replacestr = '0x'

else:

replacestr = 'x'

macaddr = ''.join([macaddr, hex(intval).replace(replacestr, '')])

return macaddr

def eth_aton(buffer):

addr =''

temp = string.split(buffer,':')

buffer = string.join(temp,'')

# Split up the hex values and pack.

for i in range(0, len(buffer), 2):

addr = ''.join([addr,struct.pack('B', int(buffer[i: i + 2], 16))],)

return addr

def buildArp(addr):

arp_p = dpkt.arp.ARP()

arp_p.sha = eth_aton(mac)          # sender hardware addr

arp_p.spa = socket.inet_aton(inet) # sender ip addr

arp_p.tha = ETH_ADDR_UNSPEC        # dest hardware addr

arp_p.tpa = socket.inet_aton(addr) # ip addr of request

arp_p.op = dpkt.arp.ARP_OP_REQUEST

packet = dpkt.ethernet.Ethernet()

packet.src = eth_aton(mac)

packet.dst = ETH_ADDR_BROADCAST

packet.data = arp_p

packet.type = dpkt.ethernet.ETH_TYPE_ARP

if debug: print dpkt.hexdump(str(packet))

return packet

def quit(signum,frame):

print "Scan ended.."

sys.exit(0)

signal.alarm(2)

signal.signal(signal.SIGALRM,quit)

s = socket.socket(socket.PF_PACKET, socket.SOCK_RAW)

s.bind((iface,dpkt.ethernet.ETH_TYPE_ARP))

for i in range (1,255):

addr = "10.29.1.%s" % i

packet = buildArp(addr)

s.send(str(packet))

print "Results..."

while 1:

data = s.recv(1024)

if debug: print dpkt.hexdump(data)

sys.stdout.flush()

answer = ethernet.Ethernet(data)

arp_p = answer.data

orig = socket.inet_ntoa( arp_p.spa )

mac_add = eth_ntoa( arp_p.sha)

dest = socket.inet_ntoa( arp_p.tpa )

if debug:print dpkt.hexdump( str(arp_p) )

if arp_p.op != arp.ARP_OP_REQUEST:

if dest ==  inet:

print "Anser:  %s is at %s"  % (orig,mac_add)

else:

print "Not for me.. Origin:%s Target:%s Answer:%s" % (orig, dest,mac_add)

else:

if debug:print "Host %s look for address of %s" % (orig,dest)

阅读(7165) | 评论(0) | 转发(0) |

好的,你的问题是关于Python3利用Scapy局域网实现自动多线程ARP扫描功能。 首先,你需要安装Scapy库,可以使用以下命令: ``` pip install scapy ``` 然后,你可以使用以下Python代码实现ARP扫描功能: ```python from scapy.all import * from threading import Thread def arp_scan(ip): arp = ARP(pdst=ip) ether = Ether(dst="ff:ff:ff:ff:ff:ff") packet = ether/arp result = srp(packet, timeout=3, verbose=0)[0] if result: return {'IP': result[0][1].psrc, 'MAC': result[0][1].hwsrc} else: return {'IP': ip, 'MAC': 'N/A'} def scan_network(target_ip, threads): ips = [target_ip + str(i) for i in range(1, 255)] print("Scanning in progress...") scan_results = [] for ip in ips: t = Thread(target=lambda result_list: result_list.append(arp_scan(ip)), args=(scan_results,)) t.start() if threading.activeCount() > threads: t.join() print("Scan complete.") return scan_results if __name__ == '__main__': target_ip = '192.168.1.' threads = 50 results = scan_network(target_ip, threads) for result in results: print(result['IP'], result['MAC']) ``` 在这个示例中,我们定义了两个函数,arp_scan()和scan_network()。arp_scan()函数用于扫描单个IP地址,并返回IP地址和MAC地址。scan_network()函数用于扫描整个网络,并返回所有扫描结果。 我们还使用了Python的多线程功能来加快扫描速度,并限制了线程数以避免过度消耗系统资源。 最后,我们使用主函数来设置目标IP地址和线程数,然后调用scan_network()函数来执行扫描,并打印扫描结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值