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