這篇文章主要介紹“Go怎么快速實現(xiàn)驅(qū)動層流量抓包”的相關(guān)知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Go怎么快速實現(xiàn)驅(qū)動層流量抓包”文章能幫助大家解決問題。
創(chuàng)新互聯(lián)總部坐落于成都市區(qū),致力網(wǎng)站建設(shè)服務(wù)有成都做網(wǎng)站、網(wǎng)站設(shè)計、網(wǎng)絡(luò)營銷策劃、網(wǎng)頁設(shè)計、網(wǎng)站維護、公眾號搭建、微信小程序、軟件開發(fā)等為企業(yè)提供一整套的信息化建設(shè)解決方案。創(chuàng)造真正意義上的網(wǎng)站建設(shè),為互聯(lián)網(wǎng)品牌在互動行銷領(lǐng)域創(chuàng)造價值而不懈努力!
一、驅(qū)動抓包
應(yīng)用層抓包我們可以使用Fiddler、Httpdebugger、Charles等工具,如果需要獲取更底層網(wǎng)卡的數(shù)據(jù),就沒法實現(xiàn)了,我們就需要使用谷歌的gopacket包。
二、遇到問題
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所在目錄
↓
當前目錄GetCurrentDirectory();
↓
系統(tǒng)目錄GetSystemDirectory();
↓
WINDOWS目錄GetWindowsDirectory();
↓
環(huán)境變量PATH所包含的目錄。
那解決辦法就很簡單了,去下載一個wpcap.dll放到exe所在目錄不就行了嗎,但事實證明這樣并不行,還是提示沒有找到鏈接庫。隨后,我又調(diào)用了一些Windows的接口,手動設(shè)置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)
}
結(jié)果還是找不到鏈接庫,到這里,我們能用的方法都失效了。在谷歌上,也有類似的問題,但是沒人能給出解決方案,都是讓我們安裝Winpcap,問題好像無解。
四、解決方案
使用dependency查看內(nèi)部依賴
在折騰了幾個小時候,找到了一個解決方案:
將wpcap.dll復制一份到system32目錄
將packet.dll復制一份到system32目錄
將npf.sys驅(qū)動復制一份到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)
關(guān)于“Go怎么快速實現(xiàn)驅(qū)動層流量抓包”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點。