用Qt写软件系列二:QCookieViewer(浏览器Cookie查看器)

2023-11-09

预备

    继上篇《浏览器缓存查看器QCacheViewer》之后,本篇开始QCookieViewer的编写。Cookie技术作为网站收集用户隐私信息、分析用户偏好的一种手段,广泛应用于各大网站。对于网站的精准营销、使用反馈、数据挖掘等具有不可估量的作用。Cookie按照创建者的不同,分成两类:服务端创建的Cookie和客户端浏览器创建的Cookies。那么,作为用户想要查看当前主机的Cookies文件该怎么办呢?最简单的办法是:直接到Windows目录下去找!Cookies文件是以ASCII码字符的形式保存的,因此可以直接用记事本打开查看。然而,由于Cookies文件是以Unix风格换行的,格式非常难看。QCookieViewer为Cookies提供了一个界面友好的查看工具。

    这款软件还是部分借鉴于IECookiesViewer。因此,我们还是先看看这款软件的界面:

    可以看到,该软件主界面分成上下两栏。上面一栏是当前所有Cookies文件的列表,下面一栏是选中的Cookies文件中的Cookie项。上面一栏的各项信息可以通过解析index.dat文件得到,这个解析过程在上一篇中就已经说到;下面一栏的内容则需要通过解析Cookie文件来得到。上面我们已经知道,Cookies文件中的每一行都是以unix换行符分割的。因此,解析Cookie文件是一个非常简单的过程。然而,我们显然注意到在下面一栏的最右侧有一个Created In列。仅仅靠解析Cookie文件,是无法得到这样的信息的。怎样完成这个功能,下面将有详细叙述。

关键技术

  1. 为什么不遍历Cookie文件夹

    在上一篇中我们说过,仅仅靠遍历Cache文件夹中的文件来获取Cache文件清单是不可行的。因为那只能获得文件名、文件大小等基本信息,我们需要的不仅仅是这些。另外,使用Windows系统提供的API的话,也具有一定的局限性。通过解析index.dat文件,我们获取更为详尽的信息。不但能够得到当前主机存在的Cookies文件信息,还可以查看到该主机曾经存在过的Cookies文件。因此,我们仍然采用了解析index.dat文件的方法。

  1. index.dat文件的位置
    • 对于Windows XP/2000而言, Cookies文件保存在:C:/Documents and Settings/Administrator/Cookies/ 
    • 对于Windows Vista/7而言,Cookies文件保存在:C:/Users/Administrator/AppData/Roaming/Microsoft/Windows/Cookies/(low/)。该目录会根据权限的不同而不同。
  2. 内存文件映射 
    • index.dat文件采用增量记录方式。因此,index.dat文件会随着使用时间的增加而不断增大。为了提高文件IO速度,我们采用了Windows系统的内存文件映射功能,将整个index.dat文件映射到内存中进行操作。代码如下:
    •  1 CookieHelper::CookieHelper(void)
       2 {
       3     // Need to be fixed
       4     const char* fileName = "C:\\Documents and Settings\\Administrator\\Cookies\\index.dat";
       5     // create a kernel file object
       6     m_hFile = CreateFileA(fileName, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_READONLY, NULL);
       7     if (m_hFile == INVALID_HANDLE_VALUE)
       8     {
       9         MessageBoxA(NULL, "Error", "Can't open the index.dat file.", MB_OKCANCEL);
      10         return;
      11     }
      12 
      13     // create a kernel file mapping object
      14     m_hMapping = CreateFileMappingA(m_hFile, NULL, PAGE_READONLY, 0, 0, NULL);
      15     if (m_hMapping == NULL)
      16     {
      17         MessageBoxA(NULL, "Error", "Can't create file mapping object.", MB_OKCANCEL);
      18         CloseHandle(m_hFile);
      19         m_hFile = NULL;
      20         return ;
      21     }
      22 
      23     m_startAddr = (LPSTR)MapViewOfFile(m_hMapping, FILE_MAP_READ, 0, 0, 0);
      24     if (m_startAddr == NULL)
      25     {
      26         MessageBoxA(NULL, "Error", "Can't mappping the index.dat file.", MB_OKCANCEL);
      27         CloseHandle(m_hFile);
      28         m_hFile = NULL;
      29         CloseHandle(m_hMapping);
      30         m_hMapping = NULL;
      31         return;
      32     }
      33 }

      我们将index.dat文件映射到内存中使用完之后,须得及时关闭前面得到的内存句柄。否则可能导致资源泄漏。 

  3. 解析index.dat文件
    • 解析index.dat文件的过程自不必说了,在上一篇中我们已经详细阐述过了。唯一需要注意的是,解析得到的字段和上一篇中的有所出入。  
  4. Cookie文件的格式
    • Cookies文件内容以ASCII码字符保存,其格式也不算复杂。在一个Cookie文件中,可能存在多条Cookie记录。每条Cookie记录都包含9个字段,如下所示:
    • 每个字段自成一行,以unix换行分隔符分割。每一条Cookie记录又以星号(*)进行分割。这些字段的具体含义不必再赘述了。值得注意的是,这里的时间转换需要注意顺序。在参考资料4中,作者把时间的高地位写反了,导致转换得到的时间错的离谱。另外需要注意的一个字段是Optional flags。这个字段到底包含哪些options,并没有详细的文档说明。 
  5. 关于Created In列
    • 如何确定Cookies文件的Creator,起初并没有一个很好的思路。反复查看了每条Cookie记录中Optional flags字段,并比照IECookiesView工具中Created In列之后,我们发现了一个特定的规律:当Optional flags字段出现的值为1024,1536, 9216, 9728, 2147484672(不完全统计)时,IECookieView显示该Cookie由Server创建;当值为1600,1088(不完全统计)时,IECookieView显示该Cookie由Client创建。由此,我们得到一条统计规律:当optional flags值能被0x100整除时,该cookie由server端创建;否则该Cookie是由client端创建的。至于具体的规则如何,由于并没有找到说明文档,不敢妄下结论。

