本发明属于计算机终端安全管理技术领域,具体涉及一种可隐藏指定文件及文件夹的方法。
背景技术:
在一些场合会出现多人共用一台电脑的情况,用户在使用电脑过程中,经常有一些文件或者文件夹不希望被该电脑的其他用户看到,所以需要将其隐藏起来,例如:涉及个人隐私的文件或文件夹、重要工作文件或文件夹、重要软件的配置文件或文件夹等。
现有技术中,大多数人采用的方法为:将需要隐藏的文件或文件夹放置在一些极不常用的文件目录下,或者使用windows操作系统自带的隐藏文件及文件夹功能对需要隐藏的文件及文件夹进行隐藏,或者简单地用windows的文件隐藏属性隐藏起来。上述隐藏方法虽然可以临时使目标文件及文件夹不可见,但是技术深度十分有限,易被其他人轻易发现,并将其修改成非隐藏状态。
目前也有一些更为高级的隐藏指定文件及文件夹的方法。通常的实现方法有两种:第一种,通过对windows中的内核函数api进行hook来达到控制文件显示的功能,具体做法是,首先查找windowsssdt表,查找到表内zwquerydirectoryfile函数的地址指针,然后重定向指向querydirectoryfile函数,来控制对文件夹及文件的返回目录进行隐藏。第二种,采用windows文件层绑定过滤驱动的方式对irp_mj_directory_control请求的返回值进行过滤,去除返回值中需要隐藏的文件及文件夹节点,将其他值返回到应用层在浏览目录中显示,从而达到隐藏文件及文件夹的目的。
以上两种方法虽然都能够达到隐藏文件及文件夹的目的,但是也存在一定的缺陷。首先,第一种方法很容易在其他程序/进程查找ssdt中函数地址时被发现,在发现后还可轻易的还原对zwquerydirectoryfile函数的hook。由于该方法采用hook的方式实现,不是所有windows版本都支持这种方法的实现。例如windows64位版本,由于采用patchguard保护内核机制禁止对windows内核进行hook,所以windows所有64位版本操作系统都无法使用这种方法进行文件或文件夹的隐藏。其次,采用windows过滤irp_mj_directory_control请求的方法,虽然可以绕过patchguard机制对浏览目录io请求进行过滤,但是依然存在个别驱动可以绕过文件过滤驱动来查找显示文件列表的问题。
上述两种方法都已经是比较常见和通用的技术,实现难度较低,常见的系统管理工具很多都能轻易对其破解,实用性较差,易造成隐藏信息的泄漏。
技术实现要素:
针对现有技术存在的缺陷,本发明提供一种可隐藏指定文件及文件夹的方法,可有效解决上述问题。
本发明采用的技术方案如下:
本发明提供一种可隐藏指定文件及文件夹的方法,包括以下步骤:
步骤1,创建自定义的文件隐藏驱动模块,所述文件隐藏驱动模块通过inf文件安装到windows系统中,并将所述文件隐藏驱动模块插入到文件系统驱动设备栈中;创建io控制设备,所述io控制设备与所述文件隐藏驱动模块之间具有通信通道;所述io控制设备用于接收并存储客户端传输的需隐藏文件或文件夹的白名单;
步骤2,在windows系统启动时,所述文件隐藏驱动模块同时被启动;
当某个磁盘的磁盘分区卷被加载时,windows系统向所述文件隐藏驱动模块发送磁盘被加载的通知消息;其中,所述通知消息中携带有正在被加载的卷设备对象;通过该卷设备对象可查询到当前被加载的卷名称;
步骤3,所述文件隐藏驱动模块接收到所述通知消息时,立即挂载到与被加载卷对应的磁盘文件系统中;
步骤4,所述文件隐藏驱动模块调用文件系统变更通知函数filesystemchangednotification,所述filesystemchangednotification通过以下方法得到公共文件夹控制函数commondirectorycontrol所在地址:
步骤4.1,所述文件隐藏驱动模块中预建立列表,所述列表用于存储磁盘文件系统版本号与commondirectorycontrol函数偏移量之间的对应关系;
步骤4.2,所述filesystemchangednotification函数确定所述磁盘文件系统的版本;其中,所述磁盘文件系统的版本包括ntfs版本和fat32版本;进一步的,所述文件隐藏驱动模块加载当前磁盘分区ntfs或者fat32文件系统驱动后,查找到ntfs或者fat32文件驱动版本号;
步骤4.3,所述文件系统变更通知函数查找步骤4.1建立的列表,得到与步骤4.2得到的版本号对应的commondirectorycontrol函数偏移量;
所述文件隐藏驱动模块根据不同的文件驱动版本号加载对应的文件系统驱动pe文件,再加载步骤4.3得到的commondirectorycontrol函数偏移量,得到windows系统中commondirectorycontrol函数所在地址;
步骤5,所述文件隐藏驱动模块自定义伪装的公共文件夹控制函数fakecommondirectorycontrol,并将所述fakecommondirectorycontrol函数的入口挂钩到所述windows文件系统内部commondirectorycontrol函数中;
步骤6,每当产生与文件目录操作相关的irp操作请求时,所述fakecommondirectorycontrol函数将所述irp操作请求转发给所述commondirectorycontrol函数;
步骤7,所述commondirectorycontrol函数处理所述irp操作请求,并将irp操作结果发送给所述fakecommondirectorycontrol函数;
步骤8,所述fakecommondirectorycontrol函数判断所述irp操作结果所对应的irp操作请求是否为filebothdirectoryinformation类型或fileidbothdirectoryinformation类型irp,如果不是,执行步骤9;如果是,执行步骤10;
步骤9,所述fakecommondirectorycontrol函数将所述irp操作结果返回给windows系统上层;
步骤10,所述fakecommondirectorycontrol函数判断所述irp操作结果中是否存在位于所述白名单中的文件或文件夹;如果不存在,则将所述irp操作结果返回给windows系统上层;如果存在,所述fakecommondirectorycontrol函数从所述irp操作结果中删除位于所述白名单中的文件或文件夹,得到文件或文件夹隐藏后的irp操作结果,然后将所述irp操作结果返回给windows系统上层。
优选的,所述fakecommondirectorycontrol函数从所述irp操作结果中删除位于所述白名单中的文件或文件夹,得到文件或文件夹隐藏后的irp操作结果,具体为:
所述fakecommondirectorycontrol函数判断需删除的文件或文件夹是否位于所述irp操作结果的最后位置,如果是,则直接删除需隐藏的文件或文件夹;如果不在最后位置,在删除需隐藏的文件或文件夹后,将位于需隐藏的文件或文件夹后面的对象依次向前移动一位。
本发明提供的一种可隐藏指定文件及文件夹的方法具有以下优点:
(1)由于采用了windows内核驱动层hook的方式进行隐藏,技术难度更大,不会被市场上已有的系统管理工具发现和破解,也无法被轻易绕过,实用性强,不易造成隐藏信息的泄漏。
(2)还具有通用性更强的优点,在64位的windows系统上也可通用。
附图说明
图1为本发明提供的一种可隐藏指定文件及文件夹的方法的整体流程示意图;
图2为本发明提供的fakecommondirectorycontrol函数的处理流程示意图。
具体实施方式
为了使本发明所解决的技术问题、技术方案及有益效果更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。
本发明提供一种可隐藏指定文件及文件夹的方法,接收服务端传输的需要隐藏的文件及文件夹列表;然后,当用户浏览目录包含该文件及文件夹时,可自动进行隐藏。本发明可广泛应用于计算机终端安全管理领域。
本发明主要构思为:采用了windows文件系统驱动的方式对文件(夹)进行隐藏。具体的,通过对ntfs或者fat32文件系统内部commondirectorycontrol函数的hook,从而得到文件目录浏览时反馈的文件列表,再通过摘除反馈的文件列表内部需要隐藏的文件或者文件夹,从而达到隐藏文件或文件夹的目的。
参考图1-图2,本发明提供的可隐藏指定文件及文件夹的方法,包括以下步骤:
步骤1,创建自定义的文件隐藏驱动模块,所述文件隐藏驱动模块通过inf文件安装到windows系统中,并将所述文件隐藏驱动模块插入到文件系统驱动设备栈中;创建io控制设备,所述io控制设备与所述文件隐藏驱动模块之间具有通信通道;所述io控制设备用于接收并存储客户端传输的需隐藏文件或文件夹的白名单;
其中,inf是deviceinformationfile的英文缩写,是microsoft公司为硬件设备制造商发布其驱动程序推出的一种文件格式,inf文件中包含硬件设备的信息或脚本以控制硬件操作。在inf文件中指明了硬件驱动该如何安装到系统中,源文件在哪里、安装到哪一个文件夹中、怎样在注册表中加入自身相关信息等等。
步骤2,在windows系统启动时,所述文件隐藏驱动模块同时被启动;
当某个磁盘的磁盘分区卷被加载时,windows系统向所述文件隐藏驱动模块发送磁盘被加载的通知消息;其中,所述通知消息中携带有正在被加载的卷设备对象;通过该卷设备对象可查询到当前被加载的卷名称;
步骤3,所述文件隐藏驱动模块接收到所述通知消息时,立即挂载到与被加载卷对应的磁盘文件系统中;此处挂载操作即为hook操作。
步骤4,所述文件隐藏驱动模块调用文件系统变更通知函数filesystemchangednotification,所述filesystemchangednotification通过以下方法得到公共文件夹控制函数commondirectorycontrol所在地址:
步骤4.1,所述文件隐藏驱动模块中预建立列表,所述列表用于存储磁盘文件系统版本号与commondirectorycontrol函数偏移量之间的对应关系;
步骤4.2,所述filesystemchangednotification函数确定所述磁盘文件系统的版本;其中,所述磁盘文件系统的版本包括ntfs版本和fat32版本;进一步的,所述文件隐藏驱动模块加载当前磁盘分区ntfs或者fat32文件系统驱动后,查找到ntfs或者fat32文件驱动版本号;
步骤4.3,所述文件系统变更通知函数查找步骤4.1建立的列表,得到与步骤4.2得到的版本号对应的commondirectorycontrol函数偏移量;
本步骤中,可通过以下方法检测commondirectorycontrol函数偏移量:
1.用windbg双击联调方式加载ntfs.sys或者fat32.sys;
2.通过加载windows符号文件,在windbg中搜索commondirectorycontrol函数名,可以找到文件系统中该函数的位置,从而计算出不同文件系统对应的偏移量。
所述文件隐藏驱动模块根据不同的文件驱动版本号加载对应的文件系统驱动pe文件,再加载步骤4.3得到的commondirectorycontrol函数偏移量,得到windows系统中commondirectorycontrol函数所在地址;
步骤4的主要原理为:由于不同操作系统的ntfs和fat32文件系统版本不一样,其commondirectorycontrol函数的偏移位置也有所不同,例如:6.1.7601.18127版本,所以需要首先确定windows文件系统版本。通过解析文件系统的pe格式可以得到对应的ntfs和fat32版本号,然后加载不同偏移量就得到了commondirectorycontrol函数的所在地址。
步骤5,所述文件隐藏驱动模块自定义伪装的公共文件夹控制函数fakecommondirectorycontrol,并将所述fakecommondirectorycontrol函数的入口挂钩到所述windows文件系统内部commondirectorycontrol函数中;
步骤6,每当产生与文件目录操作相关的irp操作请求时,所述fakecommondirectorycontrol函数将所述irp操作请求转发给所述commondirectorycontrol函数;
步骤7,所述commondirectorycontrol函数处理所述irp操作请求,并将irp操作结果发送给所述fakecommondirectorycontrol函数;
步骤8,所述fakecommondirectorycontrol函数判断所述irp操作结果所对应的irp操作请求是否为filebothdirectoryinformation类型或fileidbothdirectoryinformation类型irp,如果不是,执行步骤9;如果是,执行步骤10;
步骤9,所述fakecommondirectorycontrol函数将所述irp操作结果返回给windows系统上层;
步骤10,所述fakecommondirectorycontrol函数判断所述irp操作结果中是否存在位于所述白名单中的文件或文件夹;如果不存在,则将所述irp操作结果返回给windows系统上层;如果存在,所述fakecommondirectorycontrol函数从所述irp操作结果中删除位于所述白名单中的文件或文件夹,得到文件或文件夹隐藏后的irp操作结果,然后将所述irp操作结果返回给windows系统上层。
步骤8-步骤10的主要原因为:
由于windows对于文件目录的io操作有很多种irp,经过大量测试,发明人发现,在windows资源管理器当中,只有filebothdirectoryinformation和fileidbothdirectoryinformation类型irp是用于显示文件或文件夹列表的,因此,仅对filebothdirectoryinformation和fileidbothdirectoryinformation这两种查询irp请求进行了拦截。然后,从返回列表中摘除需要隐藏的文件或者文件夹,因此,返回到应用层的文件或文件夹中,不再包括需要隐藏的文件或者文件夹,达到了隐藏文件的目的。
其中,所述fakecommondirectorycontrol函数从所述irp操作结果中删除位于所述白名单中的文件或文件夹,得到文件或文件夹隐藏后的irp操作结果,具体为:
所述fakecommondirectorycontrol函数判断需删除的文件或文件夹是否位于所述irp操作结果的最后位置,如果是,则直接删除需隐藏的文件或文件夹;如果不在最后位置,在删除需隐藏的文件或文件夹后,将位于需隐藏的文件或文件夹后面的对象依次向前移动一位。
下面列举一个具体实现例子:当在资源管理器中打开c盘时,c盘下面存在众多文件和文件夹,包括:windows,programfiles,nvidia,用户,perflogs,boot.ini等文件或文件夹。如果需要隐藏nvidia文件夹,那么就在hook函数fakecommondirectorycontrol中过滤fileidbothdirectoryinformation和filebothdirectoryinformation文件夹请求类型。当这两种类型返回列表时,从返回的列表:windows,programfiles,nvidia,用户,perflogs,boot.ini中删除nvidia这个成员,其他成员向前移动一位。这样,打开c盘时,就看不到nvidia文件夹了,其实nvidia文件夹还是存在windows文件系统中的,从而实现隐藏nvidia文件夹的目的。
本发明采用的文件隐藏技术创新点与以往文件隐藏技术有本质区别,现在已经公布的专利中阐述的文件隐藏技术有以下几种:修改主文件索引表(mft)中文件的索引来隐藏文件。(2)通过文件过滤驱动劫持文件系统irp_mj_directory_control请求返回的文件列表来隐藏文件。
本发明进行hook文件系统的点跟上述两种方法均不同,本发明hook的点在windows的ntfs或者fat32文件系统内部commondirectorycontrol函数位置。这个位置相对较深,不容易被其他文件过滤驱动发现或者绕过。而且windows反hook技术patchguard机制来说,没有影响到该技术的使用,该技术可以使用在windowsxp到windows10各个版本的操作系统中,不受32位和64位版本的限制,通用性较好。
本发明hook技术稳定性也非常好,即没有影响到windows文件系统的正常运行,又能把windows所有文件目录请求过滤到,不会发生绕过或者遗漏的情况。经过实际检测,本发明不会造成破坏windows文件系统中文件列表,因此,不会造成windows文件丢失和损坏、系统崩溃的情况。
本发明的创新点可概括为:采用windows文件过滤,通过查找ntfs和fat32文件系统中的版本号确定windows文件系统内部commondirectorycontrol函数的所在地址。由于该函数是用于处理windows文件系统内部io操作的公共入口函数,所以拦截filebothdirectoryinformation和filebothdirectoryinformation类型irp返回结果,通过查找比较摘除返回文件列表中需要隐藏的文件及文件夹,可以达到隐藏文件的目的。
综上所述,本发明提供的一种可隐藏指定文件及文件夹的方法具有以下优点:
(1)由于采用了windows内核驱动层hook的方式进行隐藏,技术难度更大,不会被市场上已有的系统管理工具发现和破解,也无法被轻易绕过,实用性强,不易造成隐藏信息的泄漏。
(2)还具有通用性更强的优点,在64位的windows系统上也可通用。
以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视本发明的保护范围。