用C#破解Chrome浏览器cookie值

这篇具有很好参考价值的文章主要介绍了用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值的方法,并用代码实现了功能,大家可以根据自己项目的情况使用。本案例涉及到隐私问题,建议不要用本案例做违规的操作。希望本文对你有所帮助,同时欢迎留言或吐槽。文章来源地址https://www.toymoban.com/news/detail-417393.html

来源公众号:DotNet开发跳槽

到了这里,关于用C#破解Chrome浏览器cookie值的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Chrome 浏览器远程调试

    打开浏览器的远程调试 Chrome浏览器的快捷方式,右键选择“属性”,在目标一栏加上 --remote-debugging-port=9222 ,后面的端口可以自己定义,完成之后启动浏览器。 我们拿另外一个浏览器测试下 打开新版的edge浏览器,地址栏输入 edge://inspect/#devices ,如果是chrome则需要输入 chr

    2024年02月13日
    浏览(61)
  • Python + Selenium 处理浏览器Cookie

    工作中遇到这么一个场景:自动化测试登录的时候需要输入动态验证码,由于某些原因,需要从一个已登录的机器上,复制cookie过来,到自动化这边绕过登录。 浏览器的F12里复制出来的cookie内容是文本格式的: 这里需要把cookie文本处理为name和value格式的字典形式,这个是S

    2024年02月13日
    浏览(54)
  • 深入解析浏览器Cookie(图文码教学)

    本博主将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识,有兴趣的小伙伴可以关注博主! 也许一个人独行,可以走的很快,但是一群人结伴而行,才能走的更远! Cookie 翻译过来是饼干的意思。 Cookie是一种用于在客户端浏览器和服务器之间进行状态跟踪的技术

    2024年02月16日
    浏览(37)
  • Selenium配置chrome浏览器

    依旧是记录自己配置的东西,防止之后忘了找不到 如果使用: 可以直接打开chrome浏览器,那就可以直接用,但是一般来说都是缺配置的,会报错: selenium启动配置参数接收是ChromeOptions类,需要webdriver.exe的驱动 所以最后代码如下: chrome需要对应版本的chromedriver,这里提供一

    2024年02月07日
    浏览(65)
  • Chrome浏览器断点调试技巧

    某些情况下,我们必须知道当前代码的执行顺序,以及每一步变量的执行状态来确定代码是否正确按照我们意愿执行。 此时使用断点调试是非常明智的选择。 使用断点调试的第一步,我们需要打开控制台,选择sources,并点击需要调试的文件。 此时在右侧面板可以看到调试操

    2024年02月06日
    浏览(59)
  • 【Tricks】关于如何防止edge浏览器偷取chrome浏览器的账号

    前段时间edge自动更新了,我并没有太在意界面的问题。但是由于我使用同一个网站平台时,例如b站,甚至是邮箱,edge的账号和chrome的账号会自动同步,这就导致我很难短时间内切换账号,亦或是同时登录两个账号。 It is quite ANNOYING. 于是就有了这篇杂谈博客。这里特别感谢

    2024年02月07日
    浏览(66)
  • 谷歌浏览器如何查看cookie存放信息

    Cookie,有时也用其复数形式 Cookies。类型为“ 小型文本文件 ”,是某些网站为了辨别用户身份,进行Session跟踪而储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息。下面以谷歌游览器查看cookie为例 谷歌浏览器查看cookie 1.打开谷歌游

    2024年02月05日
    浏览(48)
  • 如何开发一个chrome浏览器插件

    目录 前言 chrome扩展程序 文件结构 manifest.json html和css js 加载插件 调试 总结 当前,chrome浏览器早已成为占据最大的市场份额,也是综合体验最好的浏览器,开发人员使用的浏览器基本都以它为主。 我在使用chrome的过程中,积累增加了很多书签,最多的时候接近上千个,后续

    2024年02月08日
    浏览(61)
  • 如何开启多个独立Chrome浏览器

    作为测试或者开发人员,有些情况下会用到 Chrome 浏览器,但有时是同一个 Chrome 浏览器无法为我们提供隔离开的不同环境。这样 我们就需要清理 cache 、切换账号等,降低了我们的工作效率。今天的主题是如何开启多个独立的 Chrome 浏览器。 如果想开启 N 个 Chrome 浏览器,重

    2024年02月11日
    浏览(68)
  • Ubuntu上安装 Chrome 浏览器

    1. 命令行下载安装包:  2. 安装 之后即使有更新也不用重新手动下载安装了,因为安装包会在 源里添加相应的信息。

    2024年02月05日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包