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) }
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) }
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)
Envoi du Paquet
Enfin, envoyez le paquet à l'aide du socket brut :
_, err = conn.WriteTo(buf.Bytes(), &dstIPaddr) if err != nil { panic(err) }
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!