discord-exploits/discord-exploits.go

126 lines
2.5 KiB
Go

package main
import (
"bytes"
"flag"
"math/rand"
"os"
"path/filepath"
"strings"
"time"
"github.com/fatih/color"
"github.com/gabriel-vasile/mimetype"
)
var (
mode string
inputFile string
outputFile string
done = make(chan response, 1)
logRed = color.New(color.FgHiRed)
logGreen = color.New(color.FgHiGreen)
)
type response int
const (
responseWrongFileType response = iota
responseFileNotExist
responseUnknownError
responseDone
)
func init() {
flag.StringVar(&mode, "m", "", "mode you want to use")
flag.StringVar(&inputFile, "i", "", "input file")
flag.StringVar(&outputFile, "o", "", "output file, will be random if its not set")
flag.Parse()
flag.CommandLine.SetOutput(os.Stdout)
flag.Usage = func() {
_, file := filepath.Split(os.Args[0])
logRed.Fprintf(flag.CommandLine.Output(), "Usage of %s:\n", file)
flag.PrintDefaults()
}
if mode == "" {
flag.Usage()
os.Exit(0)
}
if inputFile == "" {
if flag.Arg(0) == "" {
flag.Usage()
os.Exit(0)
}
inputFile = flag.Arg(0)
}
if outputFile == "" {
outputFile = createName()
}
mimetype.SetLimit(2 >> 15)
}
func main() {
switch strings.ToLower(mode) {
case "z", "0", "zero":
webm([]byte{0, 0, 0, 0, 0, 0, 0, 0})
case "n", "-", "negative":
webm([]byte{66, 255, 176, 96, 0, 0, 0, 0})
case "e", "+", "expanding":
webm([]byte{63, 240, 0, 0, 0, 0, 0, 0})
default:
logRed.Println("Wrong mode!")
}
switch <-done {
case responseWrongFileType:
logRed.Println("Wrong File Type")
case responseFileNotExist:
logRed.Println("File Not Found")
case responseDone:
logGreen.Printf("Done, saved to %s", outputFile)
}
time.Sleep(time.Second * 5)
}
func webm(change []byte) {
b, err := os.ReadFile(inputFile)
if err != nil {
logRed.Sprintln("File could not be opened")
done <- responseFileNotExist
return
}
mime := mimetype.Detect(b).String()
if mime != "video/webm" && mime != "video/x-matroska" {
done <- responseWrongFileType
}
index := bytes.Index(b, []byte("\x44\x89\x88"))
if index == -1 {
done <- responseUnknownError
return
}
if filepath.Ext(outputFile) == "" {
outputFile = outputFile + ".webm"
}
os.WriteFile(outputFile, bytes.Replace(b, b[index+3:index+10], change, 1), 0o777)
done <- responseDone
}
func createName() string {
charset := "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
b := make([]byte, 8)
rand.Seed(time.Now().UnixNano())
for i := range b {
b[i] = charset[rand.Intn(len(charset))]
}
return string(b)
}