Heim  >  Artikel  >  Backend-Entwicklung  >  Ausführliche Erläuterung, wie Go die Erfassung von Verkehrspaketen auf Treiberebene schnell implementieren kann

Ausführliche Erläuterung, wie Go die Erfassung von Verkehrspaketen auf Treiberebene schnell implementieren kann

藏色散人
藏色散人nach vorne
2023-03-14 17:09:513307Durchsuche

Dieser Artikel vermittelt Ihnen relevantes Wissen über Golang. Er befasst sich hauptsächlich mit der Implementierung der Erfassung von Verkehrspaketen auf Treiberebene in Golang. Ich hoffe, dass er für alle hilfreich ist.

1. Treiberpaketerfassung

Wir können Fiddler, Httpdebugger, Charles und andere Tools verwenden, um Pakete auf der Anwendungsebene zu erfassen, ist dies nicht möglich. Wir müssen das gopacket-Paket von Google verwenden.

2. Auf Probleme stoßen

gopacket verfügt über eine ausführliche Dokumentation zur Verwendung. Es gibt eine Voraussetzung für die Verwendung von gopacket: Npcap muss im Voraus unter Linux installiert werden Es muss im Voraus unter Windows installiert werden, da es sonst nicht verwendet werden kann. Dies wird dazu führen, dass die entsprechende dynamische Linkbibliothek fehlt. Dies ist für einige Menschen mit Mysophobie nicht hilfreich. Sie möchten keine redundante Software installieren um dieses Problem später zu lösen.

3. Versuchen Sie, das Problem zu lösen. Schauen Sie sich zunächst die Fehlermeldung an, dass ich ein Windows-System verwende:

couldn't load wpcap.dll
Das ist nicht leicht zu verstehen. Schauen wir uns zunächst die Ladereihenfolge der DLLs im System an:

EXE所在目录
    ↓
当前目录GetCurrentDirectory();
    ↓
系统目录GetSystemDirectory();
    ↓
WINDOWS目录GetWindowsDirectory();
    ↓
环境变量PATH所包含的目录。

Die Lösung ist ganz einfach: Laden Sie eine wpcap.dll herunter und fügen Sie sie ein das Verzeichnis, in dem sich die Exe-Datei befindet. Es stellt sich jedoch heraus, dass dies nicht funktioniert, und es wird immer noch angezeigt, dass die Link-Bibliothek nicht gefunden wird. Dann habe ich einige Windows-Schnittstellen aufgerufen und das DLL-Verzeichnis manuell festgelegt:

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)
}

Das Ergebnis war, dass die Linkbibliothek immer noch nicht gefunden wurde. Zu diesem Zeitpunkt schlugen alle Methoden fehl, die wir verwenden konnten. Es gibt ähnliche Probleme bei Google, aber niemand kann eine Lösung nennen. Sie alle bitten uns, Winpcap zu installieren. Es scheint keine Lösung für das Problem zu geben. 5. Lösung .dll in das System32-Verzeichnis

Kopieren Sie den npf.sys-Treiber in das Treiberverzeichnis unter System32

Jetzt müssen Sie keine Software mehr installieren, um gopacket aufzurufen

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)

【Verwandte Empfehlung: Ausführliche Erläuterung, wie Go die Erfassung von Verkehrspaketen auf Treiberebene schnell implementieren kannGo-Video-Tutorial

Das obige ist der detaillierte Inhalt vonAusführliche Erläuterung, wie Go die Erfassung von Verkehrspaketen auf Treiberebene schnell implementieren kann. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:learnku.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen