main.go 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package main
  2. import (
  3. "encoding/hex"
  4. "fmt"
  5. "github.com/songgao/packets/ethernet"
  6. "github.com/songgao/water"
  7. "log"
  8. "net"
  9. "os"
  10. "os/exec"
  11. "strings"
  12. "bufio"
  13. )
  14. var (
  15. self = net.ParseIP(os.Args[2])
  16. mask = net.IPv4Mask(255, 255, 255, 0)
  17. )
  18. var ifce, _ = water.New(water.Config{
  19. DeviceType: water.TAP,
  20. })
  21. func main() {
  22. //create http server
  23. go func(){
  24. fmt.Println("Launching server...")
  25. // listen on all interfaces
  26. ln, _ := net.Listen("tcp", ":8081")
  27. // accept connection on port
  28. conn, _ := ln.Accept()
  29. // run loop forever (or until ctrl-c)
  30. for {
  31. // will listen for message to process ending in newline (\n)
  32. message, _ := bufio.NewReader(conn).ReadString('\n')
  33. // output message received
  34. fmt.Print("RECV<<", string(message))
  35. data, err := hex.DecodeString( strings.ReplaceAll("\n","",string(message)))
  36. if err != nil {
  37. //log.Println(err)
  38. }
  39. //log.Println("RECV<<", data)
  40. ifce.Write(data)
  41. }
  42. }()
  43. //declare server
  44. // connect to server
  45. conns, _ := net.Dial("tcp",os.Args[1]+":8081")
  46. var frame ethernet.Frame
  47. setupIfce(net.IPNet{IP: self, Mask: mask}, ifce.Name())
  48. for {
  49. frame.Resize(1500)
  50. n, err := ifce.Read([]byte(frame))
  51. if err != nil {
  52. log.Fatal(err)
  53. }
  54. frame = frame[:n]
  55. log.Println("TRSV>>", hex.EncodeToString(frame))
  56. /*
  57. log.Printf("Dst: %s\n", frame.Destination())
  58. log.Printf("Src: %s\n", frame.Source())
  59. log.Printf("Ethertype: % x\n", frame.Ethertype())
  60. log.Printf("Payload: % x\n", frame.Payload())
  61. log.Printf("HEX: % x\n", frame)
  62. */
  63. fmt.Fprintf(conns, hex.EncodeToString(frame) + "\n")
  64. /*
  65. a := hex.EncodeToString(frame)
  66. resp, err := http.Get("http://" + os.Args[1] + "/rcv?packet=" + a)
  67. if err != nil {
  68. fmt.Println(err)
  69. } else {
  70. defer resp.Body.Close()
  71. }
  72. */
  73. }
  74. }
  75. func setupIfce(ipNet net.IPNet, dev string) {
  76. sargs := fmt.Sprintf("interface ip set address name=REPLACE_ME source=static addr=REPLACE_ME mask=REPLACE_ME gateway=none")
  77. args := strings.Split(sargs, " ")
  78. args[4] = fmt.Sprintf("name=%s", dev)
  79. args[6] = fmt.Sprintf("addr=%s", ipNet.IP)
  80. args[7] = fmt.Sprintf("mask=%d.%d.%d.%d", ipNet.Mask[0], ipNet.Mask[1], ipNet.Mask[2], ipNet.Mask[3])
  81. cmd := exec.Command("netsh", args...)
  82. if err := cmd.Run(); err != nil {
  83. log.Println(err)
  84. }
  85. }