Произошла ошибка в вашем коде из-за неправильного использования переменной r. Вы объявили переменную r снова в функции main, что приводит к созданию локальной переменной с тем же именем, но в другой области видимости, и это приводит к тому, что вы не используете глобальную переменную r, которая должна быть прочитана в основной программе.
Чтобы исправить это, вам нужно удалить объявление переменной r в функции main, чтобы использовать глобальную переменную r, которая была создана на уровне пакета. Вот исправленный код:
package main import ( "bufio" "fmt" "golang.org/x/crypto/bcrypt" "io" "os" "strings" "sync" ) var ( hash_target = "$2y$10$Jk2gOsrCgYKaVutj9JIVYuXlinrpzeqxdXng/Nm96O7t5AvVBir/a" dict = "/home/supreme/rockyou.txt" r io.Reader err error ) func main() { r, err = os.Open(dict) if err != nil { fmt.Println(err) } defer r.(io.ReadCloser).Close() var wg sync.WaitGroup var reader *bufio.Reader = bufio.NewReader(r) var pasw string wg.Add(1) for { pasw, err = reader.ReadString('\n') if err == io.EOF { fmt.Printf("File %s end detected", dict) break } else { pasw = strings.Replace(pasw, "\n", "", -1) go hack_pass(pasw, hash_target, &wg) } } wg.Wait() } func hack_pass(str string, hash_target string, wg *sync.WaitGroup) { fmt.Println("----------------------------------") if CheckPasswordHash(str, hash_target) { fmt.Println("----------------------------------") fmt.Println("[SUCCESS]:", str) fmt.Println("----------------------------------") os.Exit(0) } else { fmt.Println("[FAILURE]:", str) } wg.Done() } func CheckPasswordHash(password string, hash string) bool { err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password)) return err == nil }
Теперь код должен работать правильно и перебирать пароли из файла "rockyou.txt", пытаясь взломать хэш. Надеюсь, это поможет вам исправить проблему с выполнением работы горутин. Если у вас возникнут другие вопросы, не стесняйтесь обращаться!
Произошла ошибка в вашем коде из-за неправильного использования переменной r. Вы объявили переменную r снова в функции main, что приводит к созданию локальной переменной с тем же именем, но в другой области видимости, и это приводит к тому, что вы не используете глобальную переменную r, которая должна быть прочитана в основной программе.
Чтобы исправить это, вам нужно удалить объявление переменной r в функции main, чтобы использовать глобальную переменную r, которая была создана на уровне пакета. Вот исправленный код:
package mainimport (
"bufio"
"fmt"
"golang.org/x/crypto/bcrypt"
"io"
"os"
"strings"
"sync"
)
var (
hash_target = "$2y$10$Jk2gOsrCgYKaVutj9JIVYuXlinrpzeqxdXng/Nm96O7t5AvVBir/a"
dict = "/home/supreme/rockyou.txt"
r io.Reader
err error
)
func main() {
r, err = os.Open(dict)
if err != nil {
fmt.Println(err)
}
defer r.(io.ReadCloser).Close()
var wg sync.WaitGroup
var reader *bufio.Reader = bufio.NewReader(r)
var pasw string
wg.Add(1)
for {
pasw, err = reader.ReadString('\n')
if err == io.EOF {
fmt.Printf("File %s end detected", dict)
break
} else {
pasw = strings.Replace(pasw, "\n", "", -1)
go hack_pass(pasw, hash_target, &wg)
}
}
wg.Wait()
}
func hack_pass(str string, hash_target string, wg *sync.WaitGroup) {
fmt.Println("----------------------------------")
if CheckPasswordHash(str, hash_target) {
fmt.Println("----------------------------------")
fmt.Println("[SUCCESS]:", str)
fmt.Println("----------------------------------")
os.Exit(0)
} else {
fmt.Println("[FAILURE]:", str)
}
wg.Done()
}
func CheckPasswordHash(password string, hash string) bool {
err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password))
return err == nil
}
Теперь код должен работать правильно и перебирать пароли из файла "rockyou.txt", пытаясь взломать хэш. Надеюсь, это поможет вам исправить проблему с выполнением работы горутин. Если у вас возникнут другие вопросы, не стесняйтесь обращаться!