无需winpcap/npcap,Windows平台Python数据包收发与嗅探方案咨询
无需WinPcap/Npcap的Python数据包收发方案
1. 利用Windows原生RAW Socket(无额外依赖)
Windows系统原生支持通过socket模块创建RAW类型套接字,直接收发以太网帧,完全不需要WinPcap/Npcap驱动。
嗅探(录制)实现
创建SOCK_RAW套接字并绑定到目标网卡,循环接收数据后手动解析帧结构:
import socket import struct # 创建RAW套接字,ETH_P_ALL(0x0003)表示捕获所有以太网帧 s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(0x0003)) # 替换为你的网卡名称,可通过`netsh interface show interface`命令查询 s.bind(("Ethernet", 0)) try: while True: data, _ = s.recvfrom(65535) # 解析以太网帧头部(前14字节) dest_mac = struct.pack('!6B', *data[0:6]).hex(':') src_mac = struct.pack('!6B', *data[6:12]).hex(':') eth_type = struct.unpack('!H', data[12:14])[0] print(f"捕获帧: {src_mac} -> {dest_mac}, 帧类型 {hex(eth_type)}") # 可根据需要继续解析IP、TCP等上层协议 except KeyboardInterrupt: s.close()
发送数据包实现
构造符合以太网协议规范的完整帧,通过RAW套接字发送:
import socket import struct s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(0x0003)) s.bind(("Ethernet", 0)) # 构造帧内容:目标MAC、源MAC、帧类型(0x0800=IPv4)、负载数据 dest_mac = bytes.fromhex("00:11:22:33:44:55".replace(':', '')) src_mac = bytes.fromhex("AA:BB:CC:DD:EE:FF".replace(':', '')) eth_type = struct.pack('!H', 0x0800) payload = b"Test Ethernet Packet" # 拼接完整帧并发送 frame = dest_mac + src_mac + eth_type + payload s.send(frame) s.close()
注意:
- 必须以管理员权限运行脚本,否则无法创建RAW套接字
- 网卡名称需准确,否则绑定失败
- 发送的帧需严格遵循协议格式,否则可能被网卡丢弃
2. dpkt配合原生Socket(简化协议解析)
如果需要便捷解析IP、TCP等上层协议,可以用dpkt库——它仅负责数据包解析,收发仍依赖Windows原生Socket,无需第三方驱动。
先安装dpkt:
pip install dpkt
示例(嗅探+协议解析):
import socket import dpkt s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(0x0003)) s.bind(("Ethernet", 0)) try: while True: data, _ = s.recvfrom(65535) eth = dpkt.ethernet.Ethernet(data) # 解析IPv4数据包 if isinstance(eth.data, dpkt.ip.IP): ip = eth.data src_ip = socket.inet_ntoa(ip.src) dest_ip = socket.inet_ntoa(ip.dst) print(f"IPv4: {src_ip} -> {dest_ip}, 协议号 {ip.p}") # 解析TCP层 if isinstance(ip.data, dpkt.tcp.TCP): tcp = ip.data print(f"TCP端口: {tcp.sport} -> {tcp.dport}") except KeyboardInterrupt: s.close()
优缺点:
- 优点:协议解析逻辑更简洁,无需手动处理字节结构
- 缺点:发送数据包仍需手动构造完整帧,
dpkt仅提供解析能力
3. Windows Filtering Platform(WFP)进阶方案
如果需要深度定制数据包过滤、修改逻辑,可以基于Windows原生的WFP接口开发,通过pywin32调用系统API,或者使用封装好的pywfp库。这类方案完全依赖系统原生能力,无需任何第三方驱动,但学习成本较高,适合复杂场景。
内容的提问来源于stack exchange,提问作者Mirko M
相关产品推荐
相关产品推荐

