繁体   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