您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 基于文件系统的数据恢复与隐藏技术
基于文件系统的数据恢复与隐藏技术刘旭liuxu51@gmail.com标题含义数据恢复磁盘上数据文件被删除后,利用数据恢复技术有条件地恢复被删除的数据。此技术也可用于磁盘灾难挽救。数据隐藏通过对磁盘扇区数据的修改与数据加密,实现对私有数据的有效隐藏。介绍哪些内容=on-going恢复与隐藏技术解决的问题理论基础C++读写物理扇区的方法数据恢复应用开发流程安全删除和彻底格式化的方法恢复与隐藏技术解决的问题恢复解决的问题隐藏解决的问题找回误操作造成的数据丢失计算机取证其他敏感数据保护网络攻击中隐藏木马等其他理论基础以FAT32为例FAT32文件系统中三个主要的数据结构几个重要的计算公式数据恢复技术原理数据隐藏技术原理理论基础-FAT32FAT32(FileAllocationTable32)是Microsoft公司开发研制的目前最流行的文件系统之一,之前的FAT16及FAT12与之机制类似。Microsoft推出的另一种文件系统NTFS(NewTechnologyFileSystem)虽然较FAT更复杂,主要加入了有关容错性、安全性、文件压缩、磁盘配额等新特性等,但从数据恢复的角度而言基本原理相同。原理对于在UNIX/LINUX操作系统下使用的文件系统也具指导意义。理论基础-FAT32-几个名词FAT:FileAllocationTable,文件分配表,有FAT12、FAT16和FAT32三类。簇:文件系统为数据写入磁盘时分配的最小存储单位。簇由一个或多个扇区组成。1一个文件即使只有一个字节大小,也要占用一个簇的空间。卷:逻辑上的分区标识。(不是物理上的)理论基础-FAT32(续)每个FAT卷均由三个基本区域组成0–启动扇区,即0扇区1–FAT区,文件分配表区域2–数据区0扇区、FAT表(存在于FAT区)和FAT目录结构(存在于数据区中)是FAT文件系统三个最主要的数据结构。理论基础-FAT32(续)-0扇区0扇区是FAT卷的第一个扇区,也称“启动扇区”。保存着FAT文件系统的第一个重要的数据结构BPB(BIOSParameterBlock)。BPB中保存着该FAT卷的各种关键信息0扇区物理数据0扇区结构表0扇区结构表(续)理论基础-FAT32(续)-FAT表FAT表是对应于数据区簇号号码的列表表项的大小与FAT的类型有关。FAT32用32-bit来表示一个表项,因此被称为FAT32。相应的,FAT16使用16-bit表示一个表项,FAT12为12-bit。FAT表提供了链式存储机制,这使得文件并不需要存放在磁盘的连续簇中。理论基础-FAT32(续)-FAT表FAT表的表项需要完成以下几项功能:准确记录磁盘中已经被文件占用了的簇。为每个已被占用的簇指明后继簇。能够指明某簇是文件的最后一簇,即没有后继簇。能指明簇已损坏。为了完成上述功能,FAT表的每一个表项记录的内容为该簇后继簇的簇号。如果该簇没有后继簇,则将值设为0xFFFFFF0F。理论基础-FAT32(续)-FAT表FAT表数据FAT表表项示例理论基础-FAT32(续)-FAT表FAT表中项的总数与磁盘卷的总簇数有关,簇越多项数也越多。只要为一个文件指明了开始簇,就能够借助FAT表找到保存此文件数据的所有簇。FAT32对目录(文件夹)和文件作相同看待,除属性外没有区别。由前表可知,数据区从第二簇开始。理论基础-FAT32(续)-FAT表第5簇在FAT32表项中表示成0x05000000为什么不是0x00000005?FAT32使用little-endian(小端)结构存储数据。对应则有Big-endian结构。比如:存储数据为0x05040302,计算对应的10进制:Little-endian:02*0x01000000+03*0x010000+04*0x0100+05Big-endian:05*0x01000000+04*0x010000+03*0x0100+02理论基础-FAT32-目录结构目录项分为长目录项和短目录项。任意一个文件(或文件夹)在磁盘上均保存有自己对应的32位字节的目录项。一个文件可以没有长目录项(如果主文件名长度小于8),但不能没有短目录项。从数据恢复的角度出发,只需考虑短目录项,因为它已经包含了对应文件除长文件名之外的所有信息。理论基础-FAT32-目录结构(续)Readme.txt、Test.txt、Mydir文件夹的目录结构理论基础-FAT32-目录结构(续)FAT32对目录(文件夹)和文件作相同看待,除属性外没有区别。对于长文件名文件,文件系统除了要保存其长文件名信息外,还生成对应的短文件名目录项,并用短目录项保存该文件的各种关键信息。理论基础-FAT32-目录结构(续)上表各项中,有4个变量对数据恢复技术最为重要,它们描述了3部分信息。DIR_NameDIR_FstClusHI和DIR_FstClusLODIR_FileSize理论基础-FAT32-目录结构(续)DIR_NameDIR_Name用于记录文件的名称。它由8个字符的主文件名和3个字符的扩展名共同组成。主文件名位数不足时填充0x20。例如:某文件名为“test.pl”,在目录项中文件名的保存应为:5445535420202020504C20。DIR_Name[0]如果为0xE5,表示此目录项为空(即目录项不包含任何文件或文件夹)。理论基础-FAT32-目录结构(续)DIR_FstClusHI和DIR_FstClusLODIR_FstClusHI和DIR_FstClusLO共同指明了该文件在磁盘卷中的起始簇。有了起始簇,即可通过查询FAT表确定该簇的后继簇,进而找到文件数据存放的所有簇的簇号。例如,某目录项中,DIR_FstClusHI=0xE082,DIR_FstClusLO=0x4F00,则它的开始簇计算应当是:0x00×0x01000000+0x4F×0x010000+0x82×0x0100+0xE0理论基础-FAT32-目录结构(续)DIR_FileSize文件大小是文件占用簇总簇数的重要参考。如果FAT表被损坏,则无法知道某文件的簇链信息,文件大小将作为恢复操作结束的唯一依据。理论基础-FAT32-目录结构(续)理论基础-FAT32-几个重要公式公式一、计算数据的起始扇区FirstDataSector:定义RootDirSectors为根目录(磁盘卷的目录项入口)所占的扇区总数。这里扇区号是针对卷中包含BPB的第一个扇区的偏移量,因为包含BPB的第一个扇区是0扇区。但它并不和磁盘的物理扇区相对应,因为物理0扇区并不一定就是卷的0扇区。RootDirSectors=((BPB_RootEntCnt*32)+(BPB_BytsPerSec–1))/BPB_BytsPerSec;FirstDataSector=BPB_RsvdSecCnt+BPB_NumFATs*BPB_FATSz32)+RootDirSectors;理论基础-FAT32-几个重要公式公式二、给定一个合法簇号N,计算该簇的第一个扇区号:公式三、给定一个合法簇号N,计算它在FAT表的位置:FirstSectorofCluster=((N–2)*BPB_SecPerClus)+FirstDataSector;FATOffset=N*4;ThisFATSecNum=BPB_RsvdSecCnt+(FATOffset/BPB_BytsPerSec);ThisFATEntOffset=FATOffset%BPB_BytsPerSec;理论基础-FAT32-数据恢复原理操作系统的删除操作仅仅是为被删除文件做了删除标记,即将目录项的首位(DIR_Name[0])标记为0xE5。删除操作完成后FAT表并没有被重新分配,分配和更新将在写入操作出现时进行。删除操作并没有将实际的数据区清零。对于FORMAT操作而言,仅仅是将FAT表清零,表明该卷所有的簇可用,而未对数据区的数据清零。如果连续空间足够用,文件管理系统默认为写入的文件连续分配空间。理论基础-FAT32-数据恢复原理执行删除(包括格式化)操作后,文件的实际数据在没有被新数据覆盖前依然存在。借助读取扇区物理数据的方法可以将数据找回。文件系统的做法对操作系统来说是没有问题的,它不仅完成了应执行的操作,同时保证了操作具有较高的效率。理论基础-FAT32-数据隐藏原理将还未分配簇标记成坏簇,使用这些簇实现数据隐藏。一个文件如果大小不是簇大小的整数倍,该文件占用的最后一簇中,将浪费一部分空间。这部分空间可以用来隐藏数据。掌握了物理读写磁盘簇数据的方法,实现上述应用没有问题。C++读写物理扇区的方法WindowsNT操作系统以后,Windows允许应用程序使用CreateFileAPI函数打开一个磁盘设备或者磁盘卷。使用时只需在函数的lpFileName参数中指明磁盘卷的名称即可。名称的书写格式为“\\.\PHYSICALDRIVEx”。例如,应用程序希望打磁盘的D卷,输入格式为“\\.\D:”。成功打开磁盘卷后,即可象访问普通文件一样使用ReadFile、WriteFile和SetFilePointer等函数进行相应的操作。C++读写物理扇区的方法示例HANDLEhCD;DWORDdwNotUsed;hCD=CreateFile(\\\\.\\D:,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);if(hCD!=INVALID_HANDLE_VALUE){LPBYTElpSector;lpSector=(unsignedchar*)VirtualAlloc(NULL,512,MEM_COMMIT|MEM_RESERVE,PAGE_READWRITE);SetFilePointer(hCD,0,NULL,FILE_BEGIN);ReadFile(hCD,lpSector,512,&dwNotUsed,NULL);VirtualFree(lpSector,0,MEM_RELEASE);}CloseHandle(hCD);读取D:卷0扇区512字节写扇区方法与此类似数据恢复应用开发流程区别对待删除文件的两种操作方法对目标文件直接删除(文件被标记)删除文件夹,文件夹下所有文件均被删除(仅标记了文件夹)流程用伪代码描述,主要函数有3个:列举目录内容(数据区开始簇)恢复文件(文件的开始簇,文件的大小,文件名)列举并恢复已删除目录(开始簇)数据恢复应用开发流程(续)列举目录内容(数据区开始簇){//每32字节识别一次for(intI=0;IBPB_BytsPerSector*BPB_SecPerClus;I+=32){if(找到一个目录)列举目录内容(该目录的开始簇);if(找到一个已删除文件)恢复文件(文件的开始簇,文件的大小,文件名);if(找到一个已删除目录)列举并恢复已删除目录(此目录开始簇);}if(查询FAT表,当前列举的簇不是根目录的最后一簇)列举目录内容(FAT表中指明的当前簇的下一簇);}数据恢复应用开发流程(续)恢复文件(文件的开始簇,文件的大小,文件名){if(文件大小=BPB_BytsPerSector*BPB_SecPerClus)读数据并保存到指定位置(文件开始簇,文件名,文件大小);eles{while(查询FAT表,当前簇不是文件的最后一簇){读数据并保存到指定位置(当前簇,文件名,BPB_BytsPerSector*BPB_SecPerClus);当前簇=FAT表指明的后继簇;}数据并保存到指定位置(当前簇,文件名,文件大小%(BPB_BytsPerSector*
本文标题:基于文件系统的数据恢复与隐藏技术
链接地址:https://www.777doc.com/doc-3868929 .html