ホームページ >バックエンド開発 >Golang >Go がドライバー層のトラフィック パケット キャプチャを迅速に実装する方法の詳細な説明

Go がドライバー層のトラフィック パケット キャプチャを迅速に実装する方法の詳細な説明

藏色散人
藏色散人転載
2023-03-14 17:09:513336ブラウズ

この記事は、golang に関する関連知識を提供します。主に、golang でドライバー層のトラフィック パケット キャプチャを実装する方法について説明します。興味のある友人は、ぜひ読んでみてください。皆さんのお役に立てれば幸いです。

1. ドライバー パケット キャプチャ

Fiddler、Httpdebugger、Charles およびその他のツールを使用して、アプリケーション層でパケットをキャプチャできます。これを実現するには、Google の gopacket パッケージを使用する必要があります。

2. 問題の発生

gopacket には豊富なドキュメントがあります。ここでは使用方法の詳細については説明しません。gopacket を使用するには前提条件があります: Npcap Linux では事前に Winpcap をインストールする必要があります。Windows では、Winpcap を事前にインストールする必要があります。そうしないと使用できず、関連するダイナミック リンク ライブラリが見つからないというメッセージが表示されます。これは潔癖症の人にとってはあまり親切ではありません。余分なソフトウェアをインストールしたくないのです。後で戻ってきます。この問題の解決方法を調べてください。

3. 問題を解決してみます

まず、ツールはインストールしません。エラー メッセージを見てください。Windows を使用しています。ここのシステム:

couldn't load wpcap.dll

プロンプト わかりやすい wpcap.dll が見つかりませんでした。見つかりませんでした。まず、システム内の DLL の読み込み順序を見てみましょう:

EXE所在目录
    ↓
当前目录GetCurrentDirectory();
    ↓
系统目录GetSystemDirectory();
    ↓
WINDOWS目录GetWindowsDirectory();
    ↓
环境变量PATH所包含的目录。
## #解決策は非常に簡単です。wpcap.dll をダウンロードして、それを配置します。exe が存在するディレクトリに移動するだけで十分ではないでしょうか。しかし、これは機能しないことが判明し、依然として次のメッセージが表示されます。リンクライブラリが見つかりません。次に、いくつかの Windows インターフェイスを呼び出し、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)
}

その結果、リンク ライブラリがまだ見つかりませんでした。この時点で、使用できるすべての方法が失敗しました。 Google にも同様の問題がありますが、誰も解決策を提示できず、いずれも Winpcap をインストールするように求められ、問題の解決策はないようです。

4. 解決策

依存関係を使用して内部依存関係を表示する

Go がドライバー層のトラフィック パケット キャプチャを迅速に実装する方法の詳細な説明

数時間苦労した結果、 found 解決策を見つけました:

  • wpcap.dll を system32 ディレクトリにコピーします

  • packet.dll を system32 ディレクトリにコピーします

  • npf.sys ドライバーを system32 の下のドライバー ディレクトリにコピーします。

これで、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)

[関連する推奨事項:

Go ビデオ チュートリアル]

以上がGo がドライバー層のトラフィック パケット キャプチャを迅速に実装する方法の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はlearnku.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。