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

Windows下gopacket开启monitor模式抓包失败求解决方案

Windows下gopacket无法在监控模式抓包的解决方案

问题描述

我在Windows电脑上已启用网卡监控模式,用Wireshark或Scapy(设置monitor=True)能正常嗅探数据包,但使用gopacket却无法实现。已经通过命令wlanhelper "Wi-Fi" mode monitor将Wi-Fi设为监控模式且返回Success,运行以下代码无报错,但仅在非监控模式或嗅探环回包时抓包才生效。gopacket似乎没有类似Scapy的monitor模式启用函数,求Windows下在gopacket中开启监控模式的解决办法。

现有代码

package main

import (
    "fmt"
    "github.com/google/gopacket"
    "github.com/google/gopacket/pcap"
)

func main() {
    handle, err := pcap.OpenLive("\\Device\\NPF_{d6194530-0e27-4c84-b489-2cfe18d4af24}", 65536, true, pcap.BlockForever)
    if err != nil {
        fmt.Println(err)
    }
        defer handle.Close()

    packets := gopacket.NewPacketSource(handle, handle.LinkType())
    for packet := range packets.Packets() {
        fmt.Println(packet)
    }
}

解决方案

在Windows环境下,gopacket依赖的Npcap(替代旧版WinPcap)需要额外配置才能让网卡在监控模式下正常工作,以下是具体步骤:

1. 确认Npcap环境配置

  • 确保安装Npcap而非WinPcap,安装时必须勾选Install Npcap in WinPcap API-compatible Mode选项
  • 安装完成后重启电脑,确保网卡驱动加载了监控模式支持

2. 修改代码启用监控模式

gopacket本身没有直接的monitor模式开关,但可以通过底层pcap handle调用SetRFMon(true)来开启,同时补充错误处理避免空指针问题:

package main

import (
    "fmt"
    "github.com/google/gopacket"
    "github.com/google/gopacket/pcap"
)

func main() {
    handle, err := pcap.OpenLive("\\Device\\NPF_{d6194530-0e27-4c84-b489-2cfe18d4af24}", 65536, true, pcap.BlockForever)
    if err != nil {
        fmt.Println(err)
        return
    }
    defer handle.Close()

    // 启用射频监控模式(对应Wi-Fi的monitor模式)
    if err := handle.SetRFMon(true); err != nil {
        fmt.Printf("开启监控模式失败: %v\n", err)
        return
    }

    packets := gopacket.NewPacketSource(handle, handle.LinkType())
    for packet := range packets.Packets() {
        fmt.Println(packet)
    }
}

3. 权限与设备校验

  • 必须以管理员身份运行程序,Windows下修改网卡模式和抓包需要管理员权限
  • 确认指定的设备路径对应正确的Wi-Fi网卡,可通过以下代码获取所有设备列表核对:
devices, err := pcap.FindAllDevs()
if err != nil {
    fmt.Println(err)
    return
}
for _, d := range devices {
    fmt.Printf("设备名称: %s\n描述: %s\n\n", d.Name, d.Description)
}

4. 手动指定链路层类型(可选)

如果抓包仍无数据,可手动指定Wi-Fi监控模式的链路层类型(需导入layers包):

import "github.com/google/gopacket/layers"

// ...

packets := gopacket.NewPacketSource(handle, layers.LinkTypeIEEE802_11Radio)

内容的提问来源于stack exchange,提问作者ANDRVV

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 07:53:29