From 77b793910a96f192b782f5ee2c1b10fa3e0385cb Mon Sep 17 00:00:00 2001 From: PhatPhuckDave Date: Sat, 31 Aug 2024 15:34:05 +0200 Subject: [PATCH] Fully implement bricker --- .gitignore | 1 + go.mod | 2 ++ go.sum | 2 ++ main.go | 104 ++++++++++++++++++++++++++++++++++++++++++++++------- sync | 1 + 5 files changed, 98 insertions(+), 12 deletions(-) create mode 100644 .gitignore create mode 100644 go.sum create mode 100644 sync diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c512ac1 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +bricker.exe diff --git a/go.mod b/go.mod index 8541ce4..5c9d03f 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,5 @@ module bricker go 1.23.0 + +require golang.org/x/exp v0.0.0-20240823005443-9b4947da3948 diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..db5d751 --- /dev/null +++ b/go.sum @@ -0,0 +1,2 @@ +golang.org/x/exp v0.0.0-20240823005443-9b4947da3948 h1:kx6Ds3MlpiUHKj7syVnbp57++8WpuKPcR5yjLBjvLEA= +golang.org/x/exp v0.0.0-20240823005443-9b4947da3948/go.mod h1:akd2r19cwCdwSwWeIdzYQGa/EZZyqcOdwWiwj5L5eKQ= diff --git a/main.go b/main.go index 47251bb..ce26d22 100644 --- a/main.go +++ b/main.go @@ -1,34 +1,114 @@ package main import ( + "flag" "fmt" "io" "log" "os" + "sync" + "time" + + "golang.org/x/exp/rand" ) var Error *log.Logger var Warning *log.Logger + func init() { log.SetFlags(log.Lmicroseconds | log.Lshortfile) - logFile, err := os.Create("main.log") - if err != nil { - log.Printf("Error creating log file: %v", err) - os.Exit(1) - } - logger := io.MultiWriter(os.Stdout, logFile) + logger := io.MultiWriter(os.Stdout) log.SetOutput(logger) - Error = log.New(io.MultiWriter(logFile, os.Stderr, os.Stdout), + Error = log.New(io.MultiWriter(os.Stderr, os.Stdout), fmt.Sprintf("%sERROR:%s ", "\033[0;101m", "\033[0m"), log.Lmicroseconds|log.Lshortfile) - Warning = log.New(io.MultiWriter(logFile, os.Stdout), + Warning = log.New(io.MultiWriter(os.Stdout), fmt.Sprintf("%sWarning:%s ", "\033[0;93m", "\033[0m"), log.Lmicroseconds|log.Lshortfile) } func main() { - log.Println("Hello, World!") - Warning.Println("Hello, World!") - Error.Println("Hello, World!") -} \ No newline at end of file + percent := flag.Int("p", 20, "Percent to mangle") + w := flag.Int("w", 8, "Workers") + flag.Parse() + + workers := make(chan struct{}, *w) + wg := sync.WaitGroup{} + + log.Printf("Corrupting %d%% of each input file", *percent) + log.Printf("Using %d workers", *w) + + for _, file := range flag.Args() { + wg.Add(1) + workers <- struct{}{} + + go func(file string) { + defer wg.Done() + defer func() { <-workers }() + + log.Printf("Corrupting %s", file) + filehandle, err := os.OpenFile(file, os.O_RDWR, 0644) + if err != nil { + Error.Printf("Error opening %v: %v", file, err) + return + } + defer filehandle.Close() + + // data, err := io.ReadAll(filehandle) + // if err != nil { + // Error.Printf("Error reading %v: %v", file, err) + // return + // } + // log.Printf("Read %d bytes from %s", len(data), file) + // filehandle.Seek(0, io.SeekStart) + + info, err := os.Stat(file) + if err != nil { + Error.Printf("Error getting file info for %v: %v", file, err) + return + } + filesize := info.Size() + log.Printf("File size is %d bytes", filesize) + + toCorrupt := int64(float32(filesize) * (float32(*percent) / 100)) + indicesToCorrupt := selectRandomIndices(filesize, toCorrupt) + log.Printf("Corrupting %d bytes in %s", toCorrupt, file) + log.Printf("%#v", indicesToCorrupt) + + for _, index := range indicesToCorrupt { + rbyte := byte(rand.Intn(256)) + filehandle.Seek(int64(index), io.SeekStart) + filehandle.Write([]byte{rbyte}) + } + + log.Printf("Corrupted %d bytes in %s", toCorrupt, file) + + // n, err := filehandle.Write(data) + // if err != nil { + // Error.Printf("Error writing %v: %v", file, err) + // return + // } + // log.Printf("Wrote %d bytes to %s", n, file) + }(file) + } + wg.Wait() +} + +func selectRandomIndices(size, n int64) []int64 { + indices := make([]int64, n) + for i := range indices { + indices[i] = int64(i) + } + + rand.Seed(uint64(time.Now().UnixNano())) + + for i := n; i < size; i++ { + r := rand.Int63n(i + 1) + if r < n { + indices[r] = i + } + } + + return indices +} diff --git a/sync b/sync new file mode 100644 index 0000000..8d4eaf1 --- /dev/null +++ b/sync @@ -0,0 +1 @@ +bricker.exe,"C:\Program Files\Git\usr\bin\bricker.exe" \ No newline at end of file