authkeyWin.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. //go:build windows
  2. // +build windows
  3. package ganserv
  4. import (
  5. "fmt"
  6. "log"
  7. "os"
  8. "path/filepath"
  9. "strings"
  10. "syscall"
  11. "time"
  12. "golang.org/x/sys/windows"
  13. "imuslab.com/zoraxy/mod/utils"
  14. )
  15. //Use admin permission to read auth token on Windows
  16. func readAuthTokenAsAdmin() (string, error) {
  17. //Check if the previous startup already extracted the authkey
  18. if utils.FileExists("./authtoken.secret") {
  19. authKey, err := os.ReadFile("./authtoken.secret")
  20. if err == nil {
  21. return strings.TrimSpace(string(authKey)), nil
  22. }
  23. }
  24. verb := "runas"
  25. exe := "cmd.exe"
  26. cwd, _ := os.Getwd()
  27. output, _ := filepath.Abs(filepath.Join("./", "authtoken.secret"))
  28. os.WriteFile(output, []byte(""), 0775)
  29. args := fmt.Sprintf("/C type \"C:\\ProgramData\\ZeroTier\\One\\authtoken.secret\" > \"" + output + "\"")
  30. verbPtr, _ := syscall.UTF16PtrFromString(verb)
  31. exePtr, _ := syscall.UTF16PtrFromString(exe)
  32. cwdPtr, _ := syscall.UTF16PtrFromString(cwd)
  33. argPtr, _ := syscall.UTF16PtrFromString(args)
  34. var showCmd int32 = 1 //SW_NORMAL
  35. err := windows.ShellExecute(0, verbPtr, exePtr, argPtr, cwdPtr, showCmd)
  36. if err != nil {
  37. return "", err
  38. }
  39. log.Println("Waiting for ZeroTier authtoken extraction...")
  40. time.Sleep(3 * time.Second)
  41. authKey, err := os.ReadFile("./authtoken.secret")
  42. if err != nil {
  43. return "", err
  44. }
  45. return strings.TrimSpace(string(authKey)), nil
  46. }
  47. //Check if admin on Windows
  48. func isAdmin() bool {
  49. _, err := os.Open("\\\\.\\PHYSICALDRIVE0")
  50. if err != nil {
  51. return false
  52. }
  53. return true
  54. }