很基础的东西,权作笔记记录,高手莫笑。
同学电脑中了病毒,将U盘下的文件夹属性全部改成系统隐藏属性,但是文件夹下的文件都是正常的。
呵呵,对这个病毒就不深究了,了解的人自然知道它的工作原理。现在关心的是,如何把这个文件夹的系统隐藏属性去掉。当然,直接用专杀u-clear就可以;不过这是之后才出来的;
如果没有专杀,我们也可以用其他办法来去掉这个隐藏属性。

U盘系统都是FAT32系统的,FAT32文件系统比较简单;相对来说,无论是安全,还是效率,亦或是其他方面,比较优秀是NTFS文件系统了。现在,我就以NTFS系统为例,来说明如何在磁盘扇区级修改文件属性及相关原理。

一.  实验部分


1.  在C:\盘下创建一个名为data.txt的文件,内容为:datastore and data manager。
设置属性为只读,隐藏,存档;
2.  现在用WinHex打开C:盘来看,
操作:Tools->Open Disk->盘符C:HD0
看到打开的C盘数据;
在窗口上方浏览到data.txt文件,右键->Position->go to FILE Record,如图



3.   打开后,查看16进制数据编辑区,如图所示是data.txt的MFT数据:




  这里,要结合NTFS文件系统在磁盘上的存储结构原理来解释。
  首先NTFS文件是一系列属性的结合,每个文件都由若干属性;其中,有些属性是必须的,有些属性是可选的。每个文件对应一个MFT(主文件记录),这个MFT记录了该文件在磁盘上存储的相关信息。每个MFT项的大小为1K,占两个扇区;分为两部分:一部分为MFT头,另一部分为属性列表;MFT头的结构很小,其他空间都属于属性列表区域,用于存储各种特定类型的属性。
  属性有很多类型,每种类型的属性都有自己的内部结构。但其大体结构都可以分成两个分部:属性头和属性内容。由于属性又常驻属性和非常驻属性,所以属性头的结构也有所差别,但不是是常驻还是非常驻属性,他们的属性头的前16个字节的结构是相同的。
  注:关于NTFS文件系统格式,看参考《数据恢复》、《数据重现》、《windows internal》之类的书籍。
  
  前面,粗略的说了一下MFT;每一个文件对应一个MFT,现在我们通过winHex定位到了data.txt的MFT,然后就来分析MFT数据。
  其中,前面的白色区域的数据,范围(0c5bbe000  0c5bbe037)即为MFT头数据,这里不做分析。当然,对于一个文件,这个MFT头是极为重要的,只是我们这里的重点是找到文件属性的偏移位置。
  接下来,(褐)红色区域就是文件的第一个属性列表,标号10,代表标准属性,由开始的前四个字节标识。(MFT由MFT头和属性列表组成,现在分析的是第一个属性列表,标号为10的标准属性列表)
  关于属性列表的各个字段的含义。一下是属性头,如下:
  a   0x00-0x03: 4个字节,属性类型,0x10表示是标准属性
  b   0x04-0x07: 4个字节,包括属性头在内的属性长度,这里是0x60,也就是96个字节的长度;
  c  0x08-0x08: 1个字节,表示是否为常住属性标志,0x00标识为常驻;
  d  0x09-0x09: 1个字节,属性名的长度,可以标识255长度的属性名,如果为0,标识没有属性名。
  …………
  e  0x14-0x15:  属性内容相对于本属性的属性头起始位置的偏移。

  上面说完了属性头,在说属性内容:下面的内容前一列标识相对属性头的偏移
  00-07   8字节, 建立时间
  08- 0f  8字节, 最后修改时间          
  10-17  8字节, MFT改变时间
  17-1f  8字节, 最后访问时间
  20-23  4字节, 属性标识,这里就是“只读,隐藏,系统,存档,临时……”属性的标志 ;在这里,就是23 00 00 00,在红色区块内有绿色块高亮的字节开始。

  其他的属性字节,暂且不看了。
4.   现在看,属性标识的含义
0x0001,  只读
0x0002  隐藏
0x0004  系统
0x0020  存档
0x0100   临时  …………
5.  修改属性,定位到文件data.txt的属性偏移位置,用winHex就可以随意修改属性了,修改以后保存。
修改方法:右键->beginning of block,选中开头;同样,end of block选中结尾;然后右键->edit->fill block,填充新的值。 

注:
1.  winHex是扇区级工具,由winHex读的MFT数据,都是通过对分区卷的文件系统的解析展现给我们的。所以,我们修改了数据,保存,都是属于扇区级的操作,并不经过文件系统。那么,磁盘缓存每个最小单位是256k的视图,只是改写若干字节,缓存数据是不会立即写到磁盘的;所以要想看到修改的结果,必须要刷缓存,但是磁盘缓存不像文件系统缓存一样容易刷(关于刷文件系统缓存的方法不做介绍),最简单的刷磁盘缓存的办法就是正常重启下电脑。专业一点的方法是,先unmount分区卷的文件系统,然后再mount分区卷的文件系统;或者构造irp_mj_flush_buffers;呵呵~~不过在这里,操作的文件内容可能已经被explorer.exe读到内存,并且没有被换页出去,这样即便我们刷新了磁盘缓存,也不能立即看到更改情况的;最直接的办法就是重启机器。
2.  绿色块的数据,紫色块数据,蓝色块数据,也分别是属性列表数据,这里不多说了,感兴趣的查相关资料。

二.  编程实现
前面利用扇区级工具winHex改写了文件系统,其实我们绕过了很大的难题,就是如何定位给定文件的MFT;其实这些都需要解析文件系统,FAT比较简单,NTFS是比较复杂的。不过,对于专业来说,编程解析NTFS文件系统还是很有价值的。
winHex的原理显而易见,按照文件系统格式解析分区卷数据,所有操作都是直接对卷的扇区级操作,而不是针对簇。

引出的问题:
熟悉文件系统结构,FAT32,NTFS;
那么,通过编程,就可以批量更改这样的属性了。当然,如果解析文件系统,只是为了修改几个文件夹的属性,那就有点“大炮打蚊子”的嫌疑了。事实上,解析文件系统可以帮助你理解很多系统顶层相关,IO管理器,虚拟内存管理,缓存管理器,文件驱动,磁盘存储系统等相关内容。这里不多展开了,过段时间,想系统的编程解析下FAT32,NTFS;最近很忙,想法很多,却没时间做自己想做的事情~~~~