用C#破解Chrome浏览器cookie值

背景

最近小编接到一个获取网站请求数据的需求,要求抓取网站某个页面请求的数据。我使用Google Chrome浏览器查看了一下请求链接的传入参数,发现需要传入一个Token值才能获取数据。于是我在Chrome中登录后,通过Postman请求成功,并将Token存储到了Cookie中。然而问题又来了,在代码层面如何获取这个Token呢?

解决方案

小编在网上查了一圈,发现Chrome浏览器的Cookie存储在本地的sqlite数据库中。在Chrome的安装目录中找到了sqlite的文件,通过读取sqlite数据库即可获得了Cookie值。如下图:

图片

其中name是cookie的名称, encrypted_value字段是加密的cookie值,host_key就是站点域名了。但是这个Cookie值是加密的。

存储cookie目录:

C:\Users\用户名\AppData\Local\Google\Chrome\User Data\Default\Network\Cookies

各个版本的目录可能不同,有的在Local State文件夹下。

小编继续搜索,发现Chrome浏览器是开源的,算法是公开的,用到的加密算法是aes加密算法。我们不需要知道这个算法,只需要知道此算法需要一个秘钥,通过这个秘钥就可以进行加密和解密,代码如下。

实现代码

关键代码如下:

  using (SqliteConnection connection = new SqliteConnection())
            {
                //1、获取google Chrome浏览器目录
                var userprofilePath = Environment.GetEnvironmentVariable("USERPROFILE");
                 var sourceFile= $@"{userprofilePath}\AppData\Local\Google\Chrome\User Data\Default\Network\Cookies"; 
                //var sourceFile = $@"{userprofilePath}\Desktop\11111111.txt";
                var targetFile = $@"{Directory.GetCurrentDirectory()}\GoogleFile\Cookies";

                //2、拷贝文件到本地目录,防止文件被占用
                FileInfo file = new FileInfo(sourceFile);
                if(!Directory.Exists($@"{Directory.GetCurrentDirectory()}\GoogleFile"))
                    Directory.CreateDirectory($@"{Directory.GetCurrentDirectory()}\GoogleFile");
                if (file.Exists)
                {
                    file.CopyTo(targetFile, true);
                }

                //3、链接sqlite数据库
                connection.ConnectionString = $@"DataSource="+ targetFile;
                 connection.Open();
                //4、通过select查询相关的语句
                SqliteCommand command = new SqliteCommand("select host_key,name,encrypted_value from cookies where name='public-token' and host_key='.cponline.cnipa.gov.cn'", connection);
                SqliteDataReader dataReader = command.ExecuteReader();
                dataReader.Read();
                byte[] encryptedValue = (byte[])dataReader["encrypted_value"];

                //5、解密数据
                int keyLength = 256 / 8;
                int nonceLength = 96 / 8;
                String kEncryptionVersionPrefix = "v10";
                int GCM_TAG_LENGTH = 16;
                //字符串内容取自C:\Users\用户名\AppData\Local\Google\Chrome\User Data\Local State文件的encrypted_key
                byte[] encryptedKeyBytes = Convert.FromBase64String("RFBBUEkBAAAA0Iyd3wEV0RGMegDAT8KX6wEAAACVAmSA/y7+TLs+3WWdDv1ZAAAAAAIAAAAAABBmAAAAAQAAIAAAABV7dDMB8p+vKnLEjnrhnWB4DAbB/k5XAtjWGFnci/3qAAAAAA6AAAAAAgAAIAAAAH/pnc+fF6dhG8Fpw6yQezIXtMw48xNvuyRub/cZ62XaMAAAAP1pl5QqRJmd1J4V++dhE63MEA9F4NzCHb1aOMgTnFCo1+xSHYovSTzCoYFvoDfIFUAAAAAZzDzWwwpUm6yZG9tpYu/ioRSO8V16MetQy2s7L9HHO03Q6bO8Nr05Erl1QbjCVoSgSOU4krcerUsngMwIYFyb");
                encryptedKeyBytes = encryptedKeyBytes.Skip("DPAPI".Length).Take(encryptedKeyBytes.Length - "DPAPI".Length).ToArray();
                var keyBytes = System.Security.Cryptography.ProtectedData.Unprotect(encryptedKeyBytes, null, System.Security.Cryptography.DataProtectionScope.CurrentUser);
                var nonce = encryptedValue.Skip(kEncryptionVersionPrefix.Length).Take(nonceLength).ToArray();
                encryptedValue = encryptedValue.Skip(kEncryptionVersionPrefix.Length + nonceLength).Take(encryptedValue.Length - (kEncryptionVersionPrefix.Length + nonceLength)).ToArray();
                var str = System.Web.HttpUtility.UrlDecode(AesGcmDecrypt(keyBytes, nonce, encryptedValue));

                //6、获得值
                Console.WriteLine($"{dataReader["host_key"]}-{dataReader["name"]}-{str}");
                //7、关闭数据
                connection.Close();
            }

以上代码列出了解密步骤,大家可以根据自己的项目情况调整。

