golang 读取 chrome保存的网站账号信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
package main
 
import (
    "database/sql"
    "fmt"
    "log"
    "os"
    "syscall"
    "unsafe"
 
    sqlite3 "github.com/ccpaging/go-sqlite3-windll"
)
 
const (
    CRYPTPROTECT_UI_FORBIDDEN = 0x1
)
 
var (
    dllcrypt32  = syscall.NewLazyDLL("Crypt32.dll")
    dllkernel32 = syscall.NewLazyDLL("Kernel32.dll")
 
    procDecryptData = dllcrypt32.NewProc("CryptUnprotectData")
    procLocalFree   = dllkernel32.NewProc("LocalFree")
)
 
func main() {
    log.Printf("Is Windows 64: %v\n", sqlite3.SQLiteWin64)
 
    file := os.Getenv("LOCALAPPDATA")
    file += "\\Google\\Chrome\\User Data\\Default\\"
    file += "Login Data"
 
    db, err := sql.Open("sqlite3", file)
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()
 
    rows, err := db.Query("select origin_url,username_value,password_value from logins")
    if err != nil {
        log.Fatal(err)
    }
    defer rows.Close()
    for rows.Next() {
        var origin_url, username, passwdEncrypt string
        err = rows.Scan(&origin_url, &username, &passwdEncrypt)
        if err != nil {
            log.Fatal(err)
        }
        passwdByte := []byte(passwdEncrypt)
        dataout, _ := Decrypt(passwdByte)
        if username != "" && passwdEncrypt != "" {
            fmt.Println(origin_url, username, string(dataout[:]))
        }
    }
    err = rows.Err()
    if err != nil {
        log.Fatal(err)
    }
}
 
type DATA_BLOB struct {
    cbData uint32
    pbData *byte
}
 
func NewBlob(d []byte) *DATA_BLOB {
    if len(d) == 0 {
        return &DATA_BLOB{}
    }
    return &DATA_BLOB{
        pbData: &d[0],
        cbData: uint32(len(d)),
    }
}
 
func (b *DATA_BLOB) ToByteArray() []byte {
    d := make([]byte, b.cbData)
    copy(d, (*[1 << 30]byte)(unsafe.Pointer(b.pbData))[:])
    return d
}
 
func Decrypt(data []byte) ([]byte, error) {
    var outblob DATA_BLOB
    r, _, err := procDecryptData.Call(uintptr(unsafe.Pointer(NewBlob(data))), 0, 0, 0, 0, CRYPTPROTECT_UI_FORBIDDEN, uintptr(unsafe.Pointer(&outblob)))
    if r == 0 {
        return nil, err
    }
    defer procLocalFree.Call(uintptr(unsafe.Pointer(outblob.pbData)))
    return outblob.ToByteArray(), nil
}

  

知识点:

golang读取sqlite3数据库

golang调用dll

 

参考链接:

https://github.com/iamacarpet/go-sqlite3-win64

https://github.com/ccpaging/go-sqlite3-windll

https://play.golang.org/p/fknP9AuLU-

posted @   sherlock-merlin  阅读(550)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示