go语言开发windows抓包工具

devtools/2024/12/22 20:26:39/

使用syscall调用window api, go有封装, 暂时不需要自己调用dll

使用函数

syscall.WSAStartup

syscall.Socket

syscall.SockaddrInet4

syscall.WSAIoctl

syscall.WSARecv

废话不多说, 上代码简洁明了使用方法

package mainimport ("fmt""net""strconv""strings""syscall""unsafe""capture/console"
)const (SIO_RCVALL uint32 = 0x98000001
)const (SIO_RCVALL_ON uint32 = 0x00000001
)func getLanIp() (string, error) {var ip string = ""addrs, _ := net.InterfaceAddrs()for _, addr := range addrs {// 检查是否为IP netipNet, _ := addr.(*net.IPNet)if ipNet.IP.To4() != nil && ipNet.IP.IsGlobalUnicast() {ip = ipNet.IP.String()return ip, nil}}return ip, nil
}func ipToIpBytes(ip string) [4]byte {ipStrArr := strings.Split(ip, ".")var ipBytes [4]bytefor key, value := range ipStrArr {u64, _ := strconv.ParseUint(value, 10, 64)b := uint8(u64)ipBytes[key] = byte(b)}return ipBytes
}func main() {var wsaData syscall.WSADataerr := syscall.WSAStartup(0x0202, &wsaData)if err != nil {console.Log("WSAStartup:", err)return}var hints syscall.AddrinfoWhints.Family = syscall.AF_INEThints.Socktype = syscall.SOCK_RAWhints.Protocol = syscall.IPPROTO_IPrawSocket, err := syscall.Socket(int(hints.Family), int(hints.Socktype), int(hints.Protocol))if err != nil {console.Log("Socket:", err)return}ip, _ := getLanIp()addr := syscall.SockaddrInet4{Port: 0,Addr: ipToIpBytes(ip),}err = syscall.Bind(rawSocket, &addr)if err != nil {console.Log("Bind:", err)return}dwValue := SIO_RCVALL_ONdwValuePtr := unsafe.Pointer(&dwValue)dwValuePtrlen := uint32(unsafe.Sizeof(dwValue))dwOutValue := SIO_RCVALL_ONdwOutValuePtr := unsafe.Pointer(&dwOutValue)dwOutValuePtrlen := uint32(unsafe.Sizeof(dwOutValuePtr))var dwValueReturn uint32err = syscall.WSAIoctl(rawSocket, SIO_RCVALL, (*byte)(dwValuePtr), dwValuePtrlen, (*byte)(dwOutValuePtr), dwOutValuePtrlen, &dwValueReturn, nil, uintptr(0))if err != nil {console.Log("WSAIoctl: ", err)return}console.Log("成功启动")var buff [4096]bytewsabuf := syscall.WSABuf{Buf: (*byte)(unsafe.Pointer(&buff[0])),Len: uint32(len(buff)),}var ret uint32 = 0var flag uint32 = 0for {err = syscall.WSARecv(rawSocket, &wsabuf, 1, &ret, &flag, nil, nil)if err != nil {console.Log("WSARecv: ", err)}fmt.Printf("接收数据的长度: %d, 数据为: \n", ret)fmt.Printf("%v \n\n", buff[:ret])}}// WSAEINTR (10004): 系统中断错误
// WSAEBADF (10009): 文件描述符不正确
// WSAEACCES (10013): 权限被拒绝
// WSAEFAULT (10014): 内存访问错误
// WSAEINVAL (10022): 参数无效
// WSAEMFILE (10024): 打开的文件数量过多
// WSAEWOULDBLOCK (10035): 非阻塞socket操作现在无法完成
// WSAEINPROGRESS (10036): 进程中有一个阻塞的socket调用正在进行
// WSAEALREADY (10037): 操作已完成
// WSAENOTSOCK (10038): 描述符不是一个socket
// WSAEDESTADDRREQ (10039): 需要目标地址
// WSAEMSGSIZE (10040): 消息过长
// WSAEPROTOTYPE (10041): 协议类型错误
// WSAENOPROTOOPT (10042): 协议选项错误
// WSAEPROTONOSUPPORT (10043): 协议不支持
// WSAESOCKTNOSUPPORT (10044): socket类型不支持
// WSAEOPNOTSUPP (10045): 操作不支持
// WSAEPFNOSUPPORT (10046): 协议族不支持
// WSAEAFNOSUPPORT (10047): 地址族不支持
// WSAEADDRINUSE (10048): 地址已在使用中
// WSAEADDRNOTAVAIL (10049): 地址不可用
// WSAENETDOWN (10050): 网络下线
// WSAENETUNREACH (10051): 网络不可达
// WSAENETRESET (10052): 网络重置
// WSAECONNABORTED (10053): 连接中止
// WSAECONNRESET (10054): 连接重置
// WSAENOBUFS (10055): 无可用缓冲区
// WSAEISCONN (10056): 连接已经是连接状态
// WSAENOTCONN (10057): 连接未建立
// WSAESHUTDOWN (10058): 无法发送数据,socket被关闭
// WSAETOOMANYREFS (10059): 太多引用
// WSAETIMEDOUT (10060): 连接超时
// WSAECONNREFUSED (10061): 连接被拒绝
// WSAELOOP (10062): 有一个处理中的对话
// WSAENAMETOOLONG (10063): 地址名太长
// WSAEHOSTDOWN (10064): 主机宕机

capture是我的项目名字, console包是仿js的console

package consoleimport ("encoding/json""fmt"
)func Log(data ...interface{}) {bytes, err := json.MarshalIndent(data, "", "  ")if err != nil {fmt.Println(err)}fmt.Printf("%s\n", bytes)
}


http://www.ppmy.cn/devtools/111853.html

相关文章

Android 车联网——汽车模块介绍(附1)

汽车模块指的是车辆中独立的电子控制单元(ECUs),如发动机控制单元(ECU)、车身控制模块(BCM)等,它们负责特定的功能或系统。 一、控制类模块 这些模块主要用于控制车辆的不同系统,确保车辆各部分的正常运行。 1、ECM ECM(Electronic Control Module,电子控制模块)…

什么是交换机级联?

在现代计算机网络中,交换机级联是一种广泛应用的技术,有助于提升网络的扩展性和灵活性。本文将深入探讨交换机级联相关知识,详细介绍其基本概念和连接配置方法,并对常见技术问题进行解答。 交换机级联概述 交换机级联是指通过将…

openstack之glance介绍

概念 glance为nova提供镜像服务,用于启动实例,预建镜像已安装cloud-init,可以访问openstack基金会获取操作系统镜像:官方镜像 格式 raw:无格式的镜像; vhd:hyper-v使用的格式; vm…

栈和队列的算法题目(C语言)

1. 括号匹配问题 20. 有效的括号 - 力扣(LeetCode) 利用栈后入先出的特性解题 1.判断字符串是否为空 为空返回 2.创建栈,遍历字符串 第一个字符是左括号的情况:入栈->继续遍历下一个字符 第一个字符是右括号的情况&#xf…

ZoneTree: 高性能ACID兼容的.NET有序键值数据库

推荐一个专门针对键值存储的开源数据库。 01 项目简介 ZoneTree基于.Net开发的开源键值数据库。它以其持久化存储、高性能处理、事务性操作和ACID合规性而著称。ZoneTree能够以内存数据库的形式运行,也可以在本地或云存储上进行数据持久化,提供了灵活性…

认识泛型和包装类

认识泛型和包装类 包装类基本数据类型和对应的包装类装箱和拆箱自动装箱和自动拆箱 什么是泛型引出泛型语法 泛型类的使用语法示例类型推导 裸类型(Raw Type)说明 泛型如何编译的擦除机制 泛型的上界语法示例复杂示例 泛型方法定义方法示例使用类型推导和不用类型推导静态的泛型…

Axure高效打造大屏可视化BI数据展示

在使用AxureRP软件设计大屏可视化BI数据显示模板时,我们可以遵循一系列高效的方法和步骤来确保设计的质量和效率。以下是一个详细的教程,指导如何高效地使用AxureRP进行大屏界面设计。 一、确定设计标准与分辨率 通常,大屏可视化设计以标准的…

Qt 开发:深入详解 Qt 的信号与槽机制——彻底搞懂QT信号与槽

一、概念 Qt 的信号与槽(Signals and Slots)机制是一个用于对象间通信的核心特性。这个机制使得对象能以松散耦合的方式进行通信,从而提升了代码的模块化和可维护性。 信号(Signal):对象状态的变化或事件…