gopacket 在 windows 上面遇到的问题
2024-08-25 04:56:45
前阵子有个需求是使用 golang 抓包改包,我用到了 gopacket 这个包,但是出了一些小问题。
我按照网上的方法进行使用 OpenLive 抓包,发现并不行,报错 error open adapter 啥啥啥。
经过调试发现根本找不到这个网卡,需要用 \Device\NPF_ 开头的网卡设备名,我去看了 scapy 的实现,发现使用的是 winpcap/npcap 驱动的 pcap_findalldevs 这个方法,我去 gopacket 里面找了下,发现有个方法 pcap.FindAllDevs() 可以得到所有的网卡信息。
但是用这个方法得到的数据里面的 windows 自带的网卡的 Description 描述字段上就只有个 microsoft,压根不知道是什么东西,结合 net.interifaces() 方法中的 ip 与之前得到的数据对应起来,得到了一个简陋的方案
直接上代码
package main
import (
"fmt"
"log"
"net"
"github.com/google/gopacket/pcap"
)
type IfaceInfo struct {
NPFName string
Description string
NickName string
IPv4 string
}
func get_if_list() []IfaceInfo {
var ifaceInfoList []IfaceInfo
// 得到所有的(网络)设备
devices, err := pcap.FindAllDevs()
if err != nil {
log.Fatal(err)
}
interface_list, err := net.Interfaces()
if err != nil {
log.Fatal(err)
}
for _, i := range interface_list {
byName, err := net.InterfaceByName(i.Name)
if err != nil {
log.Fatal(err)
}
address, err := byName.Addrs()
ifaceInfoList = append(ifaceInfoList, IfaceInfo{NickName: byName.Name, IPv4: address[1].String()})
}
// 打印设备信息
// fmt.Println("Devices found:")
// for _, device := range devices {
// fmt.Println("\nName: ", device.Name)
// fmt.Println("Description: ", device.Description)
// fmt.Println("Devices addresses: ", device.Description)
// for _, address := range device.Addresses {
// fmt.Println("- IP address: ", address.IP)
// fmt.Println("- Subnet mask: ", address.Netmask)
// }
// }
var vaildIfaces []IfaceInfo
for _, device := range devices {
for _, address := range device.Addresses {
for _, ifaceinfo := range ifaceInfoList {
if strings.Contains(ifaceinfo.IPv4, address.IP.String()) {
vaildIfaces = append(vaildIfaces, IfaceInfo{NPFName: device.Name, Description: device.Description, NickName: ifaceinfo.NickName, IPv4: ifaceinfo.IPv4})
break
}
}
}
}
return vaildIfaces
}
func main() {
fmt.Println(get_if_list())
}
最新文章
- phpcms 服务器安全认证错误
- python 中文乱码问题
- js 操作ASP.NET服务器控件
- qt button以及label实现不规则图形(五种方法:使用QSS,设置Mask图片,自己画)
- TortoiseGit - Gitblit使用简介
- [BZOJ 4417][Shoi2013]超级跳马
- 百度java开发面试题
- C语言的3种参数传递方式
- Kotlin 随笔小计
- 支持Linux,嗅探和注入功能的网卡
- 下载、安装JDK并配置JDK的环境变量
- 运用kmp算法解决的一些问题的简单题解
- The Twelve-Factor Container
- luogu4182 [USACO18JAN] Lifeguards P (单调队列优化dp)
- Remmina剪切板不正常的问题
- 学习 rostopic
- 0004python中的map,reduce,lambda,filter
- English trip -- 国际音标表
- linux系统下安装两个或多个tomcat
- NOIP2011
热门文章
- Mitmproxy的mimdump mimproxy mitmweb命令行性能对比
- 第2课第2节_Java面向对象编程_封装性_P【学习笔记】
- Win10下轻松安装centos7.0(推荐)
- Hive的配置详解和日常维护
- Tosca case status PLANNED,IN-WORK,COMPLETED 对应的图标
- [转]EXCEL截取字符串中某几位的函数——LeftMIDRight及Find函数的使用
- 品优购商城项目(二)AngularJS、自动代码生成器、select2下拉多选框
- 基于Python的WEB接口开发与自动化测试 pdf(内含书签)
- 常用快捷键 &; BLOG &; Website
- OpenGL程序无法启动此应用程序,因为计算机中丢失glut32.dll(转))