73 lines
1.5 KiB
Go
73 lines
1.5 KiB
Go
|
package main
|
||
|
|
||
|
import (
|
||
|
"bytes"
|
||
|
"encoding/base64"
|
||
|
"encoding/gob"
|
||
|
"fmt"
|
||
|
"os"
|
||
|
"strings"
|
||
|
"syscall"
|
||
|
)
|
||
|
|
||
|
const (
|
||
|
// hidden path for main to act as a launcher
|
||
|
egoLauncher = "EGO_LAUNCHER"
|
||
|
)
|
||
|
|
||
|
// hidden launcher path
|
||
|
func tryLauncher() {
|
||
|
if printVersion {
|
||
|
if r, ok := os.LookupEnv(egoLauncher); ok {
|
||
|
// egoLauncher variable contains launcher payload
|
||
|
dec := base64.NewDecoder(base64.StdEncoding, strings.NewReader(r))
|
||
|
|
||
|
var argv []string
|
||
|
if err := gob.NewDecoder(dec).Decode(&argv); err != nil {
|
||
|
fmt.Println("Error decoding launcher payload:", err)
|
||
|
os.Exit(1)
|
||
|
}
|
||
|
|
||
|
if err := os.Unsetenv(egoLauncher); err != nil {
|
||
|
fmt.Println("Error unsetting launcher payload:", err)
|
||
|
// not fatal, do not fail
|
||
|
}
|
||
|
|
||
|
var p string
|
||
|
|
||
|
if len(argv) > 0 {
|
||
|
if p, ok = which(argv[0]); !ok {
|
||
|
fmt.Printf("Did not find '%s' in PATH\n", argv[0])
|
||
|
os.Exit(1)
|
||
|
}
|
||
|
} else {
|
||
|
if p, ok = os.LookupEnv("SHELL"); !ok {
|
||
|
fmt.Println("No command was specified and $SHELL was unset")
|
||
|
os.Exit(1)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if err := syscall.Exec(p, argv, os.Environ()); err != nil {
|
||
|
fmt.Println("Error executing launcher payload:", err)
|
||
|
os.Exit(1)
|
||
|
}
|
||
|
|
||
|
// unreachable
|
||
|
os.Exit(1)
|
||
|
return
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func launcherPayloadEnv() string {
|
||
|
r := &bytes.Buffer{}
|
||
|
enc := base64.NewEncoder(base64.StdEncoding, r)
|
||
|
|
||
|
if err := gob.NewEncoder(enc).Encode(command); err != nil {
|
||
|
fatal("Error encoding launcher payload:", err)
|
||
|
}
|
||
|
|
||
|
_ = enc.Close()
|
||
|
return egoLauncher + "=" + r.String()
|
||
|
}
|