首页 > 编程语言 >用C#破解Chrome浏览器cookie值

用C#破解Chrome浏览器cookie值

时间:2023-04-18 13:03:43浏览次数:37  
标签:浏览器 encryptedValue C# Chrome Length cookie new byte

背景

最近小编接到一个获取网站请求数据的需求,要求抓取网站某个页面请求的数据。我使用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开发跳槽

标签:浏览器,encryptedValue,C#,Chrome,Length,cookie,new,byte
From: https://www.cnblogs.com/xbhp/p/17329162.html

相关文章

  • class文件结构
    class文件结构u1、u2、u4和u8来分别表示1个字节、2个字节、4个字节和8个字节的无符号数,以“_info”结尾的类型都表示表类型。读取与写入class文件都是根据该表有严格的顺序魔数及版本号每个Class文件的头4个字节被称为魔数(MagicNumber),它的唯一作用是确定这个文件是否为一个能......
  • Object.create与new操作符
    前言Object.create与new都可以用来生成一个对象,那么它们之间有什么区别和联系呢分析先看一下用法,很明显可以看出,new是生成一个基于构造函数生成一个新对象,而Object.create是基于某个对象,将这个对象作为原型链实现的一个新的空对象。functionO(a){this.a=a;}const......
  • 在Ubuntu上安装Anaconda
    您可以按照以下步骤在Ubuntu上安装Anaconda:1.在Anaconda官网上下载适合您的系统的Anaconda。可以从以下链接获取:https://www.anaconda.com/products/individual2.打开终端,并cd到您下载的Anaconda安装程序所在的目录。3.在终端中,输入以下命令来启动安装程序:```bashAnaconda......
  • asp.net mvc 之旅 —— 第五站 从源码中分析asp.net mvc 中的TempData
    在mvc的controller中,我们知道有很多的临时变量存放数据,比如说viewData,viewBag,还有一个比较特殊的tempData,关于前两个或许大家都明白,基本上是一个东西,就是各自的编程写法不一样,最终都会放到viewContext中,然后送到WebPage中,如果你要证明的话,可以看下下面的......
  • asp.net signalR 专题—— 第三篇 如何从外部线程访问 PersistentConnection
       在前面的两篇文章中,我们讲到的都是如何将消息从server推向client,又或者是client再推向server,貌似这样的逻辑没什么异常,但是放在真实的环境中,你会很快发现有一个新需求,如何根据第三方系统的数据变化来即时的将新数据推送到各个客户端,比如下面这样:ok,原理就是上面的这......
  • 从源码角度深入解析Callable接口
    摘要:从源码角度深入解析Callable接口,希望大家踏下心来,打开你的IDE,跟着文章看源码,相信你一定收获不小。本文分享自华为云社区《一个Callable接口能有多少知识点?》,作者:冰河。并发编程一直是程序员们比较头疼的,如何编写正确的并发程序相比其他程序来说,是一件比较困难的事情,并发编程......
  • PCB阻抗误差控制在5%,究竟有多难?
    众所周知,阻抗控制是我们做高速设计最基本的原则。目前常规的板厂会把阻抗控制在10%的误差,不少朋友就会有疑问,为什么是10%?理论上误差肯定是越小越好,所以为什么不能进一步的把常规控制能力推到8%,甚至5%呢?理想固然美好,但现实难免“残酷”。影响PCB走线的阻抗的因素有很多,主要有铜线的......
  • mongodb 3.x 之实用新功能窥看[1] ——使用TTLIndex做Cache处理
    mongodb一直都在不断的更新,不断的发展,那些非常好玩也非常实用的功能都逐步加入到了mongodb中,这不就有了本篇对ttlindex的介绍,刚好我们的生产业务场景中就有这个一个案例。。。 一:案例分析   我们生产的推荐系统要给用户发送短信和邮件的关联营销......
  • 搭建高可用的rabbitmq集群 + Mirror Queue + 使用C#驱动连接
    我们知道rabbitmq是一个专业的MQ产品,而且它也是一个严格遵守AMQP协议的玩意,但是要想骚,一定需要拿出高可用的东西出来,这不本篇就跟大家说一下cluster的概念,rabbitmq是erlang写的一个成品,所以知道如何构建erlang的node集群就ok了,他需要一个统一的cookie机制......
  • 十五天精通WCF——终结篇 那些你需要注意的坑
         终于一路走来,到了本系列的最后一篇了,这一篇也没什么好说的,整体知识框架已经在前面的系列文章中讲完了,wcf的配置众多,如果不加一些指定配置,你可能会遇到一些灾难性的后果,快来一睹为快吧。 一:第一个大坑【数据传输量】我们使用wcf的目的,就是用来进行分......