本篇文章給大家帶來了關於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檢視內部依賴
在折騰了幾個小時候,找到了一個解決方案:
將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其它相關文章!