package browingdata import ( "database/sql" "os" "sort" _ "github.com/mattn/go-sqlite3" "hack-browser-data/internal/decrypter" "hack-browser-data/internal/item" "hack-browser-data/internal/log" "hack-browser-data/internal/utils/typeutil" ) type ChromiumCookie []cookie func (c *ChromiumCookie) Parse(masterKey []byte) error { cookieDB, err := sql.Open("sqlite3", item.TempChromiumCookie) if err != nil { return err } defer os.Remove(item.TempChromiumCookie) defer cookieDB.Close() rows, err := cookieDB.Query(queryChromiumCookie) if err != nil { return err } defer rows.Close() for rows.Next() { var ( key, host, path string isSecure, isHTTPOnly, hasExpire, isPersistent int createDate, expireDate int64 value, encryptValue []byte ) if err = rows.Scan(&key, &encryptValue, &host, &path, &createDate, &expireDate, &isSecure, &isHTTPOnly, &hasExpire, &isPersistent); err != nil { log.Warn(err) } cookie := cookie{ KeyName: key, Host: host, Path: path, encryptValue: encryptValue, IsSecure: typeutil.IntToBool(isSecure), IsHTTPOnly: typeutil.IntToBool(isHTTPOnly), HasExpire: typeutil.IntToBool(hasExpire), IsPersistent: typeutil.IntToBool(isPersistent), CreateDate: typeutil.TimeEpoch(createDate), ExpireDate: typeutil.TimeEpoch(expireDate), } // TODO: replace DPAPI if len(encryptValue) > 0 { var err error if masterKey == nil { value, err = decrypter.DPApi(encryptValue) } else { value, err = decrypter.ChromePass(masterKey, encryptValue) } if err != nil { log.Error(err) } } cookie.Value = string(value) *c = append(*c, cookie) } sort.Slice(*c, func(i, j int) bool { return (*c)[i].CreateDate.After((*c)[j].CreateDate) }) return nil } func (c *ChromiumCookie) Name() string { return "cookie" } type FirefoxCookie []cookie func (f *FirefoxCookie) Parse(masterKey []byte) error { cookieDB, err := sql.Open("sqlite3", item.TempFirefoxCookie) if err != nil { return err } defer os.Remove(item.TempFirefoxCookie) defer cookieDB.Close() rows, err := cookieDB.Query(queryFirefoxCookie) if err != nil { return err } defer rows.Close() for rows.Next() { var ( name, value, host, path string isSecure, isHttpOnly int creationTime, expiry int64 ) if err = rows.Scan(&name, &value, &host, &path, &creationTime, &expiry, &isSecure, &isHttpOnly); err != nil { log.Warn(err) } *f = append(*f, cookie{ KeyName: name, Host: host, Path: path, IsSecure: typeutil.IntToBool(isSecure), IsHTTPOnly: typeutil.IntToBool(isHttpOnly), CreateDate: typeutil.TimeStamp(creationTime / 1000000), ExpireDate: typeutil.TimeStamp(expiry), Value: value, }) } return nil } func (f *FirefoxCookie) Name() string { return "cookie" }