Artikel ini membawakan anda pengetahuan yang berkaitan tentang golang terutamanya tentang cara melaksanakan penangkapan paket trafik lapisan pemandu di golang.
1. Penangkapan paket pemacu
Kita boleh menggunakan Fiddler, Httpdebugger, Charles dan alatan lain untuk menangkap paket pada lapisan aplikasi Jika kita perlu mendapatkan data dari bawah kad rangkaian peringkat, tidak ada cara untuk mencapai ini, kita perlu menggunakan pakej gopacket Google.
2. Menghadapi masalah
gopacket mempunyai dokumentasi yang kaya. Saya tidak akan menerangkan secara terperinci tentang cara menggunakannya di sini perlu dipasang terlebih dahulu pada Linux Pada Windows, anda perlu memasang Winpcap terlebih dahulu, jika tidak, ia tidak boleh digunakan, dan ia akan menyebabkan perpustakaan pautan dinamik yang berkaitan hilang. Mereka tidak mahu memasang perisian tambahan Kami akan menyelidik cara menyelesaikan masalah ini.
3. Cuba selesaikan masalah
Pertama sekali, kami tidak memasang sebarang alatan. Lihat mesej ralat sistem di sini:
couldn't load wpcap.dll
Ia menggesa kami bahawa kami tidak menjumpai wpcap.dll Ini mudah difahami Kami tidak menjumpainya terlebih dahulu :
EXE所在目录 ↓ 当前目录GetCurrentDirectory(); ↓ 系统目录GetSystemDirectory(); ↓ WINDOWS目录GetWindowsDirectory(); ↓ 环境变量PATH所包含的目录。
Maka penyelesaiannya sangat mudah. Bukankah cukup untuk meletakkan wpcap.dll dalam direktori di mana exe berada, tetapi ternyata ini tidak berfungsi. , dan ia masih menggesa bahawa perpustakaan pautan tidak ditemui. Kemudian, saya memanggil beberapa antara muka Windows dan menetapkan direktori dll secara manual:
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) }
Akibatnya, perpustakaan pautan masih tidak ditemui Pada ketika ini, semua kaedah yang boleh kami gunakan gagal. Terdapat masalah yang sama di Google, tetapi tiada siapa yang boleh memberikan penyelesaian. Mereka semua meminta kami untuk memasang Winpcap nampaknya tiada penyelesaian untuk masalah tersebut.
4. Penyelesaian
Gunakan kebergantungan untuk melihat kebergantungan dalaman
Selepas bergelut selama beberapa jam, saya dijumpai Mendapat penyelesaian:
Salin wpcap.dll ke direktori system32
Salin packet.dll ke direktori system32
Salin pemacu npf.sys ke direktori pemacu di bawah system32
Kini anda tidak perlu memasang sebarang perisian untuk memanggil gopacket
fmt.Println(pcap.Version())
Output
WinPcap version 4.1.3 (packet.dll version 4.1.0.2980), based on libpcap version 1.0 branch 1_0_rel0b (20091008)
[Cadangan berkaitan: Pergi tutorial video]
Atas ialah kandungan terperinci Penjelasan terperinci tentang cara Go boleh melaksanakan penangkapan paket trafik lapisan pemandu dengan cepat. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!