ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:70.96KB ,
资源ID:5850226      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5850226.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(indexdat文件剖析.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

indexdat文件剖析.docx

1、indexdat文件剖析index.dat文件剖析一 前言注重上网隐私和安全的人在每次上网后都会清除上网痕迹“删除cookies”、“删除掉上网的临时缓存文件”以及“删除上网历史”。你觉得这样,所有的一切都会被擦除掉了。但是如果有人告诉你:这是不够的,系统中还有一些地方保存了你的上网信息,你是不是感到很恐慌?这就是系统中的index.dat文件。Windows系统中会存在三个index.dat文件。它们分别用来保存IE上网的cookies、临时文件和上网历史的索引信息(现在知道为什么这些文件名字是index.dat了吧)。根据Windows系统版本不同,这些文件在系统中的位置也是不尽相同的。在

2、Windows 95/98/Me/ NT中,index.dat一般会存放在下面的位置中:C:/Windows/Cookies/index.datC:/Windows/History/History.IE5/index.datC:/Windows/Temporary Internet Files/Content.IE5/index.dat而在Window2000/XP系统中,index.dat一般会存在于下面的位置中:C:/Documents and Settings/Cookies/index.datC:/Documents and Settings/Local Settings/Histor

3、y/History.IE5/index.datC:/Documents and Settings/Local Settings/Temporary Internet Files/Content.IE5/index.dat这些index.dat文件是系统、隐藏的文件,它们不随IE浏览器中的cookies值、临时文件和历史记录的清除而删除这就是它的可怕之处。下面来详细描述index.dat文件的结构。二 Index.dat文件结构Index.dat文件分为两部分,头部分和条目(Entry)部分。所谓头部分,顾名思义就是文件开始部分。它记录着这个文件的总的信息,如文件文件格式版本、大小、子文件夹等等

4、。每个index.dat文件仅有一个头部分。其余的部分都是条目部分。Index.dat中的各种类型的条目数据结构不同,不过每个条目的前8个字节结构相同,系统就是用这两个DWORD字段来区分条目类型的。下面我们来具体分析一下各个部分:1 头部分index.dat的头部大小是固定的,为16K。其开始592个字节(0x250)为小(SMALL)的头部分。紧接着的空间是3948个DWORD,它用来作为分配MAP。数据结构如下:struct CacheDir DWORD nFileCount; CHAR sDirName8;typedef struct _MEMMAP_HEADER_SMALLTCHAR

5、 FileSignature28; /”Client UrlCache MMF Ver 5.2” DWORD FileSize; /index.dat文件的大小 DWORD dwHashTableOffset; /第一个哈希表的偏移 DWORD NumUrlInternalEntries; DWORD NumUrlEntriesAlloced; / DWORD dwGarbage; / 无效数据,只在/Zp8编译使用 LONGLONG CacheLimit; LONGLONG CacheSize; LONGLONG ExemptUsage; DWORD nDirCount; /子目录个数 Ca

6、cheDir DirArray32; /子目录名称 DWORD dwHeaderData33; MEMMAP_HEADER_SMALL;typedef struct _MEMMAP_HEADER : _MEMMAP_HEADER_SMALL DWORD AllocationBitMap3948; MEMMAP_HEADER, *LPMEMMAP_HEADER;2 各种条目结构上文说过每个条目都是以同样结构的2个DWORD开始的,这个结构如下:typedef struct FILEMAP_ENTRY DWORD dwSig; /条目标识 DWORD nBlocks; /条目占用多少个快(128字

7、节) *LPFILEMAP_ENTRY;dwSig用来标识各种类型的标识。表示字值说明SIG_FREE0xbadf00d本条目空闲,只有此类条目没有nBlocks成员。SIG_ALLOC0xdeadbeef已分配SIG_URL LRUURL值SIG_REDIRRDERREDIRSIG_LEAKKAELLEAKSIG_GLISTGLSTGLISTSIG_HASHHSAH哈希表关于各种条目的结构我们下面会详细说明。nBlocks用来描述此条目所占用的块数。注意index.dat中的块大小为128字节。21哈希表条目现在开始说明各种类型的条目。为什么先要说哈希表呢?这是因为index.dat使用一个

8、哈希表链来作为目录,从而能够快速找到指定名称的条目。Index.dat文件中每个哈希表大小都不能超过一个内存分页,即不能超过4K大小。每个哈希表部分是由下面的结构开始的,同时系统也是利用了这个结构,将index.dat中所有的哈希表部分链接起来的。struct HASH_FILEMAP_ENTRY : FILEMAP_ENTRYDWORD dwNext; / 下一个哈希表偏移(0表示为最后一个) /偏移以index.dat文件第0字节为基地址。 DWORD nBlock; / 本哈希表的序列号。从0,1,2.;紧接着这个结构就是一个哈希表,每个哈希表的关键是哈希函数,下面是这个哈希表的哈希函数

9、:PRIVATE DWORD HashKey (LPCSTR lpsz) union DWORD dw; BYTE c4; Hash, Hash2; const static BYTE bTranslate256 = 1, 14,110, 25, 97,174,132,119,138,170,125,118, 27,233,140, 51, 87,197,177,107,234,169, 56, 68, 30, 7,173, 73,188, 40, 36, 65, 49,213,104,190, 57,211,148,223, 48,115, 15, 2, 67,186,210, 28, 12

10、,181,103, 70, 22, 58, 75, 78,183,167,238,157,124,147,172,144, 176,161,141, 86, 60, 66,128, 83,156,241, 79, 46,168,198, 41,254, 178, 85,253,237,250,154,133, 88, 35,206, 95,116,252,192, 54,221, 102,218,255,240, 82,106,158,201, 61, 3, 89, 9, 42,155,159, 93, 166, 80, 50, 34,175,195,100, 99, 26,150, 16,1

11、45, 4, 33, 8,189, 121, 64, 77, 72,208,245,130,122,143, 55,105,134, 29,164,185,194, 193,239,101,242, 5,171,126, 11, 74, 59,137,228,108,191,232,139, 6, 24, 81, 20,127, 17, 91, 92,251,151,225,207, 21, 98,113,112, 84,226, 18,214,199,187, 13, 32, 94,220,224,212,247,204,196, 43, 249,236, 45,244,111,182,15

12、3,136,129, 90,217,202, 19,165,231, 71, 230,142, 96,227, 62,179,246,114,162, 53,160,215,205,180, 47,109, 44, 38, 31,149,135, 0,216, 52, 63, 23, 37, 69, 39,117,146,184, 163,200,222,235,248,243,219, 10,152,131,123,229,203, 76,120,209 ; / Seed the hash values based on the first character. Hash.c0 = bTra

13、nslate *lpsz; Hash.c1 = bTranslate(*lpsz+1) & 255; Hash.c2 = bTranslate(*lpsz+2) & 255; Hash.c3 = bTranslate(*lpsz+3) & 255; while (*+lpsz) / Allow URLs differing only by trailing slash to collide. if (lpsz0 = / & lpsz1 = 0) break; Hash2.c0 = Hash.c0 *lpsz; Hash2.c1 = Hash.c1 *lpsz; Hash2.c2 = Hash.

14、c2 *lpsz; Hash2.c3 = Hash.c3 *lpsz; Hash.c0 = bTranslateHash2.c0; Hash.c1 = bTranslateHash2.c1; Hash.c2 = bTranslateHash2.c2; Hash.c3 = bTranslateHash2.c3; return Hash.dw;经过这个函数产生的值,根据其低6位就是最终的数组行号(即相当于模64)。由于解决冲突的方法是:对同一个哈希地址提供7个位置空间。于是呈现在我们眼前是实际上就是一个横向7列、纵向64行的表结构:位置0位置1位置2位置6哈希地址0163从这样的表结构中,我们知道

15、这个哈希表以64为模。每个表允许7个相同值,它们按顺序排列在一起。所以每个哈希表结构可以索引448(647)个条目。下面就是每个元素的结构:struct HASH_ITEM DWORD dwHash; /哈希值,注意最后6位为0DWORD dwOffset; /指向的实体中的记录部分的偏移 /偏移以index.dat文件第0字节为基地址。;我们注意到了:数组元素的哈希值的低6为0。于是系统也是利用了这个特征,将这6位数用作了每个元素的格式表示:#define HASH_BIT_NOTURL 0x0001 / 位0#define HASH_BIT_LOCK 0x0002 /位1#define H

16、ASH_BIT_REDIR 0x0004 /位2#define HASH_BIT_HASGRP 0x0008 /位3#define HASH_BIT_MULTGRP 0x0010 /位4#define HASH_BIT_RESERVED 0x0020 /位5/ 上面的哈希值组合#define HASH_UNLOCKED 0 / URL条目,没被锁定#define HASH_FREE 1 / 空闲项,以前曾被使用过#define HASH_LOCKED 2 / URL条目, 已锁定#define HASH_END 3 / 空闲项,没被使用过#define HASH_UNLOCKED_SLASH

17、4 / URL entry, not locked, trailing slash redir#define HASH_REDIR 5 / redirect entry#define HASH_LOCKED_SLASH 6 / URL entry, locked, trailing slash redir#define HASH_FLAG_MASK 7 / illegal, used to mask out hash flags2 2 URL条目URL条目是使用的最多的条目。它的结构和LEAK条目的结构相同,如下:struct IE5_URL_FILEMAP_ENTRY : FILEMAP_E

18、NTRY LONGLONG LastModifiedTime; /最后修改时间 LONGLONG LastAccessedTime; /最后访问时间 DWORD dostExpireTime; /到期时间 DWORD dostPostCheckTime; DWORD dwFileSize; /硬盘缓存中的文件的大小 DWORD dwRedirHashItemOffset; / ask DanpoZ DWORD dwGroupOffset; union DWORD dwExemptDelta; / for SIG_URL DWORD dwNextLeak; / for SIG_LEAK ; DW

19、ORD CopySize; / 好像总是0x60 DWORD UrlNameOffset; / URL名称偏移。基地址是本URL条目的开始地址 BYTE DirIndex; / 属于的子文件夹索引 BYTE bSyncState; / automatic sync mode state BYTE bVerCreate; / 建立本ENTRY的CACHE的版本 BYTE bVerUpdate; / 升级本ENTRY的CACHE的版本DWORD InternalFileNameOffset; /硬盘上文件名(不包括目录)字符串的偏移, /基地址是本URL条目的开始地址。 DWORD CacheEn

20、tryType; /缓存类型 DWORD HeaderInfoOffset; /从WEB服务器中取本文件时的返回的HTTP头部信息 DWORD HeaderInfoSize; /和大小(注意包括最后的回车换行的) DWORD FileExtensionOffset; / should be WORD DWORD dostLastSyncTime; DWORD NumAccessed; / 存取次数(点击率) DWORD NumReferences; / 引用次数 DWORD dostFileCreationTime; / 好像是ULONG?;2 4 REDIR结构:struct REDIR_F

21、ILEMAP_ENTRY : FILEMAP_ENTRY DWORD dwItemOffset; / offset to hash table item of destination URL DWORD dwHashValue; / destination URL hash value (BUGBUG: collisions?) char szUrl4; / original URL, can occupy more bytes;2 5 GLIST结构:struct LIST_FILEMAP_ENTRY : FILEMAP_ENTRY DWORD dwNext; / offset to nex

22、t element in list DWORD nBlock; / sequence number for this block;三 显示系统缓存信息上面就是一个完整的index.dat文件的结构,利用这些结构我们就可以写出一个完整显示系统缓存信息的程序。这项非常琐碎的工作,于是微软专门提供了一个函数库WinInet。利用这个库中的函数,程序员可以相当方便地取出系统中缓存中的信息。关于WinInet库的使用方法网络上有很多文章,大家可以参阅。1 Exploring the URL Cache (2 Reading the Internet Explorer Cache(四 工作原理上面我们分析

23、了index.dat文件的结构,那么系统在什么时候读写这个文件的信息呢?1 COOKIES存取在用户用IE浏览器上网时,当开始输入一个网址后,IE会根据输入的网址、用户名等信息组成一个字符串,将这个字符串作为参数到哈希函数中产生一个哈希值,然后查找具体的URL实体。如果能够找到,那么IE就会具体分析此URL实体指定的COOKIES.TXT文件,看是否已经过期,若已经过期则删除;否则将在IE生成的HTTP请求报文中加上一个cookies:(就是.txt文件中的信息)这样的请求头部。在IE浏览器收到的HTTP响应报文中若响应头部中包含有Set-cookies:信息时,此时IE就会将这个COOKIE

24、S值保存在一个.txt文件中,并在index.dat文件中建立一个索引值。2 临时的缓存文件存取临时缓存文件是一种客户端缓存技术,它有利于节省网络带宽资源并能加快浏览速度。每次使用IE浏览器上网时,IE会发送一个请求报文要求传输一个文件(比如.htm文件、.jpg文件、.css文件等等)。WEB服务器响应请求,将所要求的文件传输给IE.。IE在显示这个文件的同时,会将它放到缓存目录中,并在Index.dat文件中添加索引。等下次,IE要求传输相同的文件时,IE便会在index.dat中找到这个文件的记录了(当然,如果根本没有传输下载过,index.dat中是不会找到这个记录的)。IE先检查这个

25、文件是否已经过期了(WEB服务器会在响应某些文件请求时,在HTTP响应报文中添加一个响应头部Age:来明确表示这个文件在客户机上保存的时间)。如果没有过期,IE便会直接利用这个缓冲文件而不会发送HTTP请求报文的。如果没有明确的过期时间或者已经过期来,IE便会在发送的HTTP请求报文中加上一条请求头部If_modified-since:。而WEB服务器发现所要求的文件并没有改变,它便会发送一个304 Not Modified报文,而不再传输文件了。3 历史记录历史记录只是用来保存曾经浏览过的网页的网址。它并不保存其他的一些信息。也不和发送/接受HTTP协议有关。所以比较简单。五 举例说明理论说

26、了很多,下面来举一个例子。通过这个例子我们看看系统是这样使用使用index.dat来索引缓存的以及系统是怎样使用缓存的。1 环境一台装有WEB浏览器的客户机,一台IP地址为90.0.0.6的IIS5的WEB服务器。服务器有一个名为test.asp的网页。test.asp包含一张图,并会设置一个cookies。2 第一次调用网页过程如下图所示:具体的HTTP报文如下:请求报文回应报文GET /test.asp HTTP/1.1Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-f

27、lash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*Accept-Language: enAccept-Encoding: gzip, deflateUser-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)Host: 90.0.0.6Connection: Keep-AliveHTTP/1.1 200 OKServer: Microsoft-IIS/5.0Date: Thu, 26 Oct 2006

28、 06:43:45 GMTX-Powered-By: ASP.NETContent-Length: 903Content-Type: text/htmlSet-Cookie: name=xiaoming; expires=Wed, 30-May-2007 16:00:00 GMT; path=/Set-Cookie: ASPSESSIONIDASARBACA=NOMPFILDEICPMBJBKCDGKGDC; path=/Cache-control: privateGET /img/1.gif HTTP/1.1Accept: */*Referer: http:/90.0.0.6/test.as

29、pAccept-Language: enAccept-Encoding: gzip, deflateUser-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)Host: 90.0.0.6Connection: Keep-AliveCookie: name=xiaoming; ASPSESSIONIDASARBACA=NOMPFILDEICPMBJBKCDGKGDCHTTP/1.1 200 OKServer: Microsoft-IIS/5.0X-Powered-By: ASP.NETDate: Thu, 26 Oct 2006 06:43:45 GMTContent-Type: image/gifAccept-Ranges: bytesLast-Modified: Sun, 15 Oct 2006 15:54:58 GMTETag: 075bc4372f0c61:19f8Content-Length: 66806我们再来看一下,index.dat文件有什么变化呢?1)临时缓存

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1