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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架