界面设计

    由于尚未开始研究Qt的CSS技术,无暇顾及界面的美化工作。界面显示的是Windows XP经典主题,因此看起来较为朴素简陋。

 

代码

  代码全部托管于GitHub,README有更详细的说明。

参考资料

  1. NirSoft
  2. Forensic Analysis of Internet Explorer Activity Files.pdf
  3. 《index.dat文件结构解析》,吴清,吴顺祥.
  4. Cookie文件说明及IE的Cookie文件格式

 

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

用Qt写软件系列二:QCookieViewer(浏览器Cookie查看器) 的相关文章

  • 万字长文深入浅出理解ChatGPT工作原理

    本文转自 原创 万字长文深入浅出理解ChatGPT工作原理 qq com AIGC简要介绍 AIGC是什么 AIGC AI Generated Content AI生成内容 对应我们的过去的主要是 UGC User Generated Co
  • 如何通过Anaconda创建虚拟环境

    做深度学习的同学们应该都受到配置环境的困扰 我也是饱受摧残 本文介绍几个踩过的坑 在anaconda下创建一个虚拟环境 文件名为 pytorch python版本是 3 8 conda create n pytorch python 3 8
  • 【GIT 使用教程 linux 环境】

    1 GIT基本使用 1 linux环境下安装GIT sudo apt get install git 2 全局账号配置 git config global user name yourname git config global user
  • vue v-for循环

    vue v for循环中通过一个变量控制不同的下拉框 默认是全部展开 当点击每个表格的下拉图标 就会显示或隐藏 刚开始做的时候就通过一个变量进行控制 导致点击一个下拉图标就会控制所有有的表格下拉 所以应该是给每个表格对应的集合中加一条属性来
  • autojs常见报错及解决

    autojs常见报错及解决 期待大家在下面评论补充 更多基础加autojs交流群553908361喽 一键加群 点击加群 1 需要在ui模式下运行才能使用该函数 file android asset modules ui js 15 Err
  • Antv/G2 柱状图

    Antv G2 教程 G2 是一套基于图形语法理论的可视化底层引擎 以数据驱动 提供图形语法与交互语法 具有高度的易用性和扩展性 使用 G2 无需关注图表各种繁琐的实现细节 一条语句即可使用 Canvas 或 SVG 构建出各种各样的可交互
  • MacbookPro M1芯片对“cp -r” 命令支持有误,慎重购买

    MacBook2021 M1 MAXPro电脑问题锦集 问题1 开启硬盘加密 开机闪屏 问题详述 在系统偏好设置中 打开安全与隐私 在弹出窗口中切换到第二个页签 文件保险箱 启用文件保险箱功能 然后关机重新启动电脑 在输入密码回车后进度条刚
  • 开发时写TestCase的一些经验

    今天修复完一个业务代码的 bug 手动测试没有问题 但写测试用例出错 在对代码很自信的情况下 因为手动测试过了 我干脆省略了这个步骤 然而偷懒的事情早晚会暴露出来 用 Git 提交到远程时在 Code Review 那里的系统集成测试老是失
  • 【SVM回归预测】基于支持向量机的数据回归预测(libsvm)附matlab代码

    作者简介 热爱科研的Matlab仿真开发者 修心和技术同步精进 matlab项目合作可私信 个人主页 Matlab科研工作室 个人信条 格物致知 更多Matlab仿真内容点击 智能优化算法 神经网络预测 雷达通信
  • 如何处理企业间的人际关系

    如何处理企业之间的人际关系呢 其实这个话题很多人一直都迷茫 包括我在内 我也还没有学会如何处理企业之间的人际关系 这是一门大学问 可惜真正写文章的人没有感受 会写文章的人表达不出来 所以都比较少看到诸类的文章 即使有类似的文章 可是以理论化
  • 说一说xgboost和lightgbm的区别是什么

    前面提到了 LightGBM是Xgboost的更高效实现 由微软发布 XGBoost的并行是在特征粒度上的 我们知道 决策树的学习最耗时的一个步骤就是对特征的值进行排序 因为要确定最佳分割点 XGBoost在训练之前 预先对数据进行了排序
  • JAVA 基础题

    1 面向对象有哪些特征 答 继承 封装 多态 2 JDK与JRE的区别是什么 答 JDK是java开发时所需环境 它包含了Java开发时需要用到的API JRE是Java的运行时环境 JDK包含了JRE 他们是包含关系 3 Java有哪几种
  • Umask的含义

    Umask的含义 umask 022中 022 是八进制的写法 如果换成二进制是000010010 在unix中文件权限是三类用户 三种权限 三类用户分别是文件所有者user u 文件所有者所在主群组group g 其它用户others o
  • Vue脚手架安装和初次使用

    1 安装淘宝镜像 npm config set registry https registry npm taobao org 2 全局安装脚手架 npm install g vue cli 3 切到要创建项目的目录 创建项目 本例选择目录为
  • windows DHCP服务器部署

    目录 一 关于windows dhcp服务器 1 1 关于dhcp 1 2 DHCP续约 二 DHCP服务器部署 2 1 关于DHCP服务器 2 2部署DHCP服务器 2 3 保留特定IP地址 2 4 相关dos命令使用 2 5 多个地址池
  • 如何在Mac OS上从Photoshop 2020作为插件访问Topaz DeNoise AI?

    TopazDeNoise AI for mac是Topaz系列中的一款AI图像降噪软件 topaz denoise ai破解版提供了数百万个噪声 清晰图像的算法 可以快速消除图像中噪音并且保留原始图像细节 人工智能降噪Topaz DeNoi
  • [Python从零到壹] 六十七.图像识别及经典案例篇之基于卷积神经网络的MNIST图像分类

    七月太忙 还是写一篇吧 欢迎大家来到 Python从零到壹 在这里我将分享约200篇Python系列文章 带大家一起去学习和玩耍 看看Python这个有趣的世界 所有文章都将结合案例 代码和作者的经验讲解 真心想把自己近十年的编程经验分享给
  • 如何从RNN起步,一步一步通俗理解LSTM

    转自 https blog csdn net v july v article details 89894058 如何从RNN起步 一步一步通俗理解LSTM 前言 提到LSTM 之前学过的同学可能最先想到的是ChristopherOlah的
  • Flask 扩展 用户会话

    pip install flask login 接下来创建扩展对象实例 from flask import Flask from flask login import LoginManager app Flask name login ma
  • AHB总线协议

    1 简介 AHB总线规范是AMBA总线规范的一部分 AMBA总线规范是ARM公司提出的总线规范 被大多数SoC设计采用 它规定了AHB Advanced High performance Bus ASB Advanced System Bu

