强力的文件隐藏手段:绕过 Raw 模式文件系统 I/O Rootkit 探测器
===================
作者:CardMagic
翻译:FlowerCode[0GiNr]
===================
在读过 Hoglund 的文章之后,我终于决定要写这篇文章。
实际上,在中国有许多聪明的 rootkit/antirootkit 作者有他们自己的有趣的材料,但不幸的是,由于许多原因(商业合同,语言障碍,甚至和某些神秘组织有关),他们不能将这些材料公开。
这篇文章的主要构想在我设计 DarkSpy 时就产生了,但当我完成了总线级文件隐藏程序的编写之后,它被丢弃了。
不过希望这篇文章仍能对这里的某些人有用。
好的,让我们进入正题:
1. 基于 Raw I/O 的隐藏文件检测
这种类型的文件检测技术在现代的检测器中使用非常普遍。例如 DarkSpy/Icesword。
这种检测手段的主要思想是直接发送 I/O 请求包到文件系统,这样检测器就会获得系统文件的真实信息。
这对于检测挂钩本地函数和文件系统过滤驱动的隐藏方式来说很有效。
此外,DarkSpy 还加入了两个很有效的手段(第二个手段使得 DarkSpy 的文件检测比 Icesword 要好 ^_^)
a)自己实现 IofCallDriver,并直接调用原始的文件系统派发函数,这将使挂钩文件系统函数的隐藏方式失效。
b)在每个I/O操作前从内存恢复整个文件系统文件映像,这可以对抗对文件系统函数进行 Inline 型代码修改的隐藏方式
2. 绕过这种检测技术的原理:
这里我们只讨论真正的文件隐藏程序(不包括使用文件流的那些东西),我们还会描述绕过 DarkSpy 的原理,因为 DarkSpy 是非常典型的基于 RAW I/O 的文件检测器。首先让我们来看看DarkSpy文件检测的基本流程。
----------------- ---------------------
| DarkSpy | <1> ---->恢复 | 文件系统映像 |
----------------- <2>----->调用---> | 派发代码 |
<3><-----返回----- |-------------------|
从上面的图我们可以看出,要想在文件系统里做手脚几乎是不可能的,因为 DarkSpy 已经恢复了整个映像,甚至不依赖系统函数直接调用了派发代码。
现在开始改变我们的视角然后动点脑筋,我们能否在除了文件系统以外的地方拦截 I/O 处理呢?
答案是肯定的,因为文件系统会调用许多系统函数。
但我们必须找到一个恰当的调用,它要能够有机会接触 I/O 内容。哪个最好呢?
也许你会首先想到 IofCallDriver……但不幸的是 DarkSpy 已经在内部实现了它,因为 IofCallDriver 是非常容易实现的
所以我们必须另外选择一个,它必须:
a) 很难自己实现
b) 将会被文件系统调用
c) 可以接触到I/O内容
究竟哪一个是最好的呢?
没错,你说对了,是 IofCompleteRequest。好吧……这是我们的想法……
通过 IofCompleteRequest 代码修改,检查我们是否被文件系统调用,如果是,我们将过滤 I/O 内容。这样,我们将可以完全绕过所有现代的基于 RAW I/O 的文件检测器。
3. 主要代码:
参见——
http://www.rootkit.com/vault/cardmagic/hidefile.c
===================
作者:CardMagic
翻译:FlowerCode[0GiNr]
===================
在读过 Hoglund 的文章之后,我终于决定要写这篇文章。
实际上,在中国有许多聪明的 rootkit/antirootkit 作者有他们自己的有趣的材料,但不幸的是,由于许多原因(商业合同,语言障碍,甚至和某些神秘组织有关),他们不能将这些材料公开。
这篇文章的主要构想在我设计 DarkSpy 时就产生了,但当我完成了总线级文件隐藏程序的编写之后,它被丢弃了。
不过希望这篇文章仍能对这里的某些人有用。

好的,让我们进入正题:
1. 基于 Raw I/O 的隐藏文件检测
这种类型的文件检测技术在现代的检测器中使用非常普遍。例如 DarkSpy/Icesword。
这种检测手段的主要思想是直接发送 I/O 请求包到文件系统,这样检测器就会获得系统文件的真实信息。
这对于检测挂钩本地函数和文件系统过滤驱动的隐藏方式来说很有效。
此外,DarkSpy 还加入了两个很有效的手段(第二个手段使得 DarkSpy 的文件检测比 Icesword 要好 ^_^)
a)自己实现 IofCallDriver,并直接调用原始的文件系统派发函数,这将使挂钩文件系统函数的隐藏方式失效。
b)在每个I/O操作前从内存恢复整个文件系统文件映像,这可以对抗对文件系统函数进行 Inline 型代码修改的隐藏方式
2. 绕过这种检测技术的原理:
这里我们只讨论真正的文件隐藏程序(不包括使用文件流的那些东西),我们还会描述绕过 DarkSpy 的原理,因为 DarkSpy 是非常典型的基于 RAW I/O 的文件检测器。首先让我们来看看DarkSpy文件检测的基本流程。
----------------- ---------------------
| DarkSpy | <1> ---->恢复 | 文件系统映像 |
----------------- <2>----->调用---> | 派发代码 |
<3><-----返回----- |-------------------|
从上面的图我们可以看出,要想在文件系统里做手脚几乎是不可能的,因为 DarkSpy 已经恢复了整个映像,甚至不依赖系统函数直接调用了派发代码。
现在开始改变我们的视角然后动点脑筋,我们能否在除了文件系统以外的地方拦截 I/O 处理呢?
答案是肯定的,因为文件系统会调用许多系统函数。
但我们必须找到一个恰当的调用,它要能够有机会接触 I/O 内容。哪个最好呢?
也许你会首先想到 IofCallDriver……但不幸的是 DarkSpy 已经在内部实现了它,因为 IofCallDriver 是非常容易实现的

所以我们必须另外选择一个,它必须:
a) 很难自己实现
b) 将会被文件系统调用
c) 可以接触到I/O内容
究竟哪一个是最好的呢?
没错,你说对了,是 IofCompleteRequest。好吧……这是我们的想法……
通过 IofCompleteRequest 代码修改,检查我们是否被文件系统调用,如果是,我们将过滤 I/O 内容。这样,我们将可以完全绕过所有现代的基于 RAW I/O 的文件检测器。
3. 主要代码:
参见——
http://www.rootkit.com/vault/cardmagic/hidefile.c