2016-02-11 123 views
1

我試圖在python上發出ARP請求。我的代碼:在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

+0

出於好奇,有什麼理由不使用scapy嗎? – Goodies

+0

第二層幀是一個帶有廣播目的地MAC地址(FFFF.FFFF.FFFF)和ARP ethertype(0x0806)的標準以太網幀。三層報文是一個ARP請求。有關ARP數據包格式,請參閱http://www.tcpipguide.com/free/t_ARPMessageFormat.htm。 –

+0

@Goodies這是「計算機網絡」課程的家庭作業。 – 0x1337

回答

2

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客戶機。