随机推荐

  • codable swift_如何使用Swift Codable与JSON相互转换

    codable swift For this article I used Xcode 11 4 1 and Swift 5 2 I assume you re familiar with the basics of Swift 对于本文
  • 【深度学习环境搭建(一)】cuda和pytorch

    深度学习环境搭建 一 cuda和pytorch 系统配置 Python环境配置 CUDA环境配置 pytorch环境配置 系统配置 服务器型号 Dell PowerEdge R730 硬件 CPU Intel Xeon CPU E5 265
  • java date转换timestamp_Java Date转Timestamp

    Java Date转Timestamp 1 Java Date转Timestamp的介绍 我们可以使用java sql Timestamp类的构造函数在Java中将Date转换为Timestamp Timestamp类的构造函数接收长值作为
  • Python生成allure测试报告,allure使用详细说明

    pytest框架自带一个测试报告 内容也相对全面 但是可读性差点 allure生成的测试报告 可改造性强 看起来也美观 使用过程在此总结一下 一 生成allure测试报告 1 下载安装allure pytest插件 我一般都是在pychar
  • bug总结之为什么每次提升完类之后,改变原来类对应的代码位置,UI找不到原来的界面ui类了

    这边注意以下 自己给自己写的一个bug 当你提升完一个类之后 比如qcustomplot类 原先是放在mainwindow cpp同一级目录下 原先位置 后面想把qcustomplot类新建一个qcustomplot文件夹下 那需要做什么
  • 小程序跳转至企业微信客服wx.openCustomerServiceChat

    从小程序跳转至企业微信客服 小程序后台地址 https mp weixin qq com wxamp home guide 扫码登录自己的小程序 第一步 在小程序管理后台的 功能 客服 微信客服 处 填写对应的企业ID 完成绑定 第二步 在
  • CenterFace解读 轻量级anchor_free人脸检测器

    论文地址 https arxiv org ftp arxiv papers 1911 1911 03599 pdf github地址 https github com Star Clouds centerface 此篇文章是参考的Objec
  • 用php的chr和ord函数实现字符串和ASCII码互转

    http shenyongqang blog 163 com blog static 22439113201002941856838 chr和ord函数是用来字符串和ASCII码互转的 ASCII码是计算机所能显示字符的编码 它的取值范围是
  • 浅谈什么是闭包

    什么是闭包 我个人理解为 闭包就是能够读取其他函数内部变量的函数 由于在Javascript语言中 只有函数内部的子函数才能读取局部变量 因此可以把闭包简单理解成 定义在一个函数内部的函数 实际使用场景 封装方法的时使用callback回调
  • CAN与CANOpen(一)

    CAN与CANOpen 一 基本概念 CAN与CANOpen 二 报文格式 CAN与CANOpen 三 错误处理 CAN与CANOpen 四 CANOpen对象字典 CAN与CANOpen 五 PDO和SDO CAN与CANOpen 六 网
  • 【面试总结】--tomcat调优方案

    前段时间参加面试 面试过程中提到服务器的调优方案 这里总结一下 首先说一下tomcat的调优方案 Tomcat本身的优化 Java虚拟机调优 Tomcat 优化分为系统优化 接下来一个个介绍 一 Tomcat本身的优化 Tomcat 的自身
  • js获取当前页面url网址信息

    1 window location href 设置或获取整个 URL 为字符串 var test window location href alert test 返回 http i cnblogs com EditPosts aspx op
  • -bash: mysqldump: command not found

    根目录在 usr local mysql bin mysqldump所以得在此目录下执行 要不就是创建软连接 这个目录是我自己tar安装的时候配置的目录 如果安装的是其他目录换成自己的目录就行了 不过一般都是这个目录吧 1 首先通过下面的命
  • Spring的控制反转(依赖注入),及两种注入方式

    1 提供构造函数来让spring实现构造注入 public class PersonService private String name 提供bean的构造函数 让spring用构造注入的方式来构造cibean public Person
  • nodejs 通过nginx后出现响应慢的解决方法

    最近用了nodejs搭建服务器 然后用了nginx做了反向代理 项目开发需求 没办法 但是发现了经过代理之后发现网页请求变慢了 而且是不能忍的一分钟以上 一开始 怀疑是在nodejs那边的问题 结果在nodejs那边进行了判断 通过写测试代
  • python : is 和==的区别

    Python中的对象包含三要素 id type value 1 id用来唯一标识一个对象 is判断的是a对象是否就是b对象 是通过id来判断的 2 type标识对象的类型 3 value是对象的值 判断的是a对象的值是否和b对象的值相等 是
  • Android音频系统之AudioFlinger(一)

    1 1 AudioFlinger 在上面的框架图中 我们可以看到AudioFlinger 下面简称AF 是整个音频系统的核心与难点 作为Android系统中的音频中枢 它同时也是一个系统服务 启到承上 为上层提供访问接口 启下 通过HAL来
  • 数据模型建模详解

    问题导读 1 数据层次如何划分 2 如何进行数据划分及命名空间约定 3 ODS层分为几部分 数据层次的划分 ODS Operational Data Store 操作数据层 在结构上其与源系统的增量或者全量数据基本保持 一致 它相当于一个数
  • 基于MATLAB的模糊pi控制器的设计

    基于MATLAB的模糊pi控制器的设计 模糊规则隶属函数的建立 a newfis fuzzypid 添加第一个输入变量e a addvar a input e 1 1 a addmf a input 1 N zmf 1 1 3 a addm
  • 用Qt写软件系列二:QCookieViewer(浏览器Cookie查看器)

    预备 继上篇 浏览器缓存查看器QCacheViewer 之后 本篇开始QCookieViewer的编写 Cookie技术作为网站收集用户隐私信息 分析用户偏好的一种手段 广泛应用于各大网站 对于网站的精准营销 使用反馈 数据挖掘等具有不可估