You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无需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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 13:20:14