首頁 >後端開發 >Golang >詳解Go如何快速實現驅動層流量抓包

詳解Go如何快速實現驅動層流量抓包

藏色散人
藏色散人轉載
2023-03-14 17:09:513317瀏覽

這篇文章為大家帶來了關於golang的相關知識,其中主要給大家聊聊golang中怎麼實現驅動層流量抓包,感興趣的朋友一起來看一下吧,希望對大家有幫助。

一、驅動抓包

應用層抓包我們可以使用Fiddler、Httpdebugger、Charles等工具,如果需要取得更底層網卡的數據,就沒法實現了,我們就需要使用Google的gopacket套件。

二、遇到問題

gopacket的文檔豐富,這裡不贅述如何去使用它,使用gopacket有一個前提:在Linux上需要事先安裝Npcap,在Windows上則需要事先安裝Winpcap,否則無法使用,會提示缺少相關的動態連結庫,這對於一些有潔癖的人來說就不太友好了,他們並不想去安裝多餘的軟體,後面我們就來研究一下如何解決這個問題。

三、嘗試解決

首先我們不安裝任何工具,看一下錯誤提示,我這裡使用的是Windows系統:

couldn't load wpcap.dll

提示我們沒有找到wpcap.dll,這很好理解,我們的確沒有,先來看看dll在系統內的載入順序:

EXE所在目录
    ↓
当前目录GetCurrentDirectory();
    ↓
系统目录GetSystemDirectory();
    ↓
WINDOWS目录GetWindowsDirectory();
    ↓
环境变量PATH所包含的目录。

那解決方法就很簡單了,去下載一個wpcap.dll放到exe所在目錄不就行了嗎,但事實證明這樣並不行,還是提示沒有找到連結庫。隨後,我又呼叫了一些Windows的接口,手動設定dll的目錄:

package main

import (
    "fmt"
    "github.com/google/gopacket/pcap"
    "golang.org/x/sys/windows"
    "os"
    "path/filepath"
    "unsafe"
)

func main() {
    kernel32, err := windows.LoadDLL("kernel32.dll")
    if err != nil {
        fmt.Println(err.Error())
        return
    }
    proc, err := kernel32.FindProc("AddDllDirectory")
    if err != nil {
        fmt.Println(err.Error())
        return
    }
    // 获取绝对路径
    absolute,err := os.Executable()
    if err != nil {
        fmt.Println(err.Error())
        return
    }
    absolute = filepath.Join(absolute,"../")
    utf16Ptr, err := windows.UTF16FromString(absolute)
    if err != nil {
        fmt.Println(err.Error())
        return
    }
    r1, r2, err := proc.Call(uintptr(unsafe.Pointer(&utf16Ptr[0])))
    fmt.Println(r1, r2, err)
    version := pcap.Version()
    fmt.Println(version)
}

結果還是找不到連結庫,到這裡,我們能用的方法都失效了。在Google上,也有類似的問題,但沒人能給出解決方案,都是讓我們安裝Winpcap,問題好像無解。

四、解決方案

使用dependency查看內部依賴

詳解Go如何快速實現驅動層流量抓包

在折騰了幾個小時候,找到了一個解決方案:

  • 將wpcap.dll複製一份到system32目錄

  • ##將packet.dll複製一份到system32目錄

  • 將npf.sys驅動複製一份到system32下的drivers目錄

現在就不需要安裝任何軟體也可以呼叫gopacket

fmt.Println(pcap.Version())

輸出

WinPcap version 4.1.3 (packet.dll version 4.1.0.2980), based on libpcap version 1.0 branch 1_0_rel0b (20091008)

【相關推薦:

Go影片教學

以上是詳解Go如何快速實現驅動層流量抓包的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:learnku.com。如有侵權,請聯絡admin@php.cn刪除