文件隐藏
常用的文件隐藏方法有基于用户模式的 Rootkit 也有基于内核模式的 Rootkit
基于用户模式的 Rootkit
在 Windows 中,应用层的大多数功能都是通过调用 Native API 完成的。以 Windows7 为例,Native API 通过 sysenter 指令进入内核,进而调用 SSDT(System
Service Dispatch Table,系统服务调度表)中对应的函数来完成功能。因此,利用用户模
式的 Rootkit 实现的文件隐藏,很容易被使用内核接口枚举文件的工具绕过,达不到隐
藏的效果
基于内核模式的 Rootkit
基于内核模式 Rootkit 的文件隐藏,通常对 Windows 内核中相关文件浏览函数挂钩,甚至对 Windows 文件系统的内核模块进行修改。此类隐藏方法实现上更偏系统底层,在系统中有更大的控制权限,还能针对大部分反病毒软件和 Anti-Rootkit,进行有针对性的处理,能达到更好的隐藏效果。
基于文件枚举函数 Hook 的隐藏
Windows 系统提供了遍历文件、目录的函数 FindFirstFileA,该函数实际上是对 FindFirstFileExw 的简单封装。对 FindFirstFileExW 进一步分析后发现,该函数是调用 ntdll!ZwQueryDirectoryFile 函数,该函数是内核 Ntoskrnl.exe 实现的,该函数的地址保存在 SSDT 中
SSDT 是 Windows 内核导出的一个数据结构。Windows 内核组件中,SSDT 包含了 Windows 执行体提供的系统功能支持接口,这是 Ntoskml.exe 里实现的系统核心服务SSDT以数组的形式存储这些接口对应函数的地址,接口在数组中的索引也就是该接口的系统调用编号,这个索引或者系统调用编号可以被用于定位函数的内存地址
要挂钩 ZwqueryDirectowFile 函数,首先需要定位到该函数的地址,再确定采用的 Hook 方式,然后编写自定义的具体代码或者函数
一般可以采用两种方式对 SSDT 里的函数进行Hook:
- 直接函数地址替换法,用自己实现函数的地址替换SSDT里要挂钩函数的地址
- Inline hook方法,修改 SSDT 中函数头部的若干个字节(32位系统中是5字节),使该函数开始运行时,直接跳转到自己实现的函数执行