diff --git a/README.md b/README.md index 95ebb93..a7c5112 100644 --- a/README.md +++ b/README.md @@ -134,7 +134,7 @@ USAGE: Github Link: https://github.com/moonD4rk/HackBrowserData VERSION: - 0.4.2 + 0.4.3 GLOBAL OPTIONS: --verbose, --vv verbose (default: false) diff --git a/README_ZH.md b/README_ZH.md index 8b60063..d823ded 100644 --- a/README_ZH.md +++ b/README_ZH.md @@ -129,7 +129,7 @@ USAGE: Github Link: https://github.com/moonD4rk/HackBrowserData VERSION: - 0.4.2 + 0.4.3 GLOBAL OPTIONS: --verbose, --vv verbose (default: false) diff --git a/go.mod b/go.mod index 7df5a94..f2418f0 100644 --- a/go.mod +++ b/go.mod @@ -16,6 +16,7 @@ require ( github.com/urfave/cli/v2 v2.4.0 golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3 golang.org/x/exp v0.0.0-20220414153411-bcd21879b8fd + golang.org/x/text v0.3.6 ) require ( diff --git a/go.sum b/go.sum index b84743f..2bf7b3f 100644 --- a/go.sum +++ b/go.sum @@ -90,6 +90,8 @@ golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= diff --git a/internal/browingdata/bookmark/bookmark.go b/internal/browingdata/bookmark/bookmark.go index 2a79058..2e45535 100644 --- a/internal/browingdata/bookmark/bookmark.go +++ b/internal/browingdata/bookmark/bookmark.go @@ -76,10 +76,23 @@ func getBookmarkChildren(value gjson.Result, w *ChromiumBookmark) (children gjso return children } +func bookmarkType(a int64) string { + switch a { + case 1: + return "url" + default: + return "folder" + } +} + func (c *ChromiumBookmark) Name() string { return "bookmark" } +func (c *ChromiumBookmark) Length() int { + return len(*c) +} + type FirefoxBookmark []bookmark const ( @@ -134,11 +147,6 @@ func (f *FirefoxBookmark) Name() string { return "bookmark" } -func bookmarkType(a int64) string { - switch a { - case 1: - return "url" - default: - return "folder" - } +func (f *FirefoxBookmark) Length() int { + return len(*f) } diff --git a/internal/browingdata/browsingdata.go b/internal/browingdata/browsingdata.go index 356706c..4c244b0 100644 --- a/internal/browingdata/browsingdata.go +++ b/internal/browingdata/browsingdata.go @@ -24,6 +24,8 @@ type Source interface { Parse(masterKey []byte) error Name() string + + Length() int } func New(sources []item.Item) *Data { @@ -47,6 +49,10 @@ func (d *Data) Output(dir, browserName, flag string) { output := NewOutPutter(flag) for _, source := range d.sources { + if source.Length() == 0 { + // if the length of the export data is 0, then it is not necessary to output + continue + } filename := fileutil.Filename(browserName, source.Name(), output.Ext()) f, err := output.CreateFile(dir, filename) diff --git a/internal/browingdata/cookie/cookie.go b/internal/browingdata/cookie/cookie.go index 45a4fbd..14cae53 100644 --- a/internal/browingdata/cookie/cookie.go +++ b/internal/browingdata/cookie/cookie.go @@ -93,6 +93,10 @@ func (c *ChromiumCookie) Name() string { return "cookie" } +func (c *ChromiumCookie) Length() int { + return len(*c) +} + type FirefoxCookie []cookie const ( @@ -137,3 +141,7 @@ func (f *FirefoxCookie) Parse(masterKey []byte) error { func (f *FirefoxCookie) Name() string { return "cookie" } + +func (f *FirefoxCookie) Length() int { + return len(*f) +} diff --git a/internal/browingdata/creditcard/creditcard.go b/internal/browingdata/creditcard/creditcard.go index fb772ad..781fe90 100644 --- a/internal/browingdata/creditcard/creditcard.go +++ b/internal/browingdata/creditcard/creditcard.go @@ -76,6 +76,10 @@ func (c *ChromiumCreditCard) Name() string { return "creditcard" } +func (c *ChromiumCreditCard) Length() int { + return len(*c) +} + type YandexCreditCard []card func (c *YandexCreditCard) Parse(masterKey []byte) error { @@ -127,3 +131,7 @@ func (c *YandexCreditCard) Parse(masterKey []byte) error { func (c *YandexCreditCard) Name() string { return "creditcard" } + +func (c *YandexCreditCard) Length() int { + return len(*c) +} diff --git a/internal/browingdata/download/download.go b/internal/browingdata/download/download.go index ae7a939..55bcc2d 100644 --- a/internal/browingdata/download/download.go +++ b/internal/browingdata/download/download.go @@ -70,6 +70,10 @@ func (c *ChromiumDownload) Name() string { return "download" } +func (c *ChromiumDownload) Length() int { + return len(*c) +} + type FirefoxDownload []download const ( @@ -131,3 +135,7 @@ func (f *FirefoxDownload) Parse(masterKey []byte) error { func (f *FirefoxDownload) Name() string { return "download" } + +func (f *FirefoxDownload) Length() int { + return len(*f) +} diff --git a/internal/browingdata/extension/extension.go b/internal/browingdata/extension/extension.go index ecc8261..4758ce2 100644 --- a/internal/browingdata/extension/extension.go +++ b/internal/browingdata/extension/extension.go @@ -50,6 +50,10 @@ func (c *ChromiumExtension) Name() string { return "extension" } +func (c *ChromiumExtension) Length() int { + return len(*c) +} + type FirefoxExtension []*extension func (f *FirefoxExtension) Parse(masterKey []byte) error { @@ -73,3 +77,7 @@ func (f *FirefoxExtension) Parse(masterKey []byte) error { func (f *FirefoxExtension) Name() string { return "extension" } + +func (f *FirefoxExtension) Length() int { + return len(*f) +} diff --git a/internal/browingdata/history/history.go b/internal/browingdata/history/history.go index f5fc6bf..2b67e58 100644 --- a/internal/browingdata/history/history.go +++ b/internal/browingdata/history/history.go @@ -65,6 +65,10 @@ func (c *ChromiumHistory) Name() string { return "history" } +func (c *ChromiumHistory) Length() int { + return len(*c) +} + type FirefoxHistory []history const ( @@ -119,3 +123,7 @@ func (f *FirefoxHistory) Parse(masterKey []byte) error { func (f *FirefoxHistory) Name() string { return "history" } + +func (f *FirefoxHistory) Length() int { + return len(*f) +} diff --git a/internal/browingdata/localstorage/localstorage.go b/internal/browingdata/localstorage/localstorage.go index dd34e28..ccd7340 100644 --- a/internal/browingdata/localstorage/localstorage.go +++ b/internal/browingdata/localstorage/localstorage.go @@ -58,6 +58,10 @@ func (c *ChromiumLocalStorage) Name() string { return "localStorage" } +func (c *ChromiumLocalStorage) Length() int { + return len(*c) +} + func (s *storage) fillKey(b []byte) { keys := bytes.Split(b, []byte("\x00")) if len(keys) == 1 && bytes.HasPrefix(keys[0], []byte("META:")) { @@ -142,3 +146,7 @@ func (s *storage) fillFirefox(originKey, key, value string) { func (f *FirefoxLocalStorage) Name() string { return "localStorage" } + +func (f *FirefoxLocalStorage) Length() int { + return len(*f) +} diff --git a/internal/browingdata/outputter.go b/internal/browingdata/outputter.go index 3d80beb..4b2c43c 100644 --- a/internal/browingdata/outputter.go +++ b/internal/browingdata/outputter.go @@ -9,6 +9,8 @@ import ( "github.com/gocarina/gocsv" jsoniter "github.com/json-iterator/go" + "golang.org/x/text/encoding/unicode" + "golang.org/x/text/transform" ) type OutPutter struct { @@ -35,7 +37,7 @@ func (o *OutPutter) Write(data Source, writer io.Writer) error { return encoder.Encode(data) default: gocsv.SetCSVWriter(func(w io.Writer) *gocsv.SafeCSVWriter { - writer := csv.NewWriter(w) + writer := csv.NewWriter(transform.NewWriter(w, unicode.UTF8BOM.NewEncoder())) writer.Comma = ',' return gocsv.NewSafeCSVWriter(writer) }) diff --git a/internal/browingdata/password/password.go b/internal/browingdata/password/password.go index 14c049f..77ea409 100644 --- a/internal/browingdata/password/password.go +++ b/internal/browingdata/password/password.go @@ -90,6 +90,10 @@ func (c *ChromiumPassword) Name() string { return "password" } +func (c *ChromiumPassword) Length() int { + return len(*c) +} + type YandexPassword []loginData const ( @@ -154,6 +158,10 @@ func (c *YandexPassword) Name() string { return "password" } +func (c *YandexPassword) Length() int { + return len(*c) +} + type FirefoxPassword []loginData const ( @@ -224,10 +232,6 @@ func (f *FirefoxPassword) Parse(masterKey []byte) error { return nil } -func (f *FirefoxPassword) Name() string { - return "password" -} - func getFirefoxDecryptKey(key4file string) (item1, item2, a11, a102 []byte, err error) { var keyDB *sql.DB keyDB, err = sql.Open("sqlite3", key4file) @@ -278,3 +282,11 @@ func getFirefoxLoginData(loginJson string) (l []loginData, err error) { } return l, nil } + +func (f *FirefoxPassword) Name() string { + return "password" +} + +func (f *FirefoxPassword) Length() int { + return len(*f) +}