当前位置: 首页 > news >正文

go语言开发windows抓包工具

使用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)
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Oracle发送邮件功能:配置自动化发信指南?
  • uniapp+若依 开发租房小程序源码分享
  • 深入解析Spring框架关键特性
  • wifi MSDU MPDU BA
  • linux-L5.linux查看应用占用的资源top
  • PD虚拟机占用多少内存?使用电脑的虚拟内存会损害电脑吗
  • 深入链表的遍历——快慢指针算法(LeetCode——876题)
  • Facebook的虚拟现实功能简介:社交网络的新前沿
  • Qt与VS打包命令
  • 安全基础设施如何形成统一生态标准?OASA 硬件安全合作计划启动 | 2024 龙蜥大会
  • 医学数据分析实训 项目二 数据预处理作业
  • JVM 调优篇7 调优案例1-堆空间的优化解决
  • Selenium打开浏览器后闪退问题解决
  • AndroidManifest.xml文件的重要信息
  • 38900 机动车安全检测
  • Angularjs之国际化
  • Angular数据绑定机制
  • CEF与代理
  • ES6系列(二)变量的解构赋值
  • PHP变量
  • Redis字符串类型内部编码剖析
  • vue-router 实现分析
  • vue学习系列(二)vue-cli
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 前端设计模式
  • 区块链分支循环
  • 深入浅出Node.js
  • 手写双向链表LinkedList的几个常用功能
  • #图像处理
  • (2024,LoRA,全量微调,低秩,强正则化,缓解遗忘,多样性)LoRA 学习更少,遗忘更少
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (万字长文)Spring的核心知识尽揽其中
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (已解决)Bootstrap精美弹出框模态框modal,实现js向modal传递数据
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • (转)iOS字体
  • .config、Kconfig、***_defconfig之间的关系和工作原理
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .net core 6 redis操作类
  • .NET Core 发展历程和版本迭代
  • .net反混淆脱壳工具de4dot的使用
  • .NET命名规范和开发约定
  • .one4-V-XXXXXXXX勒索病毒数据怎么处理|数据解密恢复
  • .sdf和.msp文件读取
  • .vollhavhelp-V-XXXXXXXX勒索病毒的最新威胁:如何恢复您的数据?
  • @antv/g6 业务场景:流程图
  • @NestedConfigurationProperty 注解用法
  • @Tag和@Operation标签失效问题。SpringDoc 2.2.0(OpenApi 3)和Spring Boot 3.1.1集成
  • @Transactional类内部访问失效原因详解
  • [ 隧道技术 ] 反弹shell的集中常见方式(二)bash反弹shell
  • [AI]ChatGPT4 与 ChatGPT3.5 区别有多大
  • [BUUCTF 2018]Online Tool
  • [BZOJ1010] [HNOI2008] 玩具装箱toy (斜率优化)
  • [CISCN2019 华东南赛区]Web11
  • [CTO札记]盛大文学公司名称对联