checks.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. package main
  2. import (
  3. "math"
  4. "strings"
  5. )
  6. func doChecks(diff string) []string {
  7. var match string
  8. var results []string
  9. lines := strings.Split(diff, "\n")
  10. for _, line := range lines {
  11. for _, re := range regexes {
  12. match = re.FindString(line)
  13. if len(match) == 0 ||
  14. (opts.Strict && containsStopWords(line)) ||
  15. (opts.Entropy && !checkShannonEntropy(line)) {
  16. continue
  17. }
  18. results = append(results, line)
  19. }
  20. }
  21. return results
  22. }
  23. // checkShannonEntropy checks entropy of target
  24. func checkShannonEntropy(target string) bool {
  25. var (
  26. sum float64
  27. targetBase64Len int
  28. targetHexLen int
  29. base64Freq = make(map[rune]float64)
  30. hexFreq = make(map[rune]float64)
  31. bits int
  32. )
  33. index := assignRegex.FindStringIndex(target)
  34. if len(index) == 0 {
  35. return false
  36. }
  37. target = strings.Trim(target[index[1]:], " ")
  38. if len(target) > 100 {
  39. return false
  40. }
  41. // base64Shannon
  42. for _, i := range target {
  43. if strings.Contains(base64Chars, string(i)) {
  44. base64Freq[i]++
  45. targetBase64Len++
  46. }
  47. }
  48. for _, v := range base64Freq {
  49. f := v / float64(targetBase64Len)
  50. sum += f * math.Log2(f)
  51. }
  52. bits = int(math.Ceil(sum*-1)) * targetBase64Len
  53. if bits > opts.B64EntropyCutoff {
  54. return true
  55. }
  56. // hexShannon
  57. sum = 0
  58. for _, i := range target {
  59. if strings.Contains(hexChars, string(i)) {
  60. hexFreq[i]++
  61. targetHexLen++
  62. }
  63. }
  64. for _, v := range hexFreq {
  65. f := v / float64(targetHexLen)
  66. sum += f * math.Log2(f)
  67. }
  68. bits = int(math.Ceil(sum*-1)) * targetHexLen
  69. return bits > opts.HexEntropyCutoff
  70. }
  71. // containsStopWords checks if there are any stop words in target
  72. func containsStopWords(target string) bool {
  73. for _, stopWord := range stopWords {
  74. if strings.Contains(target, stopWord) {
  75. return true
  76. }
  77. }
  78. return false
  79. }