77 lines
1.8 KiB
Go
77 lines
1.8 KiB
Go
//go:build windows
|
|
|
|
package main
|
|
|
|
import (
|
|
"os"
|
|
"os/exec"
|
|
|
|
"golang.org/x/sys/windows"
|
|
"golang.zx2c4.com/wintun"
|
|
)
|
|
|
|
var session wintun.Session
|
|
var readWait windows.Handle
|
|
|
|
func isAdmin() bool {
|
|
f, err := os.Open("\\\\.\\PHYSICALDRIVE0")
|
|
if err != nil {
|
|
return false
|
|
}
|
|
f.Close()
|
|
return true
|
|
}
|
|
|
|
func setupInterface() {
|
|
adapter, err := wintun.CreateAdapter("baalvpn", "Wintun", nil)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
session, err = adapter.StartSession(0x800000)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
readWait = session.ReadWaitEvent()
|
|
|
|
if err := exec.Command("netsh", "interface", "ipv6", "add", "address", "interface=baalvpn", "address="+internalIP.String()).Run(); err != nil {
|
|
panic(err)
|
|
}
|
|
if err := exec.Command("netsh", "interface", "ipv6", "set", "interface", "interface=baalvpn", "forwarding=disabled").Run(); err != nil {
|
|
panic(err)
|
|
}
|
|
if err := exec.Command("netsh", "interface", "ipv6", "add", "route", "fd00:baa1::/32", "interface=baalvpn").Run(); err != nil {
|
|
panic(err)
|
|
}
|
|
if err := exec.Command("netsh", "advfirewall", "firewall", "add", "rule", "name=BaalVPN In", "dir=in", "action=allow", "remoteip=fd00:baa1::/32").Run(); err != nil {
|
|
panic(err)
|
|
}
|
|
if err := exec.Command("netsh", "advfirewall", "firewall", "add", "rule", "name=BaalVPN Out", "dir=out", "action=allow", "remoteip=fd00:baa1::/32").Run(); err != nil {
|
|
panic(err)
|
|
}
|
|
}
|
|
|
|
func writePkt(pkt []byte) error {
|
|
sp, err := session.AllocateSendPacket(len(pkt))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
copy(sp, pkt)
|
|
session.SendPacket(sp)
|
|
return nil
|
|
}
|
|
|
|
func readPkt() ([]byte, error) {
|
|
for {
|
|
pkt, err := session.ReceivePacket()
|
|
if err == nil {
|
|
return pkt, nil
|
|
}
|
|
windows.WaitForSingleObject(readWait, windows.INFINITE)
|
|
}
|
|
}
|
|
|
|
func releasePkt(pkt []byte) {
|
|
session.ReleaseReceivePacket(pkt)
|
|
}
|