◆王中杉
(四川发展(控股)有限责任公司数字化中心 四川 610041)
随着计算机取证的程序化及其技术的完善,反取证发展[1]为针对计算机取证过程的各阶段及其形成证据链(Chain of Custody)的条件,破坏电子证据的调查、保护、收集、分析和法庭诉讼,减少被获取证据数量,降低被获取证据质量,从而尽量隐藏或不在对方系统甚至自己系统中留下法律意义上的证据。目前,计算机反取证技术[2]主要有数据擦除、数据隐藏、数据加密、数据重定向等,信息隐藏技术是将特定信息隐藏在数字化宿主信息如数字图像、音频及视频中的方法,如利用小波域的图像融合算法将特定的信息嵌入到宿主信息中,使载体文件尽可能地不失真并要求具有极高的鲁棒性,其对外的表现形式为宿主信息,在没有经过特定处理的情况下明文信息是不可见的,只有将带有明文信息的宿主信息进行分离算法的处理才能将明文信息无损地全部恢复出来,比如反取证工具Runefs就利用一些取证工具不检查磁盘的坏块的特点,把存放敏感文件的数据块标记为坏块以逃避取证。
本文主要研究基于文件系统的信息隐藏技术,通过分析NTFS文件系统空闲区域,设计了一种快速有效的分区文件扫描算法,重构文件目录树结构,将所有满足条件即可隐藏区域大小超过1KB的正常文件以树型结构方式展现,供用户合理的选择一个或者多个文件作为载体,将文件写入到这些载体的空闲区域,能快速有效选择性隐藏文件,并结合有序规则的加密算法,实时文件信息隐藏。
MFT[3]是NTFS卷结构的核心,系统通过MFT来确定文件在磁盘上的位置以及文件的所有属性,MFT是一个与文件相对应的文件属性数据库。文件删除、修改等操作都直观反映在MFT表中,通过WinHex软件可以分析出MFT文件记录头与属性列表,其中属性头部标识了属性的类型、属性数据的相对偏移及其长度,属性数据真实反映文件或目录存放相关信息。本文重点阐述与反取证密切相关的10属性、30属性、80属性、90属性。
(1)10属性。包括只读、系统、存档、隐藏及MAC属性等基本文件属性。其中文件相关的MAC时间即存放在相对属性值的偏移00H、08H、18H处,均占8个字节。程序设计中,采用结构体FILETIME即可存放64bit的MAC时间,然后再调用Microsoft提供的上层API函数FileTimeToSystemTime,将UTC时间转换为本地时间即可重现文件的MAC日期及时间。
(2)30属性。记录了父目录的MFT参考号、文件名。MFT参考号即MFT的相对$MFT表的序号,给定一个MFT参考号N,通过公式:N*2+BPB_MFTStartClus * 8,即可求出此文件MFT表项在MFT区域的物理位置,通过上述方式,在已知父目录的MFT参考号即可映射到其父目录的MFT表项位置,从而可获取父目录MFT表项的相关属性信息,为后续重构已删除文件目录树建立起了溯源支点。
(3)80属性。用于存放文件真实数据或文件数据存放的物理偏移位置。80属性可为常驻属性或非常驻属性,取决于文件数据大小。当文件数据很小,当文件超出一定大小后,MFT中的80属性下会采用簇运行列表结构(Data Runs List)对文件内容进行描述。其中80属性头偏移20H处的值记录了数据运行(Data Runs)的偏移地址;偏移04H处则记录了属性的总长度,反映了文件数据是否离散存储、占用的簇数及其簇的物理偏移位置,其偏移值通过取模运算解析,若起始簇号N占1个字节时且N>0x80H,则取负值,N=(N mod 0x80)-0x80;若N占2个字节且N> 0x8000,则N=(N mod 0x8000)-0x8000;若N占3个字节且N> 0x800000,则N=(N mod 0x800000)-0x 800000;依次类推,准确解析出每个簇运行起始簇偏移。
(4)90属性。该属性是实现NTFS的B+树索引的根节点,包括标准属性头、索引根和多个索引项。每个索引项中,偏移00H、10H处分别记录了此文件的MFT参考号及其父目录的MFT参考号;偏移08H处则记录了每个索引项的大小,故,可通过索引项大小转向到下一个索引项,再结合属性头偏移04H处描述的90属性总长度,获取该目录下所有文件及子目录的MFT参考号。每个索引项中,偏移00H、10H处分别记录了此文件的MFT参考号及其父目录的MFT参考号;偏移08H处则记录了每个索引项的大小,故,可通过索引项大小转向到下一个索引项,再结合属性头偏移04H处描述的90属性总长度,即可获取该目录下的所有文件及子目录的MFT参考号。在程序设计中,可通过读取INDX索引结构,获取任一指定目录下的所有文件及其子目录。
本文提到,非常驻80属性通过簇运行列表(Data Runs List)反映了文件数据是否离散存储、占用的簇数及其簇的物理偏移位置,而文件大小正好为簇大小整数倍概率太小,文件末簇往往存在几个空闲扇区,将分区下所有的类似文件遗留的空间累加,将会是一个很大的空闲空间,足以被利用以存放大量的隐私信息。在程序上可遍历整个分区下的所有MFT表项,MFT表项的80属性下存放了指定文件的实际大小:相对80属性头偏移0x30位置的4字节内容即为文件实际大小;而文件所占簇数则存放在80属性的DataRuns簇运行结构列表中。根据文件实际大小和文件所占簇数,即可确定文件末簇空闲空间大小,实现信息隐藏。寄宿文件可隐藏区域大小和隐藏起始扇区可依据以下两个公式获取:D=R -F mod R;Sr=C -D/ Sec。其中R、F、C、Sec分别为每簇大小、文件实际大小、文件所占簇数和每扇区大小。
(1)收集满足条件的寄宿文件。通过遍历NTFS卷下所有的MFT表项,判断文件是否为正常文件及文件名、文件数据起始簇号、簇数等。在遍历算法上,采用了目录树倒序构建算法,即从目录树的底部开始逐渐往上构建整个目录树,而不是循规蹈矩地从90属性开始依次获取根目录下所有的子文件及其子目录,实际上这种方式行不通,因为当分区长时间未经过磁盘整理,即分区下存在大量零散文件碎片时,INDX结构就有可能发生偏差,即通过MFT参考号的偏移位置定位将会出错。
算法基本流程如下所示:
1)读取$MFT表项中80属性下的簇运行列表,获取每个簇运行结构的起始簇号与簇数,再根据首簇号和簇数,循环遍历NTFS卷下每个簇运行结构中所有的MFT表项。
2)读取MFT表头,判断文件及目录是否为正常文件,若文件已删除或者为目录文件,则转下一个表项;不然,则获取表项中30属性下的文件名或目录名及父目录的MFT参考号。
3)若父目录的MFT参考号不是0x05(即根目录下的文件或子目录),则转步骤4;然后再判断此MFT对应的是文件还是目录,若为非目录文件,则读取80属性值,获取文件数据或文件数据的首簇号及簇数,存储到新节点结构体中,然后将此节点插入目录树中;若为目录文件,则直接将此节点插入目录树中。
4)根据父目录的MFT参考号,读取每个父目录的MFT参考号,获取目录的文件名,然后再调用搜索函数,在已部分构建的目录树中寻找此文件是否在目录树中,若没有搜索到,则新建一个新节点,并将文件的文件名、文件及父目录的MFT参考号分别保存在该节点中,再判断此目录是否为根目录,若非,则保存此节点到目录树结构体的Vector数组中然后递归调用,转步骤(4)继续读取其父目录的MFT号,若为根目录,则将此节点插入目录树合适节点下。算法流程图如图1所示:
图1 寄宿文件目录树重构算法
(2)通过有序规则二叉树重构寄宿文件目录树。针对海量文件节点,设计一种良好算法加速构建多层次性目录树至关重要,因为每次对目录树进行先序遍历时,总是涉及节点的入栈与出栈操作,对目录树的搜索次数也是极频繁,若目录树本身缺失规则,搜索重构效率极低。本文设计了一种规则二叉树构建算法,如图2所示:
图2 有序规则二叉树的重构模型
1)图中各节点代表目录或满足条件的寄宿文件,且节点左子节点称为该节点的孩子结点,位于该节点的下一级目录。右节点则与该节点位于同一级目录。
2)头节点A不代表任何含义,只为目录树的头节点,且节点C、G均为根目录下节点。节点B、E、M都为节点A的子节点,处于同一层目录。
3)若E节点为非目录文件,则M及其各右子节点均为非目录节点,即位于同一层的节点,目录节点总是在非目录节点的前面,每次目录节点采用首插法,而文件节点采用尾插法。
通过上述算法设计,可极大地减少了目录树重构的时间,因为分区下存在的非目录文件总是远远超出目录文件树,若当发现此文件为目录文件时,则完全没有必须考虑待搜索的非目录文件节点。另一方面,在实施隐藏技术上当待隐藏文件较大时,传统的隐写技术需要大量开销去选择合适大小的载体,且一旦被对方识破此手法,则会变得毫无价值[4]。
前面已经分析了如何快速寻找寄宿文件,并按照目录树结构方式可视化展示,便于结合隐藏文件大小合理隐藏文件,但目前也存在一些取证软件,结合EasyRecovery、FileRecovery软件技术,能够合理推演出文件存在异常,比如文件头标识为删除,文件大小与实际内容大小不一致等问题。为更好地躲避黑客们开展较为专业化的技术性分析取证,本文探索结合加密算法对隐藏文件采用DES、RSA加密算法对文件加密后,再按照一定规则离散,然后分散存储到寄宿文件中,确保文件安全。本文采用了一种基于有序规则的加密算法进行预处理,然后再进行嵌入,即嵌入的数据是乱序的密文。
算法流程说明:
(1)首先对特定文件明文信息P进行加工处理,采用通信双方约定的协议(构建规则表),规则表的构建采用RSA、Elgama等公钥加密体制协商,为保证协商规则具有不被黑客窃取及抗抵赖性等特点,引入数字签名技术。
(2)通信双方约定好有序规则表后,发送方按照规则表,对特定信息逐比特进行调整,使特定信息按照已定规则重排,输出重构后的数据文件Pn。
(3)通信双方再次约定加密密钥及加密算法,约定规则同(2)。
(4)发送方依据约定好的加密算法及密钥,对数据文件Pn进行加密处理,输出密文文件Cb,再通过互联网发送给接受方。
在软件设计与编码中,基于采用异或运算,基于CBC模式的DES加密算法实现,异或运算规则:
其中,M代表前一个字节,N代表文本的最后一个字节,随后依次向文件数据的中央靠拢,直到所有的字节全部交换完成。
构建规则表加密函数算法:
密钥存放与提取的设计上,使用了一种图像特征提取方法,即发送方在图像隐写前,从载体图像中提取特征作为密钥,用来加密秘密图像,提取方提取加密图像后,从含密图像中提取特征作为密钥解密加密图像。
结合上面的理论分析,笔者开发设计了一款基于NTFS分区的数据隐藏反取证软件。通过对不同容量的分区和分区下存放文件的数量,对软件的扫描速度进行了对比测试,采用Intel(R)i5 CPU @ 2.70GH电脑测试,分区容量20GB,文件个数2万,时间开销约为30s.文件扫描及重构开销略优于EasyRecovery软件。在搜索已删除文件上,由于本文在隐藏文件时,对已删除文件标识、文件大小进行了改写,EasyRecovery软件在磁盘文件全量搜索上也没有再匹配到寄宿文件,较好地躲避了文件搜索,避免了寄宿文件被标识为已删除文件,导致文件被二次覆写的可能。
文件隐藏与加密技术较多,很多学者选择大图像文件作为寄宿文件主体,如用结合图像加密和深度学习的高容量图像隐写算法实施隐藏[5]。本文主要论述了基于NTFS文件系统的反取证技术,提出了一种利用正常文件所占的实际空闲磁盘空间,实施文件隐藏新方法,通过有序规则二叉树重构寄宿文件目录树,采用倒叙目录树方式,搜索遍历的文件及目录,极大减少深层次递归函数去读取其对应的父目录及深层次父目录的节点信息次数,快速计算出每个寄宿文件的可隐藏区域大小及隐藏区域的起始扇区数,以准确将机密文件嵌入到指定区域,并结合更探索结合加密算法对隐藏文件采用DES、RSA加密算法对文件加密,每个分组块的密文首先与下一个分组块的明文进行异或运算,然后再作为加密的输入块进行加密,再按照一定规则离散,然后分散存储到寄宿文件中,有效地增大了密码分析的难度,确保文件安全,可更好地躲避黑客们开展较为专业化的技术性分析取证。