簡體   English   中英

網絡數據包嗅探器:使用python處理一個以太網幀(MAC src&dest地址+協議)

[英]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)應該是定義0x0800ETH_P_IP (IPv4 數據包),但我得到了8 因此,您似乎可以刪除socket.htons()調用以獲得正確的值。

暫無
暫無

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

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