一、环境
(1)VMware Workstation虚拟机:虚拟机装有Win10操作系统,winXP,以及实验用的WinHex工具;
(2)Kinsgton 8G优盘:该优盘采用FAT32文件系统;
(3)优盘数据文件:优盘内的原始文件,为了模拟优盘真实使用环境。
二、内容
首先格式化:
然后向里面拷贝一些文件:
之后用winhex打开U盘逻辑磁盘:
下一步定位FSINFO区:
找到了FSINFO的标志位:0x41615252,之前的两个字节为引导记录(DBR)的结束标志0xAA55,以及之后的FSINFO签名:0x61417272
同时由图中数据可知,空闲簇数为0x001CF79F,十进制为1898399个簇,每个簇是4096字节,即7个G空间:与属性中对应
同时下一个可用簇为0x000001DF,十进制为479,本次实验0x01DF即为我们要写入数据的空间
由引导记录中的BPB结构可知,整个保留区(也就是DBR+FSINFO)占3098个扇区,共1586176个字节:
故可找到FAT表的起始部分:
其中第0个簇号和第1个簇号为0x0FFFFFF8 0xFFFFFFFF为FAT表起始位置,紧跟着的0x0FFFFFFF一般为根目录的所在簇,由于不足4k(一个簇单元大小),故一个簇就够了,所以第2个簇号中为结束符号。
下面,我们修改剩余空闲簇的字段:
由原来的空闲簇数为0x001CF79F修改为0x001CF79E,下一个可用簇由原来的0x000001DF改为0x000001E0:
下面进行简单的计算:我们FAT表的起始为第1586176个字节,我们FAT表第一个空闲簇号为0x0001DF,共480(因为是从0号簇开始计算,所以是479+1)个簇,共1920个字节,所以第一个可用簇是第1588092个字节:
将其改为0x0FFFFFFF:
同是将FAT2中数据修改:
找到FAT2:
由引导记录中的BPB结构可知,一个FAT表大小为0x39F3,十进制14835个扇区:
即为在1586176字节后再偏移7595520个字节:
修改表项如下:
之后找到:0x1DF号簇:是第479个簇
修改数据为0x66:
簇起始:
簇末尾:
最后保存,然后弹出U盘!!!!拖入一个txt文件:
实验成功!!!
三、扩展题:
下面是用程序实现上述功能:
环境为:
U盘,FAT32文件系统,winXP虚拟机(为什么使用winXP后续总结会提到),dev C++;
首先遇到的问题是:
主引导区没东西,故本次实验仅仅在FAT32文件系统的DBR部分在0x4000(第32个扇区)处开始:
打开磁盘函数
写磁盘函数:
读取DBR并输出有用信息:
读取FSINFO并修改空闲簇数和下一个可用簇号:
读取FAT1下一个可用簇号所在的扇区,并将下一个可用簇号改为0FFFFFFF
对FAT2相同操作:
将数据写入指定区域:
写入的是0xCC,也就是204
下图为起始情况于程序修改后对比:
FSINFO:
FAT1:
FAT2:
数据区:
四、实验结果及分析思考
一、
首先,最开始没使用破解版,所以在打开时是没有FAT索引的,并且也无法保存,也就是功能不全,故本次FAT表的寻找均是依靠BPB结构中的特定字段来寻找偏移的,使用最笨的方法,后来使用的是破解版
二、
其次就是保存之后 ,要弹出U盘,虽然不知道为什么必须要弹,但是没有这一步就会导致,修改之后没有完全修改,再次写入数据会将隐藏数据覆盖
三、
- 在扩展中,最开始用的win10,发现编译运行后一直是无法打开磁盘,之后发现编译后的EXE要用管理员运行,也尝试了使用提权函数,也没有很好效果,并且,就算用管理员模式,也仅仅实现读功能,写仍然写不进去,尝试修改注册表和将U盘安全模式降低,仍然无法做到,于是才使用了本次实验的winXP,包括主引导区一开始是有的,但是后来在实验过程中就消失了,也不清楚是为什么。
- 而且,在计算偏移量的时候也很头疼,尤其是定位数据区所在的扇区,需要将FAT2的起始和大小都求得,然后加主引导的32,并且数据区的簇是从二号开始的,0号和1号并不在数据区:
计算不对就不知道把数据写到哪里了,也是重复格式化之后慢慢摸索到的
- 有思考如何将程序写进去,应该时写一个二进制的可执行代码,并且用钩子指向,但是具体如何操作由于时间不够就没有再深入探索