From 24f2ceb6b4f007956fb6d3a0cc2c8c24478aa482 Mon Sep 17 00:00:00 2001 From: moond4rk Date: Tue, 10 Nov 2020 14:11:16 +0800 Subject: [PATCH] docs: add key function documents --- core/browser.go | 93 ++++++++++++++++++++------------- core/browser_linux.go | 1 + core/browser_windows.go | 5 +- core/decrypt/decrypt.go | 2 + core/decrypt/decrypt_darwin.go | 1 + core/decrypt/decrypt_linux.go | 3 +- core/decrypt/decrypt_windows.go | 3 +- utils/utils.go | 33 ------------ 8 files changed, 69 insertions(+), 72 deletions(-) diff --git a/core/browser.go b/core/browser.go index 1768170..85d52d4 100644 --- a/core/browser.go +++ b/core/browser.go @@ -2,11 +2,12 @@ package core import ( "errors" + "fmt" + "path/filepath" "strings" - "hack-browser-data/core/common" + "hack-browser-data/core/data" "hack-browser-data/log" - "hack-browser-data/utils" ) const ( @@ -29,10 +30,10 @@ type Browser interface { GetSecretKey() []byte // GetAllItems return all of items (password|bookmark|cookie|history) - GetAllItems() ([]common.Item, error) + GetAllItems() ([]data.Item, error) // GetItem return single one from password|bookmark|cookie|history - GetItem(itemName string) (common.Item, error) + GetItem(itemName string) (data.Item, error) } const ( @@ -52,46 +53,46 @@ var ( var ( chromiumItems = map[string]struct { mainFile string - newItem func(mainFile, subFile string) common.Item + newItem func(mainFile, subFile string) data.Item }{ bookmark: { - mainFile: common.ChromeBookmarkFile, - newItem: common.NewBookmarks, + mainFile: data.ChromeBookmarkFile, + newItem: data.NewBookmarks, }, cookie: { - mainFile: common.ChromeCookieFile, - newItem: common.NewCookies, + mainFile: data.ChromeCookieFile, + newItem: data.NewCookies, }, history: { - mainFile: common.ChromeHistoryFile, - newItem: common.NewHistoryData, + mainFile: data.ChromeHistoryFile, + newItem: data.NewHistoryData, }, password: { - mainFile: common.ChromePasswordFile, - newItem: common.NewCPasswords, + mainFile: data.ChromePasswordFile, + newItem: data.NewCPasswords, }, } firefoxItems = map[string]struct { mainFile string subFile string - newItem func(mainFile, subFile string) common.Item + newItem func(mainFile, subFile string) data.Item }{ bookmark: { - mainFile: common.FirefoxDataFile, - newItem: common.NewBookmarks, + mainFile: data.FirefoxDataFile, + newItem: data.NewBookmarks, }, cookie: { - mainFile: common.FirefoxCookieFile, - newItem: common.NewCookies, + mainFile: data.FirefoxCookieFile, + newItem: data.NewCookies, }, history: { - mainFile: common.FirefoxDataFile, - newItem: common.NewHistoryData, + mainFile: data.FirefoxDataFile, + newItem: data.NewHistoryData, }, password: { - mainFile: common.FirefoxKey4File, - subFile: common.FirefoxLoginFile, - newItem: common.NewFPasswords, + mainFile: data.FirefoxKey4File, + subFile: data.FirefoxLoginFile, + newItem: data.NewFPasswords, }, } ) @@ -104,6 +105,7 @@ type Chromium struct { secretKey []byte } +// NewChromium return chromium browser interface func NewChromium(profile, key, name, storage string) (Browser, error) { return &Chromium{profilePath: profile, keyPath: key, name: name, storage: storage}, nil } @@ -116,10 +118,12 @@ func (c *Chromium) GetSecretKey() []byte { return c.secretKey } -func (c *Chromium) GetAllItems() (Items []common.Item, err error) { - var items []common.Item +// GetAllItems return all chromium items from browser +// if can't find item path, log error then continue +func (c *Chromium) GetAllItems() ([]data.Item, error) { + var items []data.Item for item, choice := range chromiumItems { - m, err := utils.GetItemPath(c.profilePath, choice.mainFile) + m, err := getItemPath(c.profilePath, choice.mainFile) if err != nil { log.Errorf("%s find %s file failed, ERR:%s", c.name, item, err) continue @@ -131,10 +135,11 @@ func (c *Chromium) GetAllItems() (Items []common.Item, err error) { return items, nil } -func (c *Chromium) GetItem(itemName string) (common.Item, error) { +// GetItem return single item +func (c *Chromium) GetItem(itemName string) (data.Item, error) { itemName = strings.ToLower(itemName) if item, ok := chromiumItems[itemName]; ok { - m, err := utils.GetItemPath(c.profilePath, item.mainFile) + m, err := getItemPath(c.profilePath, item.mainFile) if err != nil { log.Errorf("%s find %s file failed, ERR:%s", c.name, item.mainFile, err) } @@ -151,25 +156,27 @@ type Firefox struct { keyPath string } +// NewFirefox return firefox browser interface func NewFirefox(profile, key, name, storage string) (Browser, error) { return &Firefox{profilePath: profile, keyPath: key, name: name}, nil } -func (f *Firefox) GetAllItems() ([]common.Item, error) { - var items []common.Item +// +func (f *Firefox) GetAllItems() ([]data.Item, error) { + var items []data.Item for item, choice := range firefoxItems { var ( sub, main string err error ) if choice.subFile != "" { - sub, err = utils.GetItemPath(f.profilePath, choice.subFile) + sub, err = getItemPath(f.profilePath, choice.subFile) if err != nil { log.Errorf("%s find %s file failed, ERR:%s", f.name, item, err) continue } } - main, err = utils.GetItemPath(f.profilePath, choice.mainFile) + main, err = getItemPath(f.profilePath, choice.mainFile) if err != nil { log.Errorf("%s find %s file failed, ERR:%s", f.name, item, err) continue @@ -181,7 +188,7 @@ func (f *Firefox) GetAllItems() ([]common.Item, error) { return items, nil } -func (f *Firefox) GetItem(itemName string) (common.Item, error) { +func (f *Firefox) GetItem(itemName string) (data.Item, error) { itemName = strings.ToLower(itemName) if item, ok := firefoxItems[itemName]; ok { var ( @@ -189,12 +196,12 @@ func (f *Firefox) GetItem(itemName string) (common.Item, error) { err error ) if item.subFile != "" { - sub, err = utils.GetItemPath(f.profilePath, item.subFile) + sub, err = getItemPath(f.profilePath, item.subFile) if err != nil { log.Errorf("%s find %s file failed, ERR:%s", f.name, item.subFile, err) } } - main, err = utils.GetItemPath(f.profilePath, item.mainFile) + main, err = getItemPath(f.profilePath, item.mainFile) if err != nil { log.Errorf("%s find %s file failed, ERR:%s", f.name, item.mainFile, err) } @@ -210,14 +217,19 @@ func (f *Firefox) GetName() string { return f.name } +// GetSecretKey for firefox is always nil +// this method use to implement Browser interface func (f *Firefox) GetSecretKey() []byte { return nil } +// InitSecretKey for firefox is always nil +// this method use to implement Browser interface func (f *Firefox) InitSecretKey() error { return nil } +// PickBrowser return a list of browser interface func PickBrowser(name string) ([]Browser, error) { var browsers []Browser name = strings.ToLower(name) @@ -238,6 +250,17 @@ func PickBrowser(name string) ([]Browser, error) { return nil, errBrowserNotSupported } +func getItemPath(profilePath, file string) (string, error) { + p, err := filepath.Glob(profilePath + file) + if err != nil { + return "", err + } + if len(p) > 0 { + return p[0], nil + } + return "", fmt.Errorf("find %s failed", file) +} + func ListBrowser() []string { var l []string for k := range browserList { diff --git a/core/browser_linux.go b/core/browser_linux.go index 0b319dc..3049d73 100644 --- a/core/browser_linux.go +++ b/core/browser_linux.go @@ -2,6 +2,7 @@ package core import ( "crypto/sha1" + "hack-browser-data/log" "github.com/godbus/dbus/v5" diff --git a/core/browser_windows.go b/core/browser_windows.go index 63369a0..57975b9 100644 --- a/core/browser_windows.go +++ b/core/browser_windows.go @@ -3,9 +3,10 @@ package core import ( "encoding/base64" "errors" + "os" + "hack-browser-data/core/decrypt" "hack-browser-data/utils" - "os" "github.com/tidwall/gjson" ) @@ -70,6 +71,8 @@ var ( errBase64DecodeFailed = errors.New("decode base64 failed") ) +// InitSecretKey on windows with win32 DPAPI +// conference from @https://gist.github.com/akamajoris/ed2f14d817d5514e7548 func (c *Chromium) InitSecretKey() error { if c.keyPath == "" { return nil diff --git a/core/decrypt/decrypt.go b/core/decrypt/decrypt.go index 5ca5438..74ca22a 100644 --- a/core/decrypt/decrypt.go +++ b/core/decrypt/decrypt.go @@ -6,6 +6,7 @@ import ( "crypto/des" "encoding/asn1" "errors" + "hack-browser-data/log" ) @@ -33,6 +34,7 @@ func PKCS5UnPadding(src []byte) []byte { return src[:(length - unpad)] } +// Des3Decrypt use for decrypt firefox PBE func Des3Decrypt(key, iv []byte, src []byte) ([]byte, error) { block, err := des.NewTripleDESCipher(key) if err != nil { diff --git a/core/decrypt/decrypt_darwin.go b/core/decrypt/decrypt_darwin.go index 451fa67..06ca5dd 100644 --- a/core/decrypt/decrypt_darwin.go +++ b/core/decrypt/decrypt_darwin.go @@ -4,6 +4,7 @@ import ( "crypto/hmac" "crypto/sha1" "encoding/asn1" + "hack-browser-data/log" ) diff --git a/core/decrypt/decrypt_linux.go b/core/decrypt/decrypt_linux.go index 3b23943..d78726e 100644 --- a/core/decrypt/decrypt_linux.go +++ b/core/decrypt/decrypt_linux.go @@ -6,6 +6,7 @@ import ( "crypto/sha256" "encoding/asn1" "encoding/hex" + "hack-browser-data/log" "golang.org/x/crypto/pbkdf2" @@ -40,7 +41,6 @@ SEQUENCE (2 elem) INTEGER 1 OCTET STRING (16 byte) */ - type MetaPBE struct { SequenceA Encrypted []byte @@ -101,7 +101,6 @@ func DecodeMeta(decodeItem []byte) (pbe MetaPBE, err error) { } func DecodeNss(nssA11Bytes []byte) (pbe NssPBE, err error) { - log.Debug(hex.EncodeToString(nssA11Bytes)) _, err = asn1.Unmarshal(nssA11Bytes, &pbe) if err != nil { log.Error(err) diff --git a/core/decrypt/decrypt_windows.go b/core/decrypt/decrypt_windows.go index 2db5b5b..24ad7a2 100644 --- a/core/decrypt/decrypt_windows.go +++ b/core/decrypt/decrypt_windows.go @@ -7,10 +7,11 @@ import ( "crypto/sha256" "encoding/asn1" "encoding/hex" - "hack-browser-data/log" "syscall" "unsafe" + "hack-browser-data/log" + "golang.org/x/crypto/pbkdf2" ) diff --git a/utils/utils.go b/utils/utils.go index f0019ea..756643e 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -7,7 +7,6 @@ import ( "io/ioutil" "os" "path" - "path/filepath" "strings" "time" @@ -16,38 +15,6 @@ import ( const Prefix = "[x]: " -func CopyDB(src, dst string) error { - locals, _ := filepath.Glob("*") - for _, v := range locals { - if v == dst { - err := os.Remove(dst) - if err != nil { - return err - } - } - } - sourceFile, err := ioutil.ReadFile(src) - if err != nil { - log.Debug(err.Error()) - } - err = ioutil.WriteFile(dst, sourceFile, 0777) - if err != nil { - log.Debug(err.Error()) - } - return err -} - -func GetItemPath(profilePath, file string) (string, error) { - p, err := filepath.Glob(profilePath + file) - if err != nil { - return "", err - } - if len(p) > 0 { - return p[0], nil - } - return "", fmt.Errorf("find %s failed", file) -} - func IntToBool(a int) bool { switch a { case 0, -1: