From 5dee8834034efa519f330628a396ee2e87e75568 Mon Sep 17 00:00:00 2001 From: Keyv Chan Date: Sat, 16 Apr 2022 13:34:17 +0800 Subject: [PATCH] feat(icmp): send icmp echo --- client/client.go | 5 +++-- go.mod | 6 ++++++ go.sum | 18 ++++++++++++++++ protocol/ip/icmp.go | 51 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 78 insertions(+), 2 deletions(-) create mode 100644 go.sum create mode 100644 protocol/ip/icmp.go diff --git a/client/client.go b/client/client.go index 116923c..e829a97 100644 --- a/client/client.go +++ b/client/client.go @@ -5,6 +5,7 @@ import ( "github.com/keyvchan/NetAssist/internal" "github.com/keyvchan/NetAssist/protocol" + "github.com/keyvchan/NetAssist/protocol/ip" ) func Req() { @@ -21,8 +22,8 @@ func Req() { protocol.UnixgramClient() case "unixpacket": internal.Unimplemented("unixpacket") - case "ip": - internal.Unimplemented("ip") + case "icmp": + ip.ICMPRequest() default: log.Fatal("unknown protocol", types) } diff --git a/go.mod b/go.mod index 648d079..6aff31d 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,9 @@ module github.com/keyvchan/NetAssist go 1.18 + +require ( + github.com/google/gopacket v1.1.19 // indirect + golang.org/x/net v0.0.0-20220412020605-290c469a71a5 // indirect + golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..2ec6c2a --- /dev/null +++ b/go.sum @@ -0,0 +1,18 @@ +github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= +github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20220412020605-290c469a71a5 h1:bRb386wvrE+oBNdF1d/Xh9mQrfQ4ecYhW5qJ5GvTGT4= +golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e h1:fLOSk5Q00efkSvAm+4xcoXD+RRmLmmulPn5I3Y9F2EM= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/protocol/ip/icmp.go b/protocol/ip/icmp.go new file mode 100644 index 0000000..a585282 --- /dev/null +++ b/protocol/ip/icmp.go @@ -0,0 +1,51 @@ +package ip + +import ( + "fmt" + "log" + "net" + "os" + + "github.com/keyvchan/NetAssist/internal" + "golang.org/x/net/icmp" + "golang.org/x/net/ipv4" +) + +func ICMPRequest() { + address := internal.GetArg(3) + dstAddress, err := net.ResolveIPAddr("ip", address) + if err != nil { + log.Fatal(err) + } + // linux darwin only + conn, err := icmp.ListenPacket("udp4", "0.0.0.0") + if err != nil { + log.Fatal(err) + } + defer conn.Close() + + body := icmp.Echo{ + ID: os.Getpid() & 0xffff, + Seq: 1, + Data: []byte("HELLO-R-U-THERE"), + } + wm := icmp.Message{ + Type: ipv4.ICMPTypeEcho, + Code: 0, + Body: &body, + } + wb, err := wm.Marshal(nil) + if err != nil { + log.Fatal(err) + } + _, err = conn.WriteTo(wb, &net.UDPAddr{IP: dstAddress.IP}) + if err != nil { + log.Fatal(err) + } + rb := make([]byte, 1500) + _, addr, err := conn.ReadFrom(rb) + if err != nil { + log.Fatal(err) + } + fmt.Println(addr) +}