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

2023-03-14 18:00:22

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

一、驅動抓包

應用層抓包我們可以使用Fiddler、Httpdebugger、Charles等工具,如果需要獲取更底層網路卡的資料,就沒法實現了,我們就需要使用谷歌的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)
}
登入後複製

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

四、解決方案

使用dependency檢視內部依賴

b74dc35b9f410bdfc8dd1af2a0402dc.jpg

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

  • 將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如何快速實現驅動層流量抓包的詳細內容,更多請關注TW511.COM其它相關文章!