|
@@ -3,60 +3,47 @@ package main
|
|
import (
|
|
import (
|
|
"encoding/hex"
|
|
"encoding/hex"
|
|
"fmt"
|
|
"fmt"
|
|
- "github.com/inszva/tap0901"
|
|
|
|
|
|
+ "github.com/songgao/packets/ethernet"
|
|
|
|
+ "github.com/songgao/water"
|
|
|
|
+ "log"
|
|
"net"
|
|
"net"
|
|
"net/http"
|
|
"net/http"
|
|
- //"net/url"
|
|
|
|
- "log"
|
|
|
|
"os"
|
|
"os"
|
|
- "sync"
|
|
|
|
- "time"
|
|
|
|
|
|
+ "os/exec"
|
|
|
|
+ "strings"
|
|
)
|
|
)
|
|
|
|
|
|
-//Create a new virtual network interface
|
|
|
|
-var tun, _ = tap0901.OpenTun(net.ParseIP(os.Args[2]), net.IP([]byte{0, 0, 0, 0}), net.ParseIP(os.Args[3]))
|
|
|
|
|
|
+var (
|
|
|
|
+ self = net.ParseIP(os.Args[2])
|
|
|
|
+ mask = net.IPv4Mask(255, 255, 255, 0)
|
|
|
|
+)
|
|
|
|
+var ifce, _ = water.New(water.Config{
|
|
|
|
+ DeviceType: water.TAP,
|
|
|
|
+})
|
|
|
|
|
|
func main() {
|
|
func main() {
|
|
- //tun, err := tap0901.OpenTun(net.IP([]byte{0, 0, 0, 0}), net.IP([]byte{0, 0, 0, 0}), net.IP([]byte{0, 0, 0, 0}))
|
|
|
|
- /*
|
|
|
|
- if err != nil {
|
|
|
|
- panic(err)
|
|
|
|
- }
|
|
|
|
- */
|
|
|
|
- fmt.Println("Virtual Network Interface Created")
|
|
|
|
- time.Sleep(2 * time.Second)
|
|
|
|
-
|
|
|
|
- // type IP
|
|
|
|
- /*
|
|
|
|
- IPAddress := net.ParseIP(os.Args[2])
|
|
|
|
- SubNet := net.ParseIP(os.Args[3])
|
|
|
|
- GateW := net.ParseIP(os.Args[4])
|
|
|
|
-
|
|
|
|
- //create fucking DHCP IP
|
|
|
|
- err := tun.SetDHCPMasq(IPAddress, SubNet, GateW, net.IP([]byte{0, 0, 0, 0}))
|
|
|
|
- if err != nil {
|
|
|
|
- fmt.Println(err)
|
|
|
|
- }
|
|
|
|
- */
|
|
|
|
//create http server
|
|
//create http server
|
|
http.HandleFunc("/rcv", rcv)
|
|
http.HandleFunc("/rcv", rcv)
|
|
go func() {
|
|
go func() {
|
|
http.ListenAndServe(":8181", nil)
|
|
http.ListenAndServe(":8181", nil)
|
|
}()
|
|
}()
|
|
|
|
|
|
- tun.Connect()
|
|
|
|
- time.Sleep(2 * time.Second)
|
|
|
|
- szName := tun.GetNetworkName(false)
|
|
|
|
- fmt.Println("Interface name: ", szName)
|
|
|
|
- fmt.Println("Dest IP:" + os.Args[1])
|
|
|
|
|
|
+ var frame ethernet.Frame
|
|
|
|
+ setupIfce(net.IPNet{IP: self, Mask: mask}, ifce.Name())
|
|
|
|
|
|
- tun.SetReadHandler(func(tun *tap0901.Tun, data []byte) {
|
|
|
|
- a := hex.EncodeToString(data)
|
|
|
|
- //bs, _ := hex.DecodeString(a)
|
|
|
|
- //fmt.Println(string(bs))
|
|
|
|
- log.Println("TXT>>", dde(data))
|
|
|
|
- //tun.Write(dde(data))
|
|
|
|
|
|
+ for {
|
|
|
|
+ frame.Resize(1500)
|
|
|
|
+ n, err := ifce.Read([]byte(frame))
|
|
|
|
+ if err != nil {
|
|
|
|
+ log.Fatal(err)
|
|
|
|
+ }
|
|
|
|
+ frame = frame[:n]
|
|
|
|
+ log.Printf("Dst: %s\n", frame.Destination())
|
|
|
|
+ log.Printf("Src: %s\n", frame.Source())
|
|
|
|
+ log.Printf("Ethertype: % x\n", frame.Ethertype())
|
|
|
|
+ log.Printf("Payload: % x\n", frame.Payload())
|
|
|
|
|
|
|
|
+ a := hex.EncodeToString(frame)
|
|
resp, err := http.Get("http://" + os.Args[1] + "/rcv?packet=" + a)
|
|
resp, err := http.Get("http://" + os.Args[1] + "/rcv?packet=" + a)
|
|
if err != nil {
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
fmt.Println(err)
|
|
@@ -64,30 +51,11 @@ func main() {
|
|
defer resp.Body.Close()
|
|
defer resp.Body.Close()
|
|
}
|
|
}
|
|
|
|
|
|
- })
|
|
|
|
- wp := sync.WaitGroup{}
|
|
|
|
- wp.Add(1)
|
|
|
|
- go func() {
|
|
|
|
- tun.Listen(1)
|
|
|
|
- wp.Done()
|
|
|
|
- }()
|
|
|
|
-
|
|
|
|
- fmt.Println(tun.GetMTU(false))
|
|
|
|
- //fmt.Println()
|
|
|
|
- /*
|
|
|
|
- for {
|
|
|
|
- time.Sleep(3 * time.Second)
|
|
|
|
- tun.Write([]byte("Hello World"))
|
|
|
|
- fmt.Println("Waiting")
|
|
|
|
- }
|
|
|
|
- time.Sleep(10 * time.Second)
|
|
|
|
- tun.SignalStop()
|
|
|
|
- */
|
|
|
|
- wp.Wait()
|
|
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
func rcv(w http.ResponseWriter, req *http.Request) {
|
|
func rcv(w http.ResponseWriter, req *http.Request) {
|
|
- fmt.Fprintf(w, "hello\n")
|
|
|
|
|
|
+ fmt.Fprintf(w, "OK\n")
|
|
x, ok := req.URL.Query()["packet"]
|
|
x, ok := req.URL.Query()["packet"]
|
|
if !ok || len(x[0]) < 1 {
|
|
if !ok || len(x[0]) < 1 {
|
|
fmt.Println("Url Param 'packet' is missing")
|
|
fmt.Println("Url Param 'packet' is missing")
|
|
@@ -99,20 +67,21 @@ func rcv(w http.ResponseWriter, req *http.Request) {
|
|
if err != nil {
|
|
if err != nil {
|
|
log.Println(err)
|
|
log.Println(err)
|
|
}
|
|
}
|
|
- log.Println("RECV<<", dde(data))
|
|
|
|
- tun.Write(dde(data))
|
|
|
|
-}
|
|
|
|
|
|
|
|
-func dde(packet []byte) []byte {
|
|
|
|
- var i = len(packet) - 1
|
|
|
|
- for packet[i] == 0 {
|
|
|
|
- //--i
|
|
|
|
- i--
|
|
|
|
|
|
+ ifce.Write(data)
|
|
|
|
+ if err != nil {
|
|
|
|
+ log.Fatal(err)
|
|
}
|
|
}
|
|
|
|
+}
|
|
|
|
|
|
- //var temp = [i + 1]byte
|
|
|
|
- temp := make([]byte, i+1)
|
|
|
|
- //Array.Copy(packet, temp, i + 1)
|
|
|
|
- temp = packet[0 : i+1]
|
|
|
|
- return temp
|
|
|
|
|
|
+func setupIfce(ipNet net.IPNet, dev string) {
|
|
|
|
+ sargs := fmt.Sprintf("interface ip set address name=REPLACE_ME source=static addr=REPLACE_ME mask=REPLACE_ME gateway=none")
|
|
|
|
+ args := strings.Split(sargs, " ")
|
|
|
|
+ args[4] = fmt.Sprintf("name=%s", dev)
|
|
|
|
+ args[6] = fmt.Sprintf("addr=%s", ipNet.IP)
|
|
|
|
+ args[7] = fmt.Sprintf("mask=%d.%d.%d.%d", ipNet.Mask[0], ipNet.Mask[1], ipNet.Mask[2], ipNet.Mask[3])
|
|
|
|
+ cmd := exec.Command("netsh", args...)
|
|
|
|
+ if err := cmd.Run(); err != nil {
|
|
|
|
+ log.Println(err)
|
|
|
|
+ }
|
|
}
|
|
}
|