chrome cookies cookie 解密 写入(80+版本)

2023-05-16

一,历史变迁

80之前,解密:win32crypt.CryptUnprotectData(encrypted_value_bytes,None,None,None,0)[1],老文N多,自行搜索。

80开始,改了:https://github.com/chromium/chromium/blob/master/components/os_crypt/os_crypt_win.cc

AESGCM加密cookie明文

def EncryptString(key,plaintext):
    plainbytes=plaintext.encode('utf-8')
    nonce=os.urandom(12)
    aesgcm=AESGCM(key)
    cipherbytes=aesgcm.encrypt(nonce,plainbytes,None)
    data=b'v10'+nonce+cipherbytes
    #也有v11的,反正就前3字节,无影响
    return data

AESGCM的key是这么生成的:(1)随机32字节DPAPI加密(2)5字节b’DPAPI’头(3)base64编码

def generate_a_new_key():
    key=os.urandom(32)
    encrypted_key=win32crypt.CryptProtectData(key,None,None,None,None,0)
    encrypted_key_with_header=b'DPAPI'+encrypted_key
    base64_encrypted_key=base64.b64encode(encrypted_key_with_header)
    return base64_encrypted_key

二,读取解密

因此,解密就是:(1)读取数据库里的密文(字节)(2)AESGCM解密。两个路径:

Cookies文件(sqlite3 db,储存网站的cookies)
在这里插入图片描述
Local State文件(json,储存各种,key也在其中)在这里插入图片描述
python读取解密

# -*- coding=utf-8 -*-
import os
import json
import base64
import sqlite3
import win32crypt
from cryptography.hazmat.primitives.ciphers.aead import AESGCM

#读取chrome保存在json文件中的key(str)
def GetString(LocalState):
    with open(LocalState,'r',encoding='utf-8') as f:
        s=json.load(f)['os_crypt']['encrypted_key']
    return s

#base64解码,DPAPI解密,得到真实的AESGCM key(bytes)
def pull_the_key(base64_encrypted_key):
    encrypted_key_with_header=base64.b64decode(base64_encrypted_key)
    encrypted_key=encrypted_key_with_header[5:]
    key=win32crypt.CryptUnprotectData(encrypted_key,None,None,None,0)[1]
    return key

#AESGCM解密
def DecryptString(key,data):
    nonce,cipherbytes=data[3:15],data[15:]
    aesgcm=AESGCM(key)
    plainbytes=aesgcm.decrypt(nonce,cipherbytes,None)
    plaintext=plainbytes.decode('utf-8')
    return plaintext

