index.dat剖析.doc

上传人:夏** 文档编号:557511654 上传时间:2023-02-24 格式:DOC 页数:11 大小:197.50KB
返回 下载 相关 举报
index.dat剖析.doc_第1页
第1页 / 共11页
index.dat剖析.doc_第2页
第2页 / 共11页
index.dat剖析.doc_第3页
第3页 / 共11页
index.dat剖析.doc_第4页
第4页 / 共11页
index.dat剖析.doc_第5页
第5页 / 共11页
点击查看更多>>
资源描述

《index.dat剖析.doc》由会员分享,可在线阅读,更多相关《index.dat剖析.doc(11页珍藏版)》请在金锄头文库上搜索。

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

2、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/History/History.I

3、E5/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)部分。所谓头部分,顾名思义就是文件开始部分。它记录着这个文件的总的信息,如文件文件格式版本、大小、子文件夹等等。每个index.da

4、t文件仅有一个头部分。其余的部分都是条目部分。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 FileSignat

5、ure28; /”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; /子目录个数 CacheDir DirA

6、rray32; /子目录名称 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字节) *LPFILEM

7、AP_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.;紧接着这个结构就是一个哈希表,每个哈希表的关键是哈希函数,下面是这个哈希表的哈希函数:PRIVATE DW

9、ORD 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,181,103, 7

10、0, 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,145, 4, 33,

11、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,153,136,129,

12、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 = bTranslate *lps

13、z; 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.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

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号