Python 套接字正在向我的以太网帧添加数据

Python 套接字正在向我的以太网帧添加数据,python,sockets,wireshark,ethernet,Python,Sockets,Wireshark,Ethernet,我正在尝试使用Python2.7(在Ubuntu下)通过wifi发送原始以太网帧。我的代码如下所示 from socket import * data = [0x24, 0x95, 0x04, 0x8a, 0x6c, 0xd0, 0x00, 0x21, 0x6a, 0x72, 0xd4, 0x80, 0x08, 0x00, 0x45, 0x00, 0x00, 0x54, 0xe3, 0x5a, 0x40, 0x00, 0x40, 0x01, 0xd3, 0x9b, 0xc0, 0xa8, 0x

我正在尝试使用Python2.7(在Ubuntu下)通过wifi发送原始以太网帧。我的代码如下所示

from socket import *

data = [0x24, 0x95, 0x04, 0x8a, 0x6c, 0xd0, 0x00, 0x21, 0x6a, 0x72, 0xd4, 0x80, 0x08, 0x00, 0x45, 0x00,
0x00, 0x54, 0xe3, 0x5a, 0x40, 0x00, 0x40, 0x01, 0xd3, 0x9b, 0xc0, 0xa8, 0x01, 0x61, 0xc0, 0xa8,
0x01, 0x01, 0x08, 0x00, 0xef, 0xae, 0x0e, 0x90, 0x00, 0x01, 0x75, 0x1d, 0xca, 0x5b, 0xcb, 0x43,
0x04, 0x00, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,
0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25,
0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35,
0x36, 0x37]

byteSequence = b"".join(map(chr, data))

s = socket(AF_PACKET, SOCK_RAW)
s.bind(("wls1", 0))
s.send(byteSequence)
变量
data
应表示表示ping请求的有效以太网帧。当我运行此脚本并在Wireshark中检查帧时,我看到

0000 | 2495 04 8a 6c d0 00 21 6a 72 d4 80 08 00 45 00
0010 | 00 54 e3 5a 40 00 40 01 d3 9b c0 a8 01 61 c0 a8
0020 | 01 01 08 00 ef ae 0e 90 00 01 75 1d ca 5b cb 43
0030 | 04 00 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15
0040 | 16 17 19 1a 1b 1c 1d 1e 1f 20 21 22 24 25
0050 | 26 27 28 29 2b 2c 2d 2e 2f 30 31 33 35
0060 | 36 37 2e 50 61 6e 65 6c 00 00 00 83 00
正如您所看到的,这是我想要发送的数据,但在末尾附加了14个额外字节(转换为ASCII read
.Panel……。

尽管如此,ping似乎仍然有效,因为我从路由器得到了回复

这似乎是Python的问题,而不是Wireshark的问题,因为使用
ping
程序从终端发送的ping没有这些额外的数据


发生了什么事?

你检查过bytesequence是预期的数据吗?@barny Yup-
打印(十六进制(ord(bytesequence[-1]))
打印
0x37
。如果Python发送的是正确的,数据包是否以某种方式被填充到16字节的倍数?如果将字节序列延长几个字节,会发生什么情况?也就是说,这可能是一个堆栈问题。@barny我相信你是对的,但不是!在
数据
的末尾添加一些额外的字节,Wireshark再次显示了预期的数据,但有14个额外的字节-因此它不仅仅是填充16字节对齐。出于某些原因,它每次都会添加14个字节。安装scapy软件包时需要演示的一行代码是:
sudo./python3-c”,来自scapy.all import*;pkt=Ether(dst='24:95:04:8a:6c:d0',src='00:21:61:72:d4:80')/IP(src='192.168.1.97',dst='192.168.1.1')/ICMP(type='echo-request',code=0)/bytes(x&0xff用于范围(56));sendp(pkt,iface='eth2')“