Maison > développement back-end > Golang > Comment puis-je créer et envoyer des paquets TCP bruts à l'aide de Golang et gopacket ?

Comment puis-je créer et envoyer des paquets TCP bruts à l'aide de Golang et gopacket ?

Mary-Kate Olsen
Libérer: 2024-12-08 01:46:12
original
974 Les gens l'ont consulté

How can I craft and send raw TCP packets using Golang and gopacket?

Création et envoi de paquets TCP bruts avec Golang à l'aide de gopacket

Vous souhaitez créer des paquets TCP personnalisés à l'aide de gopacket et les transmettre via des sockets bruts. Permettez-nous de vous guider tout au long du processus :

Création d'en-têtes de paquets IP et TCP personnalisés

Bien que votre question mentionne la création de paquets TCP personnalisés, votre code suggère que vous souhaitez modifier les en-têtes IPv4 couche 3 et TCP couche 4. Nous nous concentrerons sur IPv4 pour cet exemple :

// Example Packet Definition
import (
    "code.google.com/p/gopacket"
    "code.google.com/p/gopacket/examples/util"
    "code.google.com/p/gopacket/layers"
    "log"
    "net"
)

// Packet Data
srcIP := net.ParseIP("127.0.0.1")
dstIP := net.ParseIP("192.168.0.1")
ipLayer := layers.IPv4{
    SrcIP:    srcIP,
    DstIP:    dstIP,
    Protocol: layers.IPProtocolTCP,
}
tcpLayer := layers.TCP{
    SrcPort: layers.TCPPort(666),
    DstPort: layers.TCPPort(22),
    SYN:     true,
}

// Compute Checksums and Serialize Packet
tcpLayer.SetNetworkLayerForChecksum(&ipLayer)
buf := gopacket.NewSerializeBuffer()
err := gopacket.SerializeLayers(buf, gopacket.SerializeOptions{
    FixLengths:       true,
    ComputeChecksums: true,
}, &ipLayer, &tcpLayer)
if err != nil {
    panic(err)
}
Copier après la connexion

Création d'un socket brut dans Golang

Contrairement aux réponses incorrectes sur cette plateforme, Go autorise le socket brut création à l’aide de net.ListenPacket, net.DialIP ou net.ListenIP. Par exemple :

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

Activation de l'inclusion de l'en-tête IP

Sur macOS et Linux, vous pouvez définir l'option de socket IP_HDRINCL pour autoriser la modification personnalisée de l'en-tête IPv4.

conn.SetsockoptIPHDRINCL(true)
Copier après la connexion

Envoi du Paquet

Enfin, envoyez le paquet à l'aide du socket brut :

_, err = conn.WriteTo(buf.Bytes(), &dstIPaddr)
if err != nil {
    panic(err)
}
Copier après la connexion

Remarque : Pour éviter les répétitions, nous nous sommes concentrés sur les étapes principales de l'assemblage le paquet et l'envoyer via un socket brut. Même si nous pensons que cette réponse est techniquement correcte et complète, elle n'est pas destinée à constituer une solution de code complète.

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