簡體   English   中英

Python 2.7 RAW套接字:ARP標頭中的字段缺失和錯誤

[英]Python 2.7 RAW sockets: missing and wrong fields in ARP header

在開始的時候,我想說我以前沒有使用套接字的經驗。 我正在嘗試在python 2.7中創建響應ARP數據包。 我差不多完成了,但是有一個問題:當我查看Wireshark中的數據包時,我發現ARP標頭缺少發件人和目標mac以及發件人和目標ip字段。 Harware大小和協議大小字段也是錯誤的。 我究竟做錯了什么? 我會錯誤地打包數據嗎? 這是程序的源代碼:

import socket
import struct
import binascii


def formatMAC(mac):
    return mac.lower().replace(':', '')

def sendPacket(packet):
    s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW)
    s.bind(("wlan0", 0))
    return s.send(packet)

eth_src = formatMAC('A0:88:B4:0A:A5:A8')
eth_dst = formatMAC("18:A6:F7:CF:51:B6")
eth_prt = '0806'

arp_hw_type = '0001'
arp_prt_type = '0800'
arp_hw_size = '0006'
arp_prt_size = "0004"
arp_opcode = '0002'
arp_mac_src = formatMAC('A0:88:B4:0A:A5:A8')
arp_ip_src = '192.168.0.134'
arp_mac_dst = formatMAC('18:A6:F7:CF:51:B6')
arp_ip_dst = '192.168.0.1'

eth_pack = struct.pack("!6s6s2s", binascii.unhexlify(eth_dst), binascii.unhexlify(eth_src), binascii.unhexlify(eth_prt))
arp_pack = struct.pack("2s2s1s1s2s6s4s6s4s",
         binascii.unhexlify(arp_hw_type), 
         binascii.unhexlify(arp_prt_type),
         binascii.unhexlify(arp_hw_size),
         binascii.unhexlify(arp_prt_size),
         binascii.unhexlify(arp_opcode),
         binascii.unhexlify(arp_mac_src),
         socket.inet_aton(arp_ip_src), 
         binascii.unhexlify(arp_mac_dst),
         socket.inet_aton(arp_ip_dst)
         )

packet = eth_pack + arp_pack
print(sendPacket(packet))

Wireshark屏幕截圖

謝謝。

如果將Wireshark十六進制轉儲與您要發送的內容相匹配,您會看到實際發送的數據包的“硬件地址大小”和“協議地址大小”字段均為00。

這是因為您將兩個字節傳遞給struct.pack (0006和0004),但是您告訴它(帶有1s )僅格式化了1個字節,因此它僅輸出第一個字節。

如果您查看十六進制轉儲,您會看到地址實際上是發送的,Wireshark只是忽略了它們,因為假定大小為0。

只需將0006和0004更改為06和04,因為它們是1字節字段。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM