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) }
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!") }
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!