用Qt写软件系列二:QCookieViewer(浏览器Cookie查看器)
预备
继上篇《浏览器缓存查看器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文件,是无法得到这样的信息的。怎样完成这个功能,下面将有详细叙述。
关键技术
- 为什么不遍历Cookie文件夹?
在上一篇中我们说过,仅仅靠遍历Cache文件夹中的文件来获取Cache文件清单是不可行的。因为那只能获得文件名、文件大小等基本信息,我们需要的不仅仅是这些。另外,使用Windows系统提供的API的话,也具有一定的局限性。通过解析index.dat文件,我们获取更为详尽的信息。不但能够得到当前主机存在的Cookies文件信息,还可以查看到该主机曾经存在过的Cookies文件。因此,我们仍然采用了解析index.dat文件的方法。
- 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/)。该目录会根据权限的不同而不同。
- 内存文件映射
- index.dat文件采用增量记录方式。因此,index.dat文件会随着使用时间的增加而不断增大。为了提高文件IO速度,我们采用了Windows系统的内存文件映射功能,将整个index.dat文件映射到内存中进行操作。代码如下:
CookieHelper::CookieHelper(void)
{
// Need to be fixed
const char* fileName = "C:\\Documents and Settings\\Administrator\\Cookies\\index.dat";
// create a kernel file object
m_hFile = CreateFileA(fileName, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_READONLY, NULL);
if (m_hFile == INVALID_HANDLE_VALUE)
{
MessageBoxA(NULL, "Error", "Can't open the index.dat file.", MB_OKCANCEL);
return;
} // create a kernel file mapping object
m_hMapping = CreateFileMappingA(m_hFile, NULL, PAGE_READONLY, , , NULL);
if (m_hMapping == NULL)
{
MessageBoxA(NULL, "Error", "Can't create file mapping object.", MB_OKCANCEL);
CloseHandle(m_hFile);
m_hFile = NULL;
return ;
} m_startAddr = (LPSTR)MapViewOfFile(m_hMapping, FILE_MAP_READ, , , );
if (m_startAddr == NULL)
{
MessageBoxA(NULL, "Error", "Can't mappping the index.dat file.", MB_OKCANCEL);
CloseHandle(m_hFile);
m_hFile = NULL;
CloseHandle(m_hMapping);
m_hMapping = NULL;
return;
}
}我们将index.dat文件映射到内存中使用完之后,须得及时关闭前面得到的内存句柄。否则可能导致资源泄漏。
- 解析index.dat文件
- 解析index.dat文件的过程自不必说了,在上一篇中我们已经详细阐述过了。唯一需要注意的是,解析得到的字段和上一篇中的有所出入。
- Cookie文件的格式
- Cookies文件内容以ASCII码字符保存,其格式也不算复杂。在一个Cookie文件中,可能存在多条Cookie记录。每条Cookie记录都包含9个字段,如下所示:

