feat: rename item temp filename

This commit is contained in:
ᴍᴏᴏɴD4ʀᴋ
2022-04-11 15:53:19 +08:00
parent 580ff78ad3
commit 46f2610a0a
16 changed files with 413 additions and 421 deletions
+17 -23
View File
@@ -13,16 +13,9 @@ type Browser interface {
GetMasterKey() ([]byte, error)
GetBrowsingData() []browingdata.Source
CopyItemFileToLocal() error
GetBrowsingData() (*browingdata.Data, error)
}
var (
// home dir path for all platforms
homeDir, _ = os.UserHomeDir()
)
func PickBrowser(name string) []Browser {
var browsers []Browser
clist := pickChromium(name)
@@ -45,7 +38,7 @@ func pickChromium(name string) []Browser {
name = strings.ToLower(name)
if name == "all" {
for _, c := range chromiumList {
if b, err := chromium.New(c.name, c.profilePath, c.storage, c.items); err == nil {
if b, err := chromium.New(c.name, c.storage, c.profilePath, c.items); err == nil {
browsers = append(browsers, b)
} else {
if strings.Contains(err.Error(), "profile path is not exist") {
@@ -56,8 +49,8 @@ func pickChromium(name string) []Browser {
}
return browsers
}
if choice, ok := chromiumList[name]; ok {
b, err := newChromium(choice.browserInfo, choice.items)
if c, ok := chromiumList[name]; ok {
b, err := chromium.New(c.name, c.storage, c.profilePath, c.items)
if err != nil {
panic(err)
}
@@ -71,15 +64,15 @@ func pickFirefox(name string) []Browser {
var browsers []Browser
name = strings.ToLower(name)
if name == "all" || name == "firefox" {
for _, f := range firefoxList {
multiFirefox, err := newMultiFirefox(f.browserInfo, f.items)
if err != nil {
panic(err)
}
for _, browser := range multiFirefox {
browsers = append(browsers, browser)
}
}
// for _, f := range firefoxList {
// multiFirefox, err := firefox(f.browserInfo, f.items)
// if err != nil {
// panic(err)
// }
// for _, browser := range multiFirefox {
// browsers = append(browsers, browser)
// }
// }
return browsers
}
return nil
@@ -96,9 +89,10 @@ func ListBrowser() []string {
return l
}
type browserInfo struct {
masterKey []byte
}
var (
// home dir path for all platforms
homeDir, _ = os.UserHomeDir()
)
const (
chromeName = "Chrome"
+89 -71
View File
@@ -4,53 +4,71 @@ import (
"fmt"
"testing"
"hack-browser-data/internal/log"
"hack-browser-data/internal/browser/chromium"
"hack-browser-data/internal/item"
"hack-browser-data/internal/outputter"
)
func TestPickChromium(t *testing.T) {
browsers := pickChromium("chrome")
log.InitLog("debug")
filetype := "json"
dir := "result"
output := outputter.NewOutPutter(filetype)
if err := output.MakeDir("result"); err != nil {
panic(err)
}
for _, b := range browsers {
fmt.Printf("%+v\n", b)
if err := b.CopyItemFileToLocal(); err != nil {
panic(err)
}
masterKey, err := b.GetMasterKey()
if err != nil {
fmt.Println(err)
}
browserName := b.GetName()
multiData := b.GetBrowsingData()
for _, data := range multiData {
if err := data.Parse(masterKey); err != nil {
fmt.Println(err)
}
filename := fmt.Sprintf("%s_%s.%s", browserName, data.Name(), filetype)
file, err := output.CreateFile(dir, filename)
if err != nil {
panic(err)
}
if err := output.Write(data, file); err != nil {
panic(err)
}
}
}
// browsers := pickChromium("chrome")
// log.InitLog("debug")
// filetype := "json"
// // dir := "result"
// output := outputter.NewOutPutter(filetype)
// _ = output
// for _, b := range browsers {
// fmt.Printf("%+v\n", b)
// if err := b.CopyItemFileToLocal(); err != nil {
// panic(err)
// }
// _, err := b.GetMasterKey()
// if err != nil {
// fmt.Println(err)
// }
// // browserName := b.GetName()
// data, err := b.GetBrowsingData()
// fmt.Println(data)
// // for _, data := range multiData {
// // if err := data.Parse(masterKey); err != nil {
// // fmt.Println(err)
// // }
// // filename := fmt.Sprintf("%s_%s.%s", browserName, data.Name(), filetype)
// // file, err := output.CreateFile(dir, filename)
// // if err != nil {
// // panic(err)
// // }
// // if err := output.Write(data, file); err != nil {
// // panic(err)
// // }
// // }
// }
}
func TestGetChromiumItemAbsPath(t *testing.T) {
p := `/Library/Application Support/Google/Chrome/`
s, err := getChromiumItemPath(p, defaultChromiumItems)
p = homeDir + p
c, err := chromium.New("chrome", "Chrome", p, item.DefaultChromium)
if err != nil {
panic(err)
t.Error(err)
}
data, err := c.GetBrowsingData()
if err != nil {
t.Error(err)
}
output := outputter.NewOutPutter("json")
if err != nil {
t.Error(err)
}
for _, v := range data.Sources {
f, err := output.CreateFile("result", v.Name()+".json")
if err != nil {
panic(err)
}
if err := output.Write(v, f); err != nil {
panic(err)
}
}
fmt.Println(s)
}
func TestPickBrowsers(t *testing.T) {
@@ -63,37 +81,37 @@ func TestPickBrowsers(t *testing.T) {
// output := outputter.NewOutPutter(filetype)
}
func TestPickFirefox(t *testing.T) {
browsers := pickFirefox("all")
filetype := "json"
dir := "result"
output := outputter.NewOutPutter(filetype)
if err := output.MakeDir("result"); err != nil {
panic(err)
}
for _, b := range browsers {
fmt.Printf("%+v\n", b)
if err := b.CopyItemFileToLocal(); err != nil {
panic(err)
}
masterKey, err := b.GetMasterKey()
if err != nil {
fmt.Println(err)
}
browserName := b.GetName()
multiData := b.GetBrowsingData()
for _, data := range multiData {
if err := data.Parse(masterKey); err != nil {
fmt.Println(err)
}
filename := fmt.Sprintf("%s_%s.%s", browserName, data.Name(), filetype)
file, err := output.CreateFile(dir, filename)
if err != nil {
panic(err)
}
if err := output.Write(data, file); err != nil {
panic(err)
}
}
}
}
// func TestPickFirefox(t *testing.T) {
// browsers := pickFirefox("all")
// filetype := "json"
// dir := "result"
// output := outputter.NewOutPutter(filetype)
// if err := output.MakeDir("result"); err != nil {
// panic(err)
// }
// for _, b := range browsers {
// fmt.Printf("%+v\n", b)
// if err := b.CopyItemFileToLocal(); err != nil {
// panic(err)
// }
// masterKey, err := b.GetMasterKey()
// if err != nil {
// fmt.Println(err)
// }
// browserName := b.GetName()
// multiData := b.GetBrowsingData()
// for _, data := range multiData {
// if err := data.Parse(masterKey); err != nil {
// fmt.Println(err)
// }
// filename := fmt.Sprintf("%s_%s.%s", browserName, data.Name(), filetype)
// file, err := output.CreateFile(dir, filename)
// if err != nil {
// panic(err)
// }
// if err := output.Write(data, file); err != nil {
// panic(err)
// }
// }
// }
// }
+38 -38
View File
@@ -22,65 +22,65 @@ type chromium struct {
itemPaths map[item.Item]string
}
// New creates a new instance of chromium browser, fill item's path if item is exist.
// New create instance of chromium browser, fill item's path if item is existed.
func New(name, storage, profilePath string, items []item.Item) (*chromium, error) {
c := &chromium{
name: name,
storage: storage,
}
// TODO: Handle file path is not exist
if !fileutil.FolderExists(profilePath) {
return nil, fmt.Errorf("%s profile path is not exist: %s", name, profilePath)
}
itemsPaths, err := getChromiumItemPath(profilePath, items)
masterKey, err := c.GetMasterKey()
if err != nil {
return nil, err
}
c := &chromium{
name: name,
storage: storage,
profilePath: profilePath,
items: typeutil.Keys(itemsPaths),
itemPaths: itemsPaths,
itemsPaths, err := c.getItemPath(profilePath, items)
if err != nil {
return nil, err
}
// new browsing data
c.masterKey = masterKey
c.profilePath = profilePath
c.itemPaths = itemsPaths
c.items = typeutil.Keys(itemsPaths)
return c, err
}
func (c *chromium) GetItems() []item.Item {
return c.items
}
func (c *chromium) GetItemPaths() map[item.Item]string {
return c.itemPaths
}
func (c *chromium) GetName() string {
return c.name
}
func (c *chromium) GetBrowsingData() []browingdata.Source {
var browsingData []browingdata.Source
data := browingdata.New(c.items)
for item := range c.itemPaths {
d := item.NewBrowsingData()
if d != nil {
browsingData = append(browsingData, d)
}
func (c *chromium) GetBrowsingData() (*browingdata.Data, error) {
b := browingdata.New(c.items)
if err := c.copyItemToLocal(); err != nil {
return nil, err
}
return browsingData
if err := b.Recovery(c.masterKey); err != nil {
return nil, err
}
return b, nil
}
func (c *chromium) CopyItemFileToLocal() error {
for item, sourcePath := range c.itemPaths {
var dstFilename = item.TempName()
locals, _ := filepath.Glob("*")
for _, v := range locals {
if v == dstFilename {
err := os.Remove(dstFilename)
// TODO: Should Continue all iteration error
if err != nil {
return err
}
}
}
func (c *chromium) copyItemToLocal() error {
for i, path := range c.itemPaths {
// var dstFilename = item.TempName()
var filename = i.String()
// TODO: Handle read file error
sourceFile, err := ioutil.ReadFile(sourcePath)
d, err := ioutil.ReadFile(path)
if err != nil {
fmt.Println(err.Error())
}
err = ioutil.WriteFile(dstFilename, sourceFile, 0777)
err = ioutil.WriteFile(filename, d, 0777)
if err != nil {
return err
}
@@ -88,7 +88,7 @@ func (c *chromium) CopyItemFileToLocal() error {
return nil
}
func getChromiumItemPath(profilePath string, items []item.Item) (map[item.Item]string, error) {
func (c *chromium) getItemPath(profilePath string, items []item.Item) (map[item.Item]string, error) {
var itemPaths = make(map[item.Item]string)
err := filepath.Walk(profilePath, chromiumWalkFunc(items, itemPaths))
return itemPaths, err
@@ -102,7 +102,7 @@ func chromiumWalkFunc(items []item.Item, itemPaths map[item.Item]string) filepat
if it == item.ChromiumKey {
itemPaths[it] = path
}
// TODO: Handle file path is not in Default folder
// TODO: check file path is not in Default folder
if strings.Contains(path, "Default") {
itemPaths[it] = path
}
+5 -6
View File
@@ -29,17 +29,16 @@ func (c *chromium) GetMasterKey() ([]byte, error) {
if stderr.Len() > 0 {
return nil, errors.New(stderr.String())
}
temp := stdout.Bytes()
chromeSecret := temp[:len(temp)-1]
chromeSecret := bytes.TrimSpace(stdout.Bytes())
if chromeSecret == nil {
return nil, ErrWrongSecurityCommand
}
var 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 {
c.browserInfo.masterKey = key
return key, nil
if key == nil {
return nil, ErrWrongSecurityCommand
}
return nil, errors.New("macOS wrong security command")
c.masterKey = key
return key, nil
}
@@ -4,8 +4,11 @@ import (
"encoding/base64"
"errors"
"github.com/smallstep/cli/utils"
"github.com/tidwall/gjson"
"hack-browser-data/internal/decrypter"
"hack-browser-data/internal/item"
"hack-browser-data/internal/utils/fileutil"
)
var (
@@ -13,7 +16,7 @@ var (
)
func (c *chromium) GetMasterKey() ([]byte, error) {
keyFile, err := utils.ReadFile(item.TempChromiumKey)
keyFile, err := fileutil.ReadFile(item.TempChromiumKey)
if err != nil {
return nil, err
}
@@ -23,8 +26,8 @@ func (c *chromium) GetMasterKey() ([]byte, error) {
if err != nil {
return nil, errDecodeMasterKeyFailed
}
c.browserInfo.masterKey, err = decrypter.DPApi(pureKey[5:])
return c.browserInfo.masterKey, err
c.masterKey, err = decrypter.DPApi(pureKey[5:])
return c.masterKey, err
}
return nil, nil
}
+114 -127
View File
@@ -1,129 +1,116 @@
package firefox
import (
"fmt"
"io/fs"
"io/ioutil"
"os"
"path"
"path/filepath"
"strings"
"hack-browser-data/internal/browingdata"
"hack-browser-data/internal/item"
)
type firefox struct {
name string
storage string
profilePath string
masterKey []byte
items []item.Item
itemPaths map[item.Item]string
multiItemPaths map[string]map[item.Item]string
}
// New
func New(info *browserInfo, items []item.Item) ([]*firefox, error) {
f := &firefox{
browserInfo: info,
items: items,
}
multiItemPaths, err := getFirefoxItemAbsPath(f.browserInfo.profilePath, f.items)
if err != nil {
if strings.Contains(err.Error(), "profile path is not exist") {
fmt.Println(err)
return nil, nil
}
panic(err)
}
var firefoxList []*firefox
for name, value := range multiItemPaths {
firefoxList = append(firefoxList, &firefox{
browserInfo: &browserInfo{
name: name,
masterKey: nil,
},
items: items,
itemPaths: value,
})
}
return firefoxList, nil
}
func getFirefoxItemAbsPath(profilePath string, items []item.Item) (map[string]map[item.Item]string, error) {
var multiItemPaths = make(map[string]map[item.Item]string)
absProfilePath := path.Join(homeDir, filepath.Clean(profilePath))
// TODO: Handle read file error
if !isFileExist(absProfilePath) {
return nil, fmt.Errorf("%s profile path is not exist", absProfilePath)
}
err := filepath.Walk(absProfilePath, firefoxWalkFunc(items, multiItemPaths))
return multiItemPaths, err
}
func (f *firefox) CopyItemFileToLocal() error {
for item, sourcePath := range f.itemPaths {
var dstFilename = item.TempName()
locals, _ := filepath.Glob("*")
for _, v := range locals {
if v == dstFilename {
err := os.Remove(dstFilename)
// TODO: Should Continue all iteration error
if err != nil {
return err
}
}
}
// TODO: Handle read file name error
sourceFile, err := ioutil.ReadFile(sourcePath)
if err != nil {
fmt.Println(err.Error())
}
err = ioutil.WriteFile(dstFilename, sourceFile, 0777)
if err != nil {
return err
}
}
return nil
}
func firefoxWalkFunc(items []item.Item, multiItemPaths map[string]map[item.Item]string) filepath.WalkFunc {
return func(path string, info fs.FileInfo, err error) error {
for _, v := range items {
if info.Name() == v.FileName() {
parentDir := getParentDir(path)
if _, exist := multiItemPaths[parentDir]; exist {
multiItemPaths[parentDir][v] = path
} else {
multiItemPaths[parentDir] = map[item.Item]string{v: path}
}
}
}
return err
}
}
func getParentDir(absPath string) string {
return filepath.Base(filepath.Dir(absPath))
}
func (f *firefox) GetMasterKey() ([]byte, error) {
return f.masterKey, nil
}
func (f *firefox) GetName() string {
return f.name
}
func (f *firefox) GetBrowsingData() []browingdata.Source {
var browsingData []browingdata.Source
for item := range f.itemPaths {
d := item.NewBrowsingData()
if d != nil {
browsingData = append(browsingData, d)
}
}
return browsingData
}
// type firefox struct {
// name string
// storage string
// profilePath string
// masterKey []byte
// items []item.Item
// itemPaths map[item.Item]string
// multiItemPaths map[string]map[item.Item]string
// }
//
// // New
// func New(info *browserInfo, items []item.Item) ([]*firefox, error) {
// f := &firefox{
// browserInfo: info,
// items: items,
// }
// multiItemPaths, err := getFirefoxItemAbsPath(f.browserInfo.profilePath, f.items)
// if err != nil {
// if strings.Contains(err.Error(), "profile path is not exist") {
// fmt.Println(err)
// return nil, nil
// }
// panic(err)
// }
// var firefoxList []*firefox
// for name, value := range multiItemPaths {
// firefoxList = append(firefoxList, &firefox{
// browserInfo: &browserInfo{
// name: name,
// masterKey: nil,
// },
// items: items,
// itemPaths: value,
// })
// }
// return firefoxList, nil
// }
//
// func getFirefoxItemAbsPath(profilePath string, items []item.Item) (map[string]map[item.Item]string, error) {
// var multiItemPaths = make(map[string]map[item.Item]string)
// absProfilePath := path.Join(homeDir, filepath.Clean(profilePath))
// // TODO: Handle read file error
// if !isFileExist(absProfilePath) {
// return nil, fmt.Errorf("%s profile path is not exist", absProfilePath)
// }
// err := filepath.Walk(absProfilePath, firefoxWalkFunc(items, multiItemPaths))
// return multiItemPaths, err
// }
//
// func (f *firefox) CopyItemFileToLocal() error {
// for item, sourcePath := range f.itemPaths {
// var dstFilename = item.TempName()
// locals, _ := filepath.Glob("*")
// for _, v := range locals {
// if v == dstFilename {
// err := os.Remove(dstFilename)
// // TODO: Should Continue all iteration error
// if err != nil {
// return err
// }
// }
// }
//
// // TODO: Handle read file name error
// sourceFile, err := ioutil.ReadFile(sourcePath)
// if err != nil {
// fmt.Println(err.Error())
// }
// err = ioutil.WriteFile(dstFilename, sourceFile, 0777)
// if err != nil {
// return err
// }
// }
// return nil
// }
//
// func firefoxWalkFunc(items []item.Item, multiItemPaths map[string]map[item.Item]string) filepath.WalkFunc {
// return func(path string, info fs.FileInfo, err error) error {
// for _, v := range items {
// if info.Name() == v.FileName() {
// parentDir := getParentDir(path)
// if _, exist := multiItemPaths[parentDir]; exist {
// multiItemPaths[parentDir][v] = path
// } else {
// multiItemPaths[parentDir] = map[item.Item]string{v: path}
// }
// }
// }
// return err
// }
// }
//
// func getParentDir(absPath string) string {
// return filepath.Base(filepath.Dir(absPath))
// }
//
// func (f *firefox) GetMasterKey() ([]byte, error) {
// return f.masterKey, nil
// }
//
// func (f *firefox) GetName() string {
// return f.name
// }
//
// func (f *firefox) GetBrowsingData() []browingdata.Source {
// var browsingData []browingdata.Source
// for item := range f.itemPaths {
// d := item.NewBrowsingData()
// if d != nil {
// browsingData = append(browsingData, d)
// }
// }
// return browsingData
// }