我正在尝试在 python 上发出 ARP 请求。我的代码:
import socket
from struct import pack
from uuid import getnode as get_mac
def main():
dest_ip = [10, 7, 31, 99]
local_mac = [int(("%x" % get_mac())[i:i+2], 16) for i in range(0, 12, 2)]
local_ip = [int(x) for x in socket.gethostbyname(socket.gethostname()).split('.')]
sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.SOCK_RAW)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
sock.bind(('', 0))
ARP_FRAME = [
pack('!H', 0x0001), # HRD
pack('!H', 0x0800), # PRO
pack('!B', 0x06), # HLN
pack('!B', 0x04), # PLN
pack('!H', 0x0001), # OP
pack('!6B', *local_mac), # SHA
pack('!4B', *local_ip), # SPA
pack('!6B', *(0x00,)*6), # THA
pack('!4B', *dest_ip), # TPA
]
print(ARP_FRAME)
sock.sendto(b''.join(ARP_FRAME), ('255.255.255.255', 0))
sock.close()
if __name__ == "__main__":
main()
当我执行此代码时,Wireshark 没有捕获任何数据包。
我认为 socket 有问题。当我执行 socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.SOCK_RAW)
时,我得到 AttributeError: module 'socket' has no attribute 'AF_PACKET'
。我做错了什么以及如何解决它?
OS X 10.11.3
最佳答案
socket.AF_INET 是 IP 数据包的套接字。由于 ARP 是以太网,因此它不会以这种方式工作,您需要访问以太网层。
在 Linux 上,您可以使用:
s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(3))
其中 s 是您用来分配套接字的任何变量。
要发送数据包,您应该绑定(bind)接口(interface)
s.bind(("eth0", 0))
其中“eth0”是网络接口(interface)名称。
之后,您可以发送数据包
s.send(packet)
数据包是字节串形式的有效负载。
AttributeError: module 'socket' has no attribute 'AF_PACKET'
表示 AF_PACKET 未在您的平台上实现。 不幸的是,某些平台不提供对低级网络层的访问,对于 Windows 是这样,对于 OS X 可能也是如此。 至少,即使在 Linux 上,您也需要 root 权限才能访问低级网络,否则您将收到拒绝访问错误。
通过 Python 访问低级网络的一个想法是使用虚拟机(例如 Virtualbox),并用它运行 Linux 客户机。
关于python - 在python上进行ARP请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35348012/