本篇文章給大家?guī)砹岁P(guān)于golang的相關(guān)知識,其中主要給大家聊聊golang中怎么實現(xiàn)驅(qū)動層流量抓包,感興趣的朋友一起來看一下吧,希望對大家有幫助。
一、驅(qū)動抓包
應(yīng)用層抓包我們可以使用Fiddler、Httpdebugger、Charles等工具,如果需要獲取更底層網(wǎng)卡的數(shù)據(jù),就沒法實現(xiàn)了,我們就需要使用谷歌的gopacket包。
(相關(guān)資料圖)
二、遇到問題
gopacket的文檔豐富,這里不贅述如何去使用它,使用gopacket有一個前提:在Linux上需要提前安裝Npcap,在Windows上則需要提前安裝Winpcap,否則無法使用,會提示缺少相關(guān)的動態(tài)鏈接庫,這對于一些有潔癖的人來說就不太友好了,他們并不想去安裝多余的軟件,后面我們就來研究一下如何解決這個問題。
三、嘗試解決
首先我們不安裝任何工具,看一下錯誤提示,我這里使用的是Windows系統(tǒng):
couldn"t load wpcap.dll
提示我們沒有找到wpcap.dll,這很好理解,我們的確沒有,先來看看dll在系統(tǒng)內(nèi)的加載順序:
EXE所在目錄 ↓當(dāng)前目錄GetCurrentDirectory(); ↓系統(tǒng)目錄GetSystemDirectory(); ↓WINDOWS目錄GetWindowsDirectory(); ↓環(huán)境變量PATH所包含的目錄。
那解決辦法就很簡單了,去下載一個wpcap.dll放到exe所在目錄不就行了嗎,但事實證明這樣并不行,還是提示沒有找到鏈接庫。隨后,我又調(diào)用了一些Windows的接口,手動設(shè)置dll的目錄:
package mainimport ( "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)}結(jié)果還是找不到鏈接庫,到這里,我們能用的方法都失效了。在谷歌上,也有類似的問題,但是沒人能給出解決方案,都是讓我們安裝Winpcap,問題好像無解。
四、解決方案
使用dependency查看內(nèi)部依賴
在折騰了幾個小時候,找到了一個解決方案:
將wpcap.dll復(fù)制一份到system32目錄
將packet.dll復(fù)制一份到system32目錄
將npf.sys驅(qū)動復(fù)制一份到system32下的drivers目錄
現(xiàn)在就不需要安裝任何軟件也可以調(diào)用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如何快速實現(xiàn)驅(qū)動層流量抓包的詳細內(nèi)容,更多請關(guān)注php中文網(wǎng)其它相關(guān)文章!
關(guān)鍵詞: