主题说明了一切。普通的防病毒软件必须拦截所有文件访问,扫描文件,然后选择性地拒绝对文件的访问(甚至可能向用户显示提示)。如何才能做到这一点?
我知道一种称为 API 挂钩的方法,但这是一个非常肮脏的无证 hack——因此并不可靠。这样做的“官方”方式是什么?
或者,我有兴趣拦截可执行模块(.DLL、.EXE 等)的加载,而不仅仅是任意文件读取。
在最近的 Windows 版本中(至少从 XP 开始)有一个概念“过滤器”,可以使用 MS 过滤器管理器查看,(来自命令提示符的 fltmc.exe)
这提供了一个低级 I/O 挂钩,AV 程序可以访问并自动注册以将所有 I/O 请求传递给文件系统。这是一个工具包,您可以获取驱动程序以开发您自己的过滤器。
http://www.microsoft.com/whdc/driver/filterdrv/default.mspx是获取深度信息的起点。
正如您已经指出的,挂钩是具有“实时”保护功能的现成 AV 软件的关键。
你可以看看(广泛讨论的)winpooch,它已经做了 API Hooking,但是这个软件有一些重大缺陷。Winpooch的Sourceforge
Codeproject 上还有一篇关于 API hooking 的文章,提供了一些库来做“三层”的 hooking。正如您所想象的那样,DLL 注入有些困难。CodeProject:EasyHook,重新发明 API Hooking
由于您可能对防病毒策略感兴趣,我还建议您查看 ClamAV 或 WinClam,它是Windows 的开源(在 GPL 下)ClamAV
但我不知道如何使用 C# 进行 API 挂钩,我不得不承认。在 C / C++ 中,这(相当)容易......
补充你可能对 FileMon 的来源感兴趣,这是一个广为人知的 FileSystem Monitor,曾经由 SysInternals 出品,现在由 Microsoft 出品:它使用 Microsoft 的 Driver-Filter API,至少被称为脆弱。
通过文件系统过滤驱动程序。然而,实现这样的驱动程序是相当复杂和“脆弱的”。
使用文件系统过滤器驱动程序监视文件访问,该驱动程序在内核模式下工作。过滤器驱动程序不仅可以收到有关文件系统操作的通知,还可以更改通过过滤器传递的数据或拒绝文件系统请求。
您可以自己创建一个微过滤器,但是对内核模式代码的维护和支持并非易事,尤其是在没有内核模式开发经验的情况下。问题之一是各种过滤器之间的冲突。
我们公司提供CallbackFilter产品,它提供了一个现成的驱动程序,让您可以在用户模式下编写与过滤相关的业务逻辑。
您可以阅读microsoft的 detours 库并免费试用 - 它允许您在 c# 中编写用户模式挂钩。您无需了解驱动程序:]
但是-对于内核模式挂钩-您将需要了解c并使用DDK-至少afaik:[
并且大多数现代防病毒软件会拦截很多调用——注册表 API、线程和进程 API 等——而不仅仅是文件系统 API。再次 - afaik。
编辑:还有一些开源rootkits - 谷歌他们,看看他们如何执行他们的钩子,我想这将是教育性的。
通常,这些产品拦截函数以获取对 OpenProcess 或 NtOpenProcess 等进程的 HANDLE。它们还在远程进程中挂钩 CreateRemoteThread 函数和内存分配:VirtualAlloc 和 VirtualProcect。一些 AV 还挂钩 SetWindowsHookEx 函数来检测全局挂钩以避免键盘记录器。
挂钩这些 API,他们可以控制哪些模块(或 dll)可以访问远程进程,并且只允许用户知道他们在做什么的那些。
您可以使用 HookShark 查看每个 AV 产品拦截了哪些用户模式功能。
要制作自己的用户挂钩,您可以使用 detours 库,但您必须开发一个代理来运行您的进程内挂钩,然后与代理服务器通信。您还可以使用Deviare API Hook,它是一个框架,可以让所有复杂的人员组成,因此您可以使用任何编程语言在您自己的流程中编写您的钩子。