這篇文章為大家帶來了關於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查看內部依賴
在折騰了幾個小時候,找到了一個解決方案:
將wpcap.dll複製一份到system32目錄
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中文網其他相關文章!