我需要让一个文件对其他程序不可见。例如,当另一个程序获取文件夹中的文件列表时,我想让其中一个特定的文件不显示出来。我正在将一个DLL注入到进程中,从中运行我的代码,并隐藏文件系统中的DLL文件。我使用的是Microsoft Visual C++ 2010和Windows 7。
如你所提到的,您需要拦截文件/文件夹枚举API并从枚举结果中过滤出特定的文件/文件夹以便“隐藏”它。这可以在用户模式或内核模式下完成。
用户模式:用户模式钩子涉及DLL注入。有许多地方可以进行钩子:
一般来说,用户模式可能会变得“丑陋”(难以管理),因为如果要进行系统范围的钩子(或者至少在 Explorer.exe 或目标应用程序中进行钩子),则需要将 DLL 注入所有正在运行的进程中。许多应用程序(如安全软件)都有保护机制来检测和拒绝 DLL 注入。
实现用户模式钩子的更干净的方法是在 NTDLL.dll 中挂钩 API(使用 EAT 或内联钩子)。所有其他 API(如 FindFirstFile/FindNextFile)最终都调用由 NTDLL.dll 提供的等效 NtXxx API(如 NtQueryDirectoryFile)。NtXxx API 是通过执行 INT 2E/SYSENTER 跳转到内核模式的点。
内核模式:这需要编写驱动程序。同样,在内核模式下,有许多地方可以安装钩子:
内核模式钩子往往更干净,因为它们通常安装在一个“集中的位置”。但是,您应该非常小心,因为驱动程序代码中的小错误/处理不当可能会导致蓝屏崩溃。
PS: 有许多钩子库或框架可供使用,可以方便地编写代码。其中一些流行的包括:
http://www.madshi.net/madCodeHookDescription.htm
http://easyhook.codeplex.com/
PPS: 使用这种技术未经用户同意来隐藏文件/文件夹可能是一个值得质疑的行为,并且可能会导致问题(还记得Sony DRM保护软件的问题吗?;))。这就是rootkits所做的!有许多用户模式和内核模式的rootkits使用上述技术来隐藏文件/文件夹。有各种反rootkit软件可用于检测和恢复上述所有类型的钩子。许多防病毒软件在检测到此类rootkit行为时会发出警报(如API hooking、隐藏文件、SSDT hooks等)
一些资源:
http://www.codeproject.com/KB/threads/APIHooking.aspx
http://www.codeproject.com/KB/DLL/funapihook.aspx
http://www.codeproject.com/KB/system/api_spying_hack.aspx
http://www.codeproject.com/KB/system/hide-driver.aspx
http://www.uc-forum.com/forum/c-and-c/59147-writing-drivers-perform-kernel-level-ssdt-hooking.html
http://www.security.org.sg/code/apihookcheck.html