From 8f489747704fc5213c6e92e8e8e6ad0f7a701247 Mon Sep 17 00:00:00 2001 From: Oliver Runge Date: Wed, 8 Apr 2015 00:17:39 +0200 Subject: [PATCH 1/3] Add pattern flag --- gitbrute.go | 36 +++++++++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/gitbrute.go b/gitbrute.go index ce6e18c..85aba53 100644 --- a/gitbrute.go +++ b/gitbrute.go @@ -33,9 +33,10 @@ import ( ) var ( - prefix = flag.String("prefix", "bf", "Desired prefix") - force = flag.Bool("force", false, "Re-run, even if current hash matches prefix") - cpu = flag.Int("cpus", runtime.NumCPU(), "Number of CPUs to use. Defaults to number of processors.") + prefix = flag.String("prefix", "", "Desired prefix") + force = flag.Bool("force", false, "Re-run, even if current hash matches prefix") + cpu = flag.Int("cpus", runtime.NumCPU(), "Number of CPUs to use. Defaults to number of processors.") + pattern = flag.String("pattern", "", "Desired pattern") ) var ( @@ -45,13 +46,24 @@ var ( func main() { flag.Parse() - runtime.GOMAXPROCS(*cpu) - if _, err := strconv.ParseInt(*prefix, 16, 64); err != nil { - log.Fatalf("Prefix %q isn't hex.", *prefix) + if *prefix == "" && *pattern == "" { + log.Fatalf("Need prefix or pattern") + } + + if *prefix != "" { + if _, err := strconv.ParseInt(*prefix, 16, 64); err != nil { + log.Fatalf("Prefix %q isn't hex.", *prefix) + } + } + + if *pattern != "" { + if _, err := strconv.ParseInt(*prefix, 2, 64); err != nil { + log.Fatalf("Pattern %q isn't binary.", *pattern) + } } hash := curHash() - if strings.HasPrefix(hash, *prefix) && !*force { + if hashMatches(hash) && !*force { return } @@ -65,6 +77,8 @@ func main() { } msg := obj[i+2:] + runtime.GOMAXPROCS(*cpu) + possibilities := make(chan try, 512) go explore(possibilities) @@ -96,6 +110,14 @@ var ( commiterDateRx = regexp.MustCompile(`(?m)^committer.+> (.+)`) ) +func hashMatches(hash string) bool { + if *prefix != "" { + return strings.HasPrefix(hash, *prefix) + } + + return false +} + func bruteForce(obj []byte, winner chan<- solution, possibilities <-chan try, done <-chan struct{}) { // blob is the blob to mutate in-place repatedly while testing // whether we have a match. From 3cf6bbb6f398623e4a0bab066b3a4ce691e7955a Mon Sep 17 00:00:00 2001 From: Oliver Runge Date: Wed, 8 Apr 2015 00:17:41 +0200 Subject: [PATCH 2/3] Add simple working pattern matching --- gitbrute.go | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/gitbrute.go b/gitbrute.go index 85aba53..0509f06 100644 --- a/gitbrute.go +++ b/gitbrute.go @@ -44,6 +44,10 @@ var ( startUnix = start.Unix() ) +var ( + bytePrefix, bytePattern []byte +) + func main() { flag.Parse() if *prefix == "" && *pattern == "" { @@ -54,16 +58,18 @@ func main() { if _, err := strconv.ParseInt(*prefix, 16, 64); err != nil { log.Fatalf("Prefix %q isn't hex.", *prefix) } + bytePrefix = []byte(*prefix) } if *pattern != "" { - if _, err := strconv.ParseInt(*prefix, 2, 64); err != nil { + if _, err := strconv.ParseInt(*pattern, 2, 64); err != nil { log.Fatalf("Pattern %q isn't binary.", *pattern) } + bytePattern = []byte(*pattern) } hash := curHash() - if hashMatches(hash) && !*force { + if hashMatches([]byte(hash)) && !*force { return } @@ -110,12 +116,24 @@ var ( commiterDateRx = regexp.MustCompile(`(?m)^committer.+> (.+)`) ) -func hashMatches(hash string) bool { +func hashMatches(hash []byte) bool { if *prefix != "" { - return strings.HasPrefix(hash, *prefix) + return bytes.HasPrefix(hash, bytePrefix) + } + + for i := 0; i < len(bytePattern); i++ { + if strings.IndexByte("01234567", hash[i]) > -1 { + if bytePattern[i] == '1' { + return false + } + } else { + if bytePattern[i] == '0' { + return false + } + } } - return false + return true } func bruteForce(obj []byte, winner chan<- solution, possibilities <-chan try, done <-chan struct{}) { @@ -126,7 +144,6 @@ func bruteForce(obj []byte, winner chan<- solution, possibilities <-chan try, do commitDate, cdatei := getDate(blob, commiterDateRx) s1 := sha1.New() - wantHexPrefix := []byte(*prefix) hexBuf := make([]byte, 0, sha1.Size*2) for t := range possibilities { @@ -140,7 +157,7 @@ func bruteForce(obj []byte, winner chan<- solution, possibilities <-chan try, do strconv.AppendInt(blob[:cdatei], cd.n, 10) s1.Reset() s1.Write(blob) - if !bytes.HasPrefix(hexInPlace(s1.Sum(hexBuf[:0])), wantHexPrefix) { + if !hashMatches(hexInPlace(s1.Sum(hexBuf[:0]))) { continue } From 64be7609a425367f9aafe84eafed7e43a5e32a2c Mon Sep 17 00:00:00 2001 From: Oliver Runge Date: Wed, 8 Apr 2015 00:17:42 +0200 Subject: [PATCH 3/3] Treat given pattern as regular expression --- gitbrute.go | 21 ++++++--------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/gitbrute.go b/gitbrute.go index 0509f06..6ee647e 100644 --- a/gitbrute.go +++ b/gitbrute.go @@ -45,7 +45,8 @@ var ( ) var ( - bytePrefix, bytePattern []byte + bytePrefix []byte + patternRx *regexp.Regexp ) func main() { @@ -62,10 +63,7 @@ func main() { } if *pattern != "" { - if _, err := strconv.ParseInt(*pattern, 2, 64); err != nil { - log.Fatalf("Pattern %q isn't binary.", *pattern) - } - bytePattern = []byte(*pattern) + patternRx = regexp.MustCompile(*pattern) } hash := curHash() @@ -121,16 +119,9 @@ func hashMatches(hash []byte) bool { return bytes.HasPrefix(hash, bytePrefix) } - for i := 0; i < len(bytePattern); i++ { - if strings.IndexByte("01234567", hash[i]) > -1 { - if bytePattern[i] == '1' { - return false - } - } else { - if bytePattern[i] == '0' { - return false - } - } + m := patternRx.FindSubmatchIndex(hash) + if m == nil { + return false } return true