Cet article vous apporte des connaissances pertinentes sur Golang. Il explique principalement comment implémenter la capture des paquets de trafic de la couche pilote dans Golang. J'espère qu'il sera utile à tout le monde.
1. Capture de paquets de pilotes
Nous pouvons utiliser Fiddler, Httpdebugger, Charles et d'autres outils pour capturer des paquets au niveau de la couche application. Si nous avons besoin d'obtenir les données de la carte réseau de niveau inférieur, ce n'est pas possible. Nous devons utiliser le package gopacket de Google.
2. Problèmes rencontrés
gopacket a une documentation riche. Je n'entrerai pas dans les détails sur la façon de l'utiliser ici. Il y a une condition préalable pour utiliser gopacket : Npcap doit être installé au préalable sur Linux, et Winpcap a besoin. à installer à l'avance sur Windows, sinon il ne peut pas être utilisé, cela indiquera que la bibliothèque de liens dynamiques correspondante est manquante, ce qui n'est pas convivial pour certaines personnes atteintes de mysophobie. Elles ne souhaitent pas installer de logiciels redondants. pour résoudre ce problème plus tard.
3. Essayez de résoudre le problème
Tout d'abord, nous n'installons aucun outil. Jetez un œil au message d'erreur ici :
couldn't load wpcap.dll
Cela nous indique que nous l'avons fait. Je n'ai pas trouvé wpcap.dll. C'est facile à comprendre. Nous ne l'avons pas fait. Examinons d'abord l'ordre de chargement des dll dans le système :
EXE所在目录 ↓ 当前目录GetCurrentDirectory(); ↓ 系统目录GetSystemDirectory(); ↓ WINDOWS目录GetWindowsDirectory(); ↓ 环境变量PATH所包含的目录。
La solution est très simple. Téléchargez simplement un wpcap.dll et insérez-le. le répertoire où se trouve l'exe. Mais il s'avère que cela ne fonctionne pas et il indique toujours qu'il n'est pas trouvé. Ensuite, j'ai appelé certaines interfaces Windows et défini manuellement le répertoire 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) }
Le résultat était que la bibliothèque de liens n'était toujours pas trouvée. À ce stade, toutes les méthodes que nous pouvions utiliser ont échoué. Il existe des problèmes similaires sur Google, mais personne ne peut donner de solution. Ils nous demandent tous d'installer Winpcap. Il ne semble pas y avoir de solution au problème.
4. Solution
Utiliser la dépendance pour afficher les dépendances internes
Après avoir lutté pendant quelques heures, j'ai trouvé une solution :
Copiez wpcap.dll dans le répertoire system32
Copier le paquet .dll dans le répertoire system32
Copiez le pilote npf.sys dans le répertoire des pilotes sous system32
Vous n'avez plus besoin d'installer de logiciel pour appeler 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)
【Recommandation connexe : Tutoriel vidéo Go】
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!