- 每个字段自成一行,以unix换行分隔符分割。每一条Cookie记录又以星号(*)进行分割。这些字段的具体含义不必再赘述了。值得注意的是,这里的时间转换需要注意顺序。在参考资料4中,作者把时间的高地位写反了,导致转换得到的时间错的离谱。另外需要注意的一个字段是Optional flags。这个字段到底包含哪些options,并没有详细的文档说明。
- 关于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有更详细的说明。
参考资料
- NirSoft
- Forensic Analysis of Internet Explorer Activity Files.pdf
- 《index.dat文件结构解析》,吴清,吴顺祥.
- Cookie文件说明及IE的Cookie文件格式
用Qt写软件系列二:QCookieViewer(浏览器Cookie查看器)的更多相关文章
- 用Qt写软件系列三:一个简单的系统工具(上)
导言 继上篇<用Qt写软件系列二:QIECookieViewer>之后,有一段时间没有更新博客了.这次要写的是一个简单的系统工具,需求来自一个内部项目.功能其实很简单,就是查看当前当前系统 ...
- 用Qt写软件系列一:QCacheViewer(浏览器缓存查看器)
介绍 Cache技术广泛应用于计算机行业的软硬件领域.该技术既是人们对新技术探讨的结果,也是对当前软硬件计算能力的一种妥协.在浏览器中使用cache技术,可以大幅度提高web页面的响应速度,降低数据传 ...
- 用Qt写软件系列五:一个安全防护软件的制作(1)
引言 又有许久没有更新了.Qt,我心爱的Qt,为了找工作不得不抛弃一段时间,业余时间来学一学了.本来计划要写一系列关于Qt组件美化的博文,但是写了几篇之后就没坚持下去了.技术上倒是问题不大,主要是时间 ...
- 用Qt写软件系列四:定制个性化系统托盘菜单
导读 一款流行的软件,往往会在功能渐趋完善的时候,通过改善交互界面来提高用户体验.毕竟,就算再牛逼的产品,躲藏在糟糕的用户界面之后总会让用户心生不满.界面设计需综合考虑审美学.心理学.设计学等多因素, ...
- 用Qt写软件系列三:一个简单的系统工具之界面美化
前言 在上一篇中,我们基本上完成了主要功能的实现,剩下的一些导出.进程子模块信息等功能,留到后面再来慢慢实现.这一篇来讲述如何对主界面进行个性化的定制.Qt库提供的只是最基本的组件功能,使用这些组件开 ...
- 用Qt写软件系列五:一个安全防护软件的制作(3)
引言 上一篇中讲述了工具箱的添加.通过一个水平布局管理器,我们将一系列的工具按钮组合到了一起,完成了工具箱的编写.本文在前面的基础上实现窗体分割效果.堆栈式窗口以及Tab选项卡. 窗体分割 窗体分割是 ...
- 用Qt写软件系列五:一个安全防护软件的制作(2)
引言 在上一篇中讲述了主窗体的创建和设计.主窗体的无边框效果.阴影效果.拖动事件处理.窗体美化等工作在前面的博客中早就涉及,因此上篇博文中并未花费过多笔墨.这一篇继续讲述工具箱(Tool Button ...
- tensorflow笔记(五)之MNIST手写识别系列二
tensorflow笔记(五)之MNIST手写识别系列二 版权声明:本文为博主原创文章,转载请指明转载地址 http://www.cnblogs.com/fydeblog/p/7455233.html ...
- windows server 2008 R2安装图片浏览器/照片查看器方法
有用户的电脑安装了windows server 2008 R2,浏览大量图片时很不方便,因为系统中没有照片查看器或图片浏览器.其实,win2008 R2是有照片查看器的,只是默认情况下没有开启.参考以 ...
随机推荐
- 解决Electron加载带jquery的项目报错问题
<!-- Insert this line above script imports --> <script>if (typeof module === 'object') { ...
- Why GUID primary keys are a database’s worst nightmare
http://csharptest.net/1250/why-guid-primary-keys-are-a-databases-worst-nightmare/ When you ask most ...
- mac上parallel与virtualbox无法共存
Mac reboots when you attempt to launch Parallels Desktop 8 and Virtual Box simultaneously Article ID ...
- 【转帖】驳Jan Baan关于BPM是ERP走向没落起点的说法
驳Jan Baan关于BPM是ERP走向没落起点的说法 Jan Bean在接受畅享网访问的时候提到“BPM是ERP走向没落的一个起点”.“BPM终将取代ERP”,让笔者这样一个在ERP行业待了接近十年 ...
- Spring3系列8- Spring 自动装配 Bean
Spring3系列8- Spring 自动装配 Bean 1. Auto-Wiring ‘no’ 2. Auto-Wiring ‘byName’ 3. Auto-Wiri ...
- PL/SQL Developer去掉启动时自动弹出的Logon弹出框方法
以前用PL/SQL Developer 7.0版本,最近升级到PL/SQL Developer 11.0版本,但每次启动PL/SQL Developer都会自动弹出Logon窗口,并且选中其中的登录历 ...
- android一键分享功能不使用任何第三方sdk
在android中有自带的一键分享功能,不过它会把所有带分享的应用都找出来,如果我们只需要一些常见的分享应用,该如何做呢? 下面看我的效果图(横屏和竖屏自动适配): 接下来看我的调用(支持图片和文字分 ...
- LeetCode:4_Median of Two Sorted Arrays | 求两个排序数组的中位数 | Hard
题目: There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the ...
- GPT分区基础知识
大硬盘和WIN8系统,让我们从传统的BIOS+MBR模式升级到UEFI+GPT模式,现在购买的电脑,都是预装WIN8系统,为了更好的支持2TB硬盘,更快速的启动win8,预装系统都采取了GPT分区的格 ...
- POJ 2234 Matches Game
Matches Game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7567 Accepted: 4327 Desc ...