[英]Network Packet Sniffer:Process an Ethernet frame (MAC src&dest address + protocole) using python
我試圖在 python 中簡單地獲取和處理我的以太網幀來做到這一點我在 python 中編寫了這個簡單的代碼(由教程幫助):
import socket
import struct
def ethernet_frame_fct(data):
dest_mac, src_mac, proto = struct.unpack('! 6s 6s H', data[:14])
return get_mac_addr_fct(dest_mac), get_mac_addr_fct(src_mac), socket.htons(proto), data[14:]
def get_mac_addr_fct(bytes_addr):
bytes_str = map('{:02x}'.format, bytes_addr)
mac_addr = ':'.join(bytes_str).upper()
return mac_addr
def main_fct():
# if platform == "linux" or platform == "linux2":
# conn = socket.socket(socket.AF_PACKET, socket.SOCKET_RAW, socket.ntohs(3))
# if platform == "win32":
HOST = socket.gethostbyname(socket.gethostname()) # the public network interface
conn = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP) # create a raw socket and bind it to the public interface
conn.bind((HOST, 0))
conn.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1) # Include IP headers
conn.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON) # receives all packets
while True:
raw_data, addr = conn.recvfrom(65536)
dest_mac, src_mac, eth_proto, data = ethernet_frame_fct(raw_data)
print("\n-Ethernet Frame:")
print('\t' + "MAC addr Destination= {}, MAC addr Source= {}, Protocol= {}".format(dest_mac, src_mac, eth_proto))
#
main_fct()
但是應該是我的mac地址的源MAC地址根本不是我的MAC地址,並且協議不是預期的標簽之一。
例如:6=TCP, 17=UDP ...等等...但是 17796 根本不是我期望得到的值。
關於這個最后一個值,當我在筆記本電腦上運行這個程序時,我會得到不同的值(所以 wifi 會發生變化),但我從來沒有得到一些邏輯。
我完全不知道我錯在哪里。
幾天來,我真的很困惑並堅持這個問題,所以如果有人能夠幫助我,我將非常感激。
謝謝你。
我在 Linux 上,如果以 root 身份運行,則完全基於您的代碼的以下代碼適用於我:
import socket
ETH_P_ALL = 3
s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(ETH_P_ALL))
s.bind(('wlp4s0', 0)) # your WiFi interface, on Linux found using `ifconfig` or similar
eth_packet = s.recv(2048) # get a sample packet
ethernet_frame_fct(eth_packet)
這為我提供了我的 WiFi 卡的正確 MAC 地址。 我的示例eth_packet
中的 EtherType(proto)應該是定義為0x0800
的ETH_P_IP
(IPv4 數據包),但我得到了8
。 因此,您似乎可以刪除socket.htons()
調用以獲得正確的值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.