diff --git a/internal/browser/browser.go b/internal/browser/browser.go index 9dcd5c0..a3476e9 100644 --- a/internal/browser/browser.go +++ b/internal/browser/browser.go @@ -3,6 +3,7 @@ package browser import ( "os" "path/filepath" + "sort" "strings" "hack-browser-data/internal/browingdata" @@ -108,6 +109,7 @@ func ListBrowser() []string { var l []string l = append(l, typeutil.Keys(chromiumList)...) l = append(l, typeutil.Keys(firefoxList)...) + sort.Strings(l) return l } diff --git a/internal/browser/browser_windows.go b/internal/browser/browser_windows.go index 17fa899..b4c964d 100644 --- a/internal/browser/browser_windows.go +++ b/internal/browser/browser_windows.go @@ -96,7 +96,7 @@ var ( braveProfilePath = homeDir + "/AppData/Local/BraveSoftware/Brave-Browser/User Data/Default/" speed360ProfilePath = homeDir + "/AppData/Local/360chrome/Chrome/User Data/Default/" qqBrowserProfilePath = homeDir + "/AppData/Local/Tencent/QQBrowser/User Data/Default/" - operaProfilePath = homeDir + "/AppData/Roaming/Opera Software/Opera Stable/Default/" + operaProfilePath = homeDir + "/AppData/Roaming/Opera Software/Opera Stable/" operaGXProfilePath = homeDir + "/AppData/Roaming/Opera Software/Opera GX Stable/" vivaldiProfilePath = homeDir + "/AppData/Local/Vivaldi/User Data/Default/" coccocProfilePath = homeDir + "/AppData/Local/CocCoc/Browser/User Data/Default/" diff --git a/internal/browser/chromium/chromium.go b/internal/browser/chromium/chromium.go index 7f716e6..9a7319e 100644 --- a/internal/browser/chromium/chromium.go +++ b/internal/browser/chromium/chromium.go @@ -124,14 +124,17 @@ func chromiumWalkFunc(items []item.Item, multiItemPaths map[string]map[item.Item return func(path string, info fs.FileInfo, err error) error { for _, v := range items { if info.Name() == v.FileName() { - parentBaseDir := fileutil.ParentBaseDir(path) - if parentBaseDir == "System Profile" { + if strings.Contains(path, "System Profile") { continue } - if _, exist := multiItemPaths[parentBaseDir]; exist { - multiItemPaths[parentBaseDir][v] = path + profileFolder := fileutil.ParentBaseDir(path) + if strings.Contains(filepath.ToSlash(path), "/Network/Cookies") { + profileFolder = fileutil.BaseDir(strings.ReplaceAll(filepath.ToSlash(path), "/Network/Cookies", "")) + } + if _, exist := multiItemPaths[profileFolder]; exist { + multiItemPaths[profileFolder][v] = path } else { - multiItemPaths[parentBaseDir] = map[item.Item]string{v: path} + multiItemPaths[profileFolder] = map[item.Item]string{v: path} } } } diff --git a/internal/browser/chromium/chromium_darwin.go b/internal/browser/chromium/chromium_darwin.go index e905d64..a8ebe36 100644 --- a/internal/browser/chromium/chromium_darwin.go +++ b/internal/browser/chromium/chromium_darwin.go @@ -17,8 +17,8 @@ import ( ) var ( - ErrWrongSecurityCommand = errors.New("macOS wrong security command") - ErrCouldNotFindInKeychain = errors.New("macOS could not find in keychain") + errWrongSecurityCommand = errors.New("wrong security command") + errCouldNotFindInKeychain = errors.New("could not be find in keychain") ) func (c *chromium) GetMasterKey() ([]byte, error) { @@ -39,19 +39,19 @@ func (c *chromium) GetMasterKey() ([]byte, error) { } if stderr.Len() > 0 { if strings.Contains(stderr.String(), "could not be found") { - return nil, ErrCouldNotFindInKeychain + return nil, errCouldNotFindInKeychain } return nil, errors.New(stderr.String()) } chromeSecret := bytes.TrimSpace(stdout.Bytes()) if chromeSecret == nil { - return nil, ErrWrongSecurityCommand + return nil, errWrongSecurityCommand } chromeSalt := []byte("saltysalt") // @https://source.chromium.org/chromium/chromium/src/+/master:components/os_crypt/os_crypt_mac.mm;l=157 key := pbkdf2.Key(chromeSecret, chromeSalt, 1003, 16, sha1.New) if key == nil { - return nil, ErrWrongSecurityCommand + return nil, errWrongSecurityCommand } c.masterKey = key log.Infof("%s initialized master key success", c.name) diff --git a/internal/decrypter/decrypter_darwin.go b/internal/decrypter/decrypter_darwin.go index aaafadf..35645bc 100644 --- a/internal/decrypter/decrypter_darwin.go +++ b/internal/decrypter/decrypter_darwin.go @@ -1,20 +1,11 @@ -package decrypter - -import ( - "errors" -) +//go:build darwin -var ( - errSecurityKeyIsEmpty = errors.New("input [security find-generic-password -wa 'Chrome'] in terminal") -) +package decrypter func Chromium(key, encryptPass []byte) ([]byte, error) { if len(encryptPass) <= 3 { return nil, errPasswordIsEmpty } - if len(key) == 0 { - return nil, errSecurityKeyIsEmpty - } iv := []byte{32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32} return aes128CBCDecrypt(key, iv, encryptPass[3:]) diff --git a/internal/decrypter/decrypter_linux.go b/internal/decrypter/decrypter_linux.go index 715f610..6f8e2d5 100644 --- a/internal/decrypter/decrypter_linux.go +++ b/internal/decrypter/decrypter_linux.go @@ -1,3 +1,5 @@ +//go:build linux + package decrypter func Chromium(key, encryptPass []byte) ([]byte, error) { diff --git a/internal/decrypter/decrypter_windows.go b/internal/decrypter/decrypter_windows.go index 8c17f8c..794d870 100644 --- a/internal/decrypter/decrypter_windows.go +++ b/internal/decrypter/decrypter_windows.go @@ -1,3 +1,5 @@ +//go:build windows + package decrypter import ( @@ -11,9 +13,6 @@ func Chromium(key, encryptPass []byte) ([]byte, error) { if len(encryptPass) < 3 { return nil, errPasswordIsEmpty } - if len(key) == 0 { - return nil, errSecurityKeyIsEmpty - } return aesGCMDecrypt(encryptPass[15:], key, encryptPass[3:15]) } @@ -22,9 +21,6 @@ func ChromiumForYandex(key, encryptPass []byte) ([]byte, error) { if len(encryptPass) < 3 { return nil, errPasswordIsEmpty } - if len(key) == 0 { - return nil, errSecurityKeyIsEmpty - } // remove Prefix 'v10' // gcmBlockSize = 16 // gcmTagSize = 16