AesGcmDecrypt解密的方法:

        public static string AesGcmDecrypt(byte[] keyBytes, byte[] nonce, byte[] encryptedValue)
        {
            GcmBlockCipher gcmBlockCipher = new GcmBlockCipher(new AesEngine());
            AeadParameters aeadParameters = new AeadParameters(
                new KeyParameter(keyBytes),
                128,
                nonce);
            gcmBlockCipher.Init(false, aeadParameters);
            byte[] plaintext = new byte[gcmBlockCipher.GetOutputSize(encryptedValue.Length)];
            int length = gcmBlockCipher.ProcessBytes(encryptedValue, 0, encryptedValue.Length, plaintext, 0);
            gcmBlockCipher.DoFinal(plaintext, length);
            return Encoding.UTF8.GetString(plaintext);
        }

注:本案例.NET项目使用的是.NET6,Chrome浏览器版本是v110。

Chrome开源地址:chromium.googlesource.com/chromium/src

解密加密地址:

https://cs.chromium.org/chromium/src/components/os_crypt/os_crypt_win.cc?q=OSCrypt&dr=CSs

输出str效果:

图片

结语

本文介绍了用C#读取Chrome浏览器cookie值的方法,并用代码实现了功能,大家可以根据自己项目的情况使用。本案例涉及到隐私问题,建议不要用本案例做违规的操作。希望本文对你有所帮助,同时欢迎留言或吐槽。

来源公众号:DotNet开发跳槽

原文链接:https://www.cnblogs.com/xbhp/p/17329162.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:用C#破解Chrome浏览器cookie值 - Python技术站

(0)
上一篇 2023年4月24日
下一篇 2023年4月25日

相关文章

  • C# Access数据库增删查改的简单方法

    C#Access数据库增删查改的简单方法攻略 简介 Access 是一款微软旗下的关系型数据库管理系统,提供了简单易用的数据存储、组织、查询、分析等功能。在 C# 中通过使用 OleDb 数据库连接提供程序,开发人员可以很方便地实现和 Access 数据库的交互,并进行数据的增删查改操作。 本文将介绍如何使用 C#和 Access数据库实现数据的增删查改,并…

    C# 2023年5月15日
    00
  • 拦截asp.net输出流并进行处理的方法

    拦截asp.net输出流并进行处理的方法可以通过实现自定义的HttpModule来实现。下面将详细介绍具体的步骤和示例。 第一步:创建自定义HttpModule类 首先,我们需要创建一个自定义的HttpModule类,并实现其核心方法Application_EndRequest。该方法会在每个请求结束后被调用,并且此时应用程序将已处理完整个请求,即可以读写请…

    C# 2023年6月3日
    00
  • C#中静态方法和实例化方法的区别、使用

    C#中静态方法和实例化方法的区别: 静态方法是一种属于类的方法,可以在未实例化类的情况下直接访问,可以通过类名调用。而实例化方法则是属于对象的方法,需要先创建类的实例(对象)后,才能访问它。即使创建多个类的实例,每个实例都有独立的实例化方法。 静态方法示例: using System; class Program { static void Main(str…

    C# 2023年5月31日
    00
  • ASP.NET如何定时调用WebService服务

    ASP.NET 定时调用 WebService 有多种实现方式,其中比较常用的有使用定时器 Timer 和使用 Quartz.NET 两种。下面分别给出两种方式的示例说明。 使用定时器 Timer 实现定时调用 WebService 使用 System.Windows.Forms.Timer 实现,在 WebForm 或 Windows 窗口应用程序中可以轻…

    C# 2023年6月3日
    00
  • C#泛型语法详解

    C#泛型语法详解 1.泛型的概念 C#中的泛型是指一种可以将类型参数化的特性。泛型提供了一种创建可重用、类型安全的代码的方法,可以大大简化代码的编写过程。泛型还可以帮助我们避免在强类型语言中最常见的类型转换问题。 2.泛型类型 泛型类型是具有一般性的类型定义,包含泛型类型参数。定义泛型类型可以使用T或其他名字作为泛型类型参数。 public class My…

    C# 2023年6月7日
    00
  • C#中哈希表(HashTable)用法实例详解(添加/移除/判断/遍历/排序等)

    C#中哈希表(HashTable)用法实例详解 哈希表(HashTable)是一种使用哈希算法实现的数据结构,它能在平均情况下以常数时间复杂度进行基本操作(添加、删除、查找)。 在C#中,哈希表可以用System.Collections.Hashtable类实现。本文将详细介绍哈希表在C#中的用法,包括添加、移除、判断、遍历、排序等。 添加元素 使用哈希表添…

    C# 2023年6月7日
    00
  • C#基础知识之base关键字介绍

    C#基础知识之base关键字介绍 在C#中,base关键字用于访问基类成员(在派生类中),并调用基类的构造函数。本文将详细介绍base关键字的使用方法。 base关键字用法 1.访问基类成员 当派生类中存在与基类同名的方法或属性时,此时需要使用base关键字来访问基类中同名的方法或属性。 以下是一个示例代码: public class BaseClass {…

    C# 2023年6月3日
    00
  • .NET Core分布式链路追踪框架的基本实现原理

    .NET Core分布式链路追踪框架的基本实现原理 分布式链路追踪是一种用于跟踪分布式系统中请求的技术。在.NET Core中,我们可以使用分布式链路追踪框架来跟踪请求的流程和性能。本攻略将详细介绍.NET Core分布式链路追踪框架的基本实现原理,并提供两个示例说明。 基本实现原理 .NET Core分布式链路追踪框架的基本实现原理如下: 在分布式系统中,…

    C# 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部