[英]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.