[英]Make ARP request on python
我正在嘗試在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.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是您用來分配套接字的任何變量。
要發送數據包,您應該將接口與
s.bind(("eth0", 0))
其中“ eth0”是網絡接口名稱。
之后,您可以使用
s.send(packet)
數據包是您的有效載荷,以字節串表示。
該
AttributeError: module 'socket' has no attribute 'AF_PACKET'
也就是說,您的平台上未實現AF_PACKET。 不幸的是,某些平台不提供對低層網絡層的訪問,這在Windows中是正確的,在OS X中也可能是正確的。至少,即使在Linux上,您也需要root特權才能訪問低層網絡。您會收到拒絕訪問錯誤。
通過Python訪問低級網絡的想法是使用虛擬機(例如Virtualbox),並運行一個Linux guest虛擬機。
FTR,要變通解決此問題,您可以使用Scapy。 它將使用:
在每種情況下都可以訪問原始層,這使它跨平台。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.