Maison >développement back-end >Golang >Explication détaillée de la façon dont Go peut rapidement mettre en œuvre la capture des paquets de trafic de la couche pilote

Explication détaillée de la façon dont Go peut rapidement mettre en œuvre la capture des paquets de trafic de la couche pilote

藏色散人
藏色散人avant
2023-03-14 17:09:513337parcourir

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

Explication détaillée de la façon dont Go peut rapidement mettre en œuvre la capture des paquets de trafic de la couche pilote

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer