鱼C论坛

 找回密码
 立即注册
查看: 1280|回复: 1

[学习笔记] golang读取chrome/edge浏览器本地cookies数据库

[复制链接]
发表于 2022-12-20 22:56:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 cflying 于 2022-12-21 20:14 编辑

去爬个资料,登录验证太麻烦,不如本地浏览器登录后读取cookies直接爬来的方便,本来打算网上找一个现成的代码来读取浏览器cookies数据库,结果度娘半天竟然没有(网上全都是python的,偶尔有个读保存账号和密码的,结果N年前的解密方式还没更新),要不就只有去仓库下,感觉有点小题大做了,所以不如拿python的改一个单文件的,这样使用起来一个文件带到哪都方便。

  1. package main

  2. import (
  3.         "database/sql"
  4.         "fmt"
  5.         "os"
  6.         "io/ioutil"
  7.         "encoding/json"
  8.         "encoding/base64"
  9.         "syscall"
  10.         "unsafe"
  11.         "crypto/aes"
  12.         "crypto/cipher"
  13.         _ "github.com/mattn/go-sqlite3"
  14. )


  15. type DATA_BLOB struct {
  16.         cbData uint32
  17.         pbData *byte
  18. }
  19. func NewBlob(d []byte) *DATA_BLOB {
  20.         if len(d)==0 {
  21.                 return &DATA_BLOB{}
  22.         }
  23.         b:=&DATA_BLOB{
  24.         pbData:&d[0],
  25.         cbData:uint32(len(d)),
  26.         }
  27.         
  28.         return b
  29. }
  30. func (b *DATA_BLOB) ToByteArray() []byte {
  31.         d:=make([]byte, b.cbData)
  32.         copy(d, (*[1 << 30]byte)(unsafe.Pointer(b.pbData))[:])
  33.         return d
  34. }

  35. func dpapi_decrypt(encrypted []byte)([]byte, error){
  36.         dllcrypt32:=syscall.NewLazyDLL("Crypt32.dll")
  37.         dllkernel32:=syscall.NewLazyDLL("Kernel32.dll")

  38.         procDecryptData:=dllcrypt32.NewProc("CryptUnprotectData")
  39.         procLocalFree:=dllkernel32.NewProc("LocalFree")
  40.         var outblob DATA_BLOB
  41.         r,_,err:=procDecryptData.Call(uintptr(unsafe.Pointer(NewBlob(encrypted))), 0, 0, 0, 0,0x1, uintptr(unsafe.Pointer(&outblob)))
  42.         if r==0 {
  43.                 return nil, err        
  44.         }
  45.         defer procLocalFree.Call(uintptr(unsafe.Pointer(outblob.pbData)))
  46.         return outblob.ToByteArray(), err
  47. }


  48. func aesGCMDecrypt(data []byte, key []byte, iv []byte) []byte {
  49.         block,_:=aes.NewCipher(key)
  50.         aesGcm,_:=cipher.NewGCM(block)
  51.         plaintext,_:=aesGcm.Open(nil,iv,data, nil)
  52.         return plaintext
  53. }

  54. func aes_decrypt(encrypted_txt string)([]byte,){
  55.         key_file,_:=os.OpenFile(os.Getenv("LOCALAPPDATA")+ "\\Microsoft\\Edge\\User Data\\Local State",os.O_RDONLY,os.ModePerm)
  56.         defer key_file.Close()
  57.         key_data,_:=ioutil.ReadAll(key_file)

  58.         dynamic:=make(map[string]interface{})
  59.         json.Unmarshal([]byte(string(key_data)),&dynamic)
  60.         encrypted_key,_:=base64.StdEncoding.DecodeString(dynamic["os_crypt"].(map[string]interface{})["encrypted_key"].(string))
  61.         encrypted_key=encrypted_key[5:]//去掉DPAPI后的加密key
  62.         key,_:=dpapi_decrypt(encrypted_key)//解密后的key
  63.         nonce:=encrypted_txt[3:15]//AES随机12位vi
  64.         decryptor:=aesGCMDecrypt([]byte(encrypted_txt[15:]),key,[]byte(nonce))
  65.         return decryptor
  66. }

  67. /*前缀处理*/
  68. func chrome_decrypt (encrypted_txt string)[]byte{
  69.         var decrypted_txt []byte
  70.         if encrypted_txt[:3]=="v10"{
  71.                 decrypted_txt=aes_decrypt(encrypted_txt)
  72.         }
  73.         if encrypted_txt[:4]=="DPAP"{
  74.                 decrypted_txt,_=dpapi_decrypt([]byte(encrypted_txt))
  75.         }
  76.         return decrypted_txt
  77. }


  78. func get_cookies_from_chrome(domain string)([]map[string]string){
  79.         query:=`SELECT name, encrypted_value as value,host_key as domain, path FROM cookies where host_key like `+`"%`+domain+`%"`
  80.         fmt.Println(query)
  81.         var file string
  82.         if _,err:=os.Stat(os.Getenv("LOCALAPPDATA")+"\\Microsoft\\Edge\\User Data\\Default\\Network\\Cookies");err==nil{
  83.                 file=os.Getenv("LOCALAPPDATA")+"\\Microsoft\\Edge\\User Data\\Default\\Network\\Cookies"
  84.         }else if _,err:=os.Stat(os.Getenv("LOCALAPPDATA")+"\\Microsoft\\Edge\\User Data\\Profile 3\\Network\\Cookies");err==nil{
  85.                 file=os.Getenv("LOCALAPPDATA")+"\\Microsoft\\Edge\\User Data\\Profile 3\\Network\\Cookies"
  86.         }
  87.        
  88.         fmt.Println(file)
  89.         db,_:= sql.Open("sqlite3", file)
  90.         defer db.Close()
  91.         rows,_:= db.Query(query)
  92.         defer rows.Close()
  93.         var cookies []map[string]string
  94.         for rows.Next() {
  95.         var name,value,domain,path string
  96.         rows.Scan(&name, &value, &domain, &path)        
  97.         if name != "" && value != ""{
  98.                 cc_data_tmp:=make(map[string]string)
  99.                 cc_data_tmp["name"]=name
  100.                 cc_data_tmp["vlaue"]=string(chrome_decrypt(value))
  101.                 cc_data_tmp["doamin"]=domain
  102.                 cc_data_tmp["path"]=path
  103.                 cookies=append(cookies,cc_data_tmp)
  104.         }               
  105. }

  106.        
  107.         return cookies
  108. }

  109. func main() {
  110.         //fmt.Println(get_cookies_from_chrome(".hao123.com")[0]["vlaue"])
  111.         for _,v:=range get_cookies_from_chrome(".hao123.com"){
  112.                 fmt.Println(v)
  113.         }

  114. }
复制代码

评分

参与人数 1贡献 +2 收起 理由
sfqxx + 2 鱼C有你更精彩^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-5-21 17:39:44 | 显示全部楼层
一看就是个高手
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-27 17:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表