main.go 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  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. "net/http"
  10. "os"
  11. "os/exec"
  12. "strings"
  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. http.HandleFunc("/rcv", rcv)
  24. go func() {
  25. http.ListenAndServe(":8181", nil)
  26. }()
  27. var frame ethernet.Frame
  28. setupIfce(net.IPNet{IP: self, Mask: mask}, ifce.Name())
  29. for {
  30. frame.Resize(1500)
  31. n, err := ifce.Read([]byte(frame))
  32. if err != nil {
  33. log.Fatal(err)
  34. }
  35. frame = frame[:n]
  36. log.Println("TRSV>>", frame)
  37. log.Printf("Dst: %s\n", frame.Destination())
  38. log.Printf("Src: %s\n", frame.Source())
  39. log.Printf("Ethertype: % x\n", frame.Ethertype())
  40. log.Printf("Payload: % x\n", frame.Payload())
  41. log.Printf("HEX: % x\n", frame)
  42. /*
  43. a := hex.EncodeToString(frame)
  44. resp, err := http.Get("http://" + os.Args[1] + "/rcv?packet=" + a)
  45. if err != nil {
  46. fmt.Println(err)
  47. } else {
  48. defer resp.Body.Close()
  49. }
  50. */
  51. }
  52. }
  53. func rcv(w http.ResponseWriter, req *http.Request) {
  54. fmt.Fprintf(w, "OK\n")
  55. x, ok := req.URL.Query()["packet"]
  56. if !ok || len(x[0]) < 1 {
  57. fmt.Println("Url Param 'packet' is missing")
  58. return
  59. } else {
  60. log.Println("Reciving data!!!")
  61. }
  62. data, err := hex.DecodeString(x[0])
  63. if err != nil {
  64. log.Println(err)
  65. }
  66. log.Println("RECV<<", data)
  67. ifce.Write(data)
  68. if err != nil {
  69. log.Fatal(err)
  70. }
  71. }
  72. func setupIfce(ipNet net.IPNet, dev string) {
  73. sargs := fmt.Sprintf("interface ip set address name=REPLACE_ME source=static addr=REPLACE_ME mask=REPLACE_ME gateway=none")
  74. args := strings.Split(sargs, " ")
  75. args[4] = fmt.Sprintf("name=%s", dev)
  76. args[6] = fmt.Sprintf("addr=%s", ipNet.IP)
  77. args[7] = fmt.Sprintf("mask=%d.%d.%d.%d", ipNet.Mask[0], ipNet.Mask[1], ipNet.Mask[2], ipNet.Mask[3])
  78. cmd := exec.Command("netsh", args...)
  79. if err := cmd.Run(); err != nil {
  80. log.Println(err)
  81. }
  82. }