if __name__ == '__main__':

    UserDataDir=os.environ['LOCALAPPDATA']+r'\Google\Chrome\User Data'
    LocalStateFilePath=UserDataDir+r'\Local State'
    CookiesFilePath=UserDataDir+r'\Default\Cookies'
    #反正就是上面图片中的两个文件名的路径
    #默认路径可能随着版本有所变化,找一找

    con=sqlite3.connect(CookiesFilePath)
    #con.text_factory = bytes
    res=con.execute('select host_key,name,encrypted_value from cookies').fetchall()
    con.close()
    #此处encrypted_value在sqlite中声明的是BLOB,官方sqlite库应该读进来就是bytes。
    #评论有反应utf-8 decode错误的,显然把自动类型转化成了TEXT,多整了一次decode()
    #最新sqlite dll没这问题,还支持json,,,还在用3.7左右python的建议更新一波
    
    key=pull_the_key(GetString(LocalStateFilePath))
    for i in res:
    	print(i[0],i[1],DecryptString(key,i[2])

(这个更新一波,使用sqlites3官网的最新版本,毫无问题,一亿条记录,测试验证,,,)
在这里插入图片描述

三,构造回写

在这里插入图片描述(chrome 93 cookies sqlite db)

能少就少,写入10个必须字段就够了。说法比较天花乱坠的似乎就是这个三个’时间戳‘:creation_utc,expires_utc,last_access_utc,

百度了一下(其实百度不到的,全是营销号,知道,贴吧,,,github,stack,google了一下),好像这个说法,比较准确:

windows上,chrome采用的是:Windows file time,这个东东和日常unix时间戳两个区别:

(1)起点。1601 年1 月1 日 午夜12点(utc) vs 1970年1月1日午夜12点(utc)(2)精度。 ‘微妙’ vs ‘秒’

(https://docs.microsoft.com/en-us/dotnet/api/system.datetime.tofiletimeutc?view=net-5.0)

def ToFileTimeUtc(isostr=''):
    from datetime import datetime,timedelta,timezone
    if isostr:
        l=[int(i) for i in isostr.split(' ')[0].split('-')]+[int(i) for i in isostr.split(' ')[-1].split(':')]
        end=datetime(*l,tzinfo=timezone.utc)
    else:
        end=datetime.now(timezone.utc)
    start=datetime(1601,1,1,tzinfo=timezone.utc)
    return int((end-start)/timedelta(microseconds=1))

def FromFileTimeUtc(microseconds,local=False):
    from datetime import datetime,timedelta,timezone
    d=datetime(1601,1,1,tzinfo=timezone.utc)+timedelta(microseconds=microseconds)
    if local:
        return time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(d.timestamp()))
    else:
        return time.strftime('%Y-%m-%d %H:%M:%S',time.gmtime(d.timestamp()))

print(ToFileTimeUtc('2099-01-01 00:00:00'))
print(FromFileTimeUtc(ToFileTimeUtc()))

def one_cookie_for_chrome_sqlite(DOMAIN,NAME,VALUE):
    return dict(
    creation_utc=ToFileTimeUtc(),
    host_key=DOMAIN,
    name=NAME,
    value='',#现在使用了下面的encrypted_value了,对应VALUE
    path='/',
    expires_utc=ToFileTimeUtc('2099-01-01 00:00:00'),#随便写未来时间,服务器自有判断,不会以此为准.别写过去,浏览器给删了
    is_secure=0,
    is_httponly=0,
    last_access_utc=ToFileTimeUtc(),#显然最后访问时间,应该大于等于创建时间
    encrypted_value=EncryptString(key,VALUE)#上面的加密函数
    ).values()

四,其他杂项

chrome两个默认相关路径,随着版本有所变动,直接新建桌面快捷方式采用–user-data-dir启动参数:

"C:\Program Files\Google\Chrome\Application\chrome.exe" --user-data-dir="C:\mychrome"

这个mychrome文件夹结构,还是符合传统的。

2021-09-05更新

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

chrome cookies cookie 解密 写入(80+版本) 的相关文章

随机推荐

  • ctags使用教程

    Ctags ctags在http ctags sourceforge net 下载源码 xff0c 编译后安装 常规的标记命令为 ctags R 34 R 34 表示递归创建 xff0c 也就包括源代码根目录下的所有子目录下的源程序 绝大多
  • 线程池(阻塞队列,生产者消费者模式)

    线程的等待和通知 Object类中有些方法不可随便调用 wait notify notifyAll 这三个方法 xff1a 1 wait 使线程主动释放锁 xff0c 进入等待状态 xff0c 直到他被其他的线程通过 notify 和 no
  • ubuntu18.04开机后无法进入系统问题的解决方法

    解决方法ubuntu18 04开机时无法进入系统的问题 问题描述 xff1a 出现这种错误的原因是安装了nvidia smi安装包 xff0c Ubuntu18 04内核bug导致gdm3和nvidia驱动冲突 xff0c 使得gdm3无法
  • 解决安装软件包时出现E:无法定位的问题

    第一种情况 xff1a 在确定网络连接和质量没问题的情况下 xff0c 任何软件都无法安装 xff0c 出现E 无法定位XXX 解决 xff1a 换源 具体步骤 xff1a 1 备份 etc apt sources list 文件 执行命令
  • 初次入职,git使用教程:如何在idea使用git拉取代码,提交代码,以及在gitlab上发起合并请求

    git的使用相信是很多刚踏入程序员这一行朋友的痛点 xff0c 刚入职的一段时间非常担心git用错 xff0c 把别人的代码覆盖掉 xff0c 下面我详细介绍一下如何在idea上使用git xff0c 拉取 xff0c 提交代码 xff0c
  • nginx配置反向代理

    因为项目会根据生成一个URL 那个URL需要挂在移动端APP上 xff0c 但该项目需要部署在公司内网 xff0c 公司内网不能全外网开放 xff0c 所以需要经过nginx配置反向代理来跳转 文章目录 前言一 pandas是什么 xff1
  • 张筱雨履历

    自出道以来便以清纯可爱风格 席卷全球 幽雅的姿态 迷人的身姿 无不透露出深刻内涵的底蕴 被誉为中国第一 姓名 xff1a 张筱雨 出生日期 xff1a 1985年06月06日 职业 xff1a 模特 性别 xff1a 女性 籍贯 xff1a
  • Hystrix总结

    Hystrix是什么 xff1f Hystrix 能使你的系统在出现依赖服务失效的时候 xff0c 通过隔离系统所依赖的服务 xff0c 防止服务级联失败 xff0c 同时提供失败回退机制 xff0c 更优雅地应对失效 xff0c 并使你的
  • python爬取京东商品信息及评论

    准备 chrome浏览器 和 chromeDriver插件 xff08 其他浏览器步骤类似 xff09 python 环境python selenium模块 代码 span class token triple quoted string
  • 错误:端口被占用解决办法

    1 首先打开cmd xff0c 输入以下命令netstat ano xff0c 这是在查看所有端口 2 会列出以下端口 这里根据你的占用窗口找到他的PID xff0c 我这里占用的是1080 xff0c 可以看到他的PID是10512 3
  • 在RuoYi-Cloud若依系统的环境部署的建议及总结

    RuoYi Cloud若依系统的环境部署 为了开发项目 xff0c 使用了RuoYi Cloud系统 xff0c 在前期需要搭建好相应的环境 xff0c 然后再进行实际开发 下面是综合 RuoYi 官方在线文档的相应介绍及自己在搭建中的步骤
  • (第二版)亿级流量电商详情页系统实战-缓存架构+高可用服务架构+微服务架构+课件

    第1节课程介绍以及高并发高可用复杂系统中的缓存架构有哪些东西 第2节基于大型电商网站中的商品详情页系统贯穿的授课思路介绍 免费观看 7分钟 第3节小型电商网站的商品详情页的页面静态化架构以及其缺陷11分钟 第4节大型电商网站的异步多级缓存构
  • 解决idea报错 “cannot access class“ 同一包下Java代码飘红

    解决idea报错 cannot access class 同一包下Java代码飘红 遇到的问题 xff1a 同一个包下的java代码 xff0c 突然飘红 xff0c 出现红色的波浪下划线 xff0c 错误提示 xff1a cannot a
  • Spring Cloud Alibaba微服务实战笔记之微服务架构篇

    目录 xff1a 一 微服务介绍 二 微服务架构的常见问题 三 微服务架构的常见概念 四 微服务架构的常见解决方案 概述 xff1a 俗话说 xff0c 兵马未动 xff0c 粮草先行 xff0c 只有更好的理解什么是微服务 xff0c 才
  • 主流微服务技术栈Spring Cloud Alibaba

    目录 xff1a 一 国内主流微服务技术栈 二 Spring Cloud Alibaba介绍 三 总结 一 国内主流微服务技术栈 之前有段时间阿里开源的dubbo处于不怎么维护的阶段 xff0c 正好这段时间Spring cloud完善的技
  • 项目实战Dubbo Spring Cloud 并使用Nacos实现注册中心

    搞了大半天 xff0c 终于趟平了 本文中主要是基于Dubbo实现了服务提供和调用的demo xff0c 并接入Nacos注册中心 Dubbo Spring Cloud 是Spring Cloud Alibaba 的核心组件 xff0c 它
  • Dubbo高级应用事件之集群容错

    目录 xff1a 什么是容错Dubbo容错模式 Dubbo集群模式配置 什么是容错 xff1f 在分布式架构的网络通信中 xff0c 容错能力是必须要具备的 那什么叫做容错昵 xff1f 简单来说就是服务容忍错误的能力 xff0c 具体来说
  • HDU 5984(求木棒切割期望 数学)

    题意是给定一长为 L 的木棒 xff0c 每次任意切去一部分直到剩余部分的长度不超过 D xff0c 求切割次数的期望 若木棒初始长度不超过 D xff0c 则期望是 0 000000 xff1b 设切割长度为 X 的木棒切割次数的期望是
  • 书籍推荐:Spring源码深度解析(第2版)

    Spring源码学习必读书籍 Spring源码深度解析 xff08 第2版 xff09 从核心实现 企业应用和Spring Boot这3个方面 xff0c 由浅入深 由易到难地对Spring源码展开了系统的讲解 xff0c 包括Spring
  • chrome cookies cookie 解密 写入(80+版本)

    一 xff0c 历史变迁 80之前 xff0c 解密 xff1a win32crypt CryptUnprotectData encrypted value bytes None None None 0 1 xff0c 老文N多 xff0c