>백엔드 개발 >Golang >Go가 드라이버 계층 트래픽 패킷 캡처를 신속하게 구현하는 방법에 대한 자세한 설명

Go가 드라이버 계층 트래픽 패킷 캡처를 신속하게 구현하는 방법에 대한 자세한 설명

藏色散人
藏色散人앞으로
2023-03-14 17:09:513335검색

이 기사는 golang에 대한 관련 지식을 제공합니다. 주로 golang에서 드라이버 계층 트래픽 패킷 캡처를 구현하는 방법에 대해 설명합니다. 관심 있는 친구가 이 글을 살펴보는 것이 모든 사람에게 도움이 되기를 바랍니다.

1. 드라이버 패킷 캡처

Fiddler, Httpdebugger, Charles 및 기타 도구를 사용하여 애플리케이션 계층에서 패킷을 캡처할 수 있지만 하위 수준 네트워크 카드의 데이터를 캡처하는 것은 불가능합니다. Google의 gopacket 패키지를 사용해야 합니다.

2. 문제 발생

gopacket에는 풍부한 문서가 있습니다. 여기서는 gopacket을 사용하기 위한 전제 조건이 있습니다. Npcap은 Linux에 미리 설치되어 있어야 합니다. Windows에 미리 설치하지 않으면 관련 동적 링크 라이브러리가 누락되었다는 메시지가 표시됩니다. 이는 중복 소프트웨어를 설치하고 싶지 않은 사람들에게 있습니다. 나중에 이 문제를 해결하려면

3. 문제를 해결해 보세요.

우선 어떤 도구도 설치하지 않았습니다. 여기서는 Windows 시스템을 사용하고 있습니다.

couldn't load wpcap.dll

라는 메시지가 표시됩니다. wpcap.dll을 찾을 수 없습니다. 이해하기 쉽지 않습니다. 먼저 시스템에서 dll의 로드 순서를 살펴보겠습니다.

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

해결책은 매우 간단합니다. exe가 있는 디렉터리입니다. 그러나 이것이 작동하지 않는 것으로 나타났으며 여전히 Link 라이브러리를 찾을 수 없다는 메시지가 나타납니다. 그런 다음 일부 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)
}

결과적으로 링크 라이브러리를 아직 찾을 수 없었습니다. 이 시점에서 사용할 수 있는 모든 방법이 실패했습니다. 구글에도 비슷한 문제가 있는데 아무도 해결책을 제시해 주지 않네요. 다들 Winpcap을 설치하라고 하네요. 문제에 대한 해결책은 없는 것 같습니다.

4. 해결 방법

종속성을 사용하여 내부 종속성 보기

Go가 드라이버 계층 트래픽 패킷 캡처를 신속하게 구현하는 방법에 대한 자세한 설명

몇 시간 동안 고민한 끝에 해결책을 찾았습니다.

  • wpcap.dll을 system32 디렉터리에 복사

  • 패킷 복사 .dll을 system32 디렉터리

  • npf.sys 드라이버를 system32

아래의 drivers 디렉터리에 복사하세요. 이제 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 learnku.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제