Maison > développement back-end > Golang > Comment créer et envoyer des paquets TCP personnalisés à l'aide de Raw Sockets dans Go ?

Comment créer et envoyer des paquets TCP personnalisés à l'aide de Raw Sockets dans Go ?

Mary-Kate Olsen
Libérer: 2024-11-29 05:08:15
original
328 Les gens l'ont consulté

How to Create and Send Custom TCP Packets using Raw Sockets in Go?

Création de paquets TCP personnalisés et transmission de sockets bruts avec Go

Ce guide montre comment composer des paquets TCP personnalisés à l'aide de gopacket et les transmettre via un socket brut dans Go. Bien que la requête originale se soit concentrée sur la création de paquets TCP, il est crucial de noter que l'approche nécessite également une personnalisation de l'en-tête IPv4.

Création d'un socket brut dans Go

Contraire En raison des idées fausses, Go fournit des moyens de créer des sockets bruts via net.ListenPacket, net.DialIP ou net.ListenIP. L'exemple suivant illustre la création d'un socket brut à l'aide de net.ListenIP :

conn, err := net.ListenIP("ip4:tcp", netaddr)
if err != nil {
    log.Fatalf("ListenIP: %s\n", err)
}
Copier après la connexion

Définition des options de socket IPv4

Pour personnaliser l'en-tête IPv4, il est nécessaire de définir l'option de socket IP_HDRINCL. Malheureusement, Core Go ne dispose pas de cette fonctionnalité. Cependant, des packages externes comme ipv4 offrent cette fonctionnalité. La fonction NewRawConn crée une connexion brute avec l'ensemble IP_HDRINCL.

Exemple de code

L'extrait de code suivant fournit un exemple complet :

package main

import (
    "code.google.com/p/gopacket"
    "code.google.com/p/gopacket/examples/util"
    "code.google.com/p/gopacket/layers"
    "github.com/dustin/go-ipv4"
    "log"
    "net"
)

const netaddr = "127.0.0.1:666"

func main() {
    defer util.Run()()

    // IPv4-specific operations
    srcIP := net.ParseIP("127.0.0.1")
    dstIP := net.ParseIP("192.168.0.1")

    // Raw socket creation using ipv4 package
    conn, err := ipv4.NewRawConn("ip4:tcp", netaddr, 0)
    if err != nil {
        log.Fatalf("NewRawConn: %s\n", err)
    }

    // TCP/IP packet creation
    tcpLayer := layers.TCP{
        SrcPort: layers.TCPPort(666),
        DstPort: layers.TCPPort(22),
        SYN:     true,
    }
    ipLayer := layers.IPv4{
        SrcIP:    srcIP,
        DstIP:    dstIP,
        Protocol: layers.IPProtocolTCP,
    }
    tcpLayer.SetNetworkLayerForChecksum(&ipLayer)

    // Serialize and transmit the packet
    buf := gopacket.NewSerializeBuffer()
    serializeOpts := gopacket.SerializeOptions{
        FixLengths:       true,
        ComputeChecksums: true,
    }
    err = gopacket.SerializeLayers(buf, serializeOpts, &ipLayer, &tcpLayer)
    if err != nil {
        log.Fatalf("SerializeLayers: %s\n", err)
    }

    _, err = conn.Write(buf.Bytes())
    if err != nil {
        log.Fatalf("Write: %s\n", err)
    }

    log.Print("Custom TCP packet sent!")
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal