隐藏其他程序的文件

时间:2010-11-06 23:56:07

标签: c++ file hide

我需要让一个文件不出现在另一个程序中。例如,当另一个程序获取文件夹中的文件列表时,我希望一个特定的程序不显示。我正在注入一个DLL,我的代码将从该DLL中运行,我想在文件系统上隐藏DLL文件。我使用的是Microsoft Visual C ++ 2010和Windows 7。

2 个答案:

答案 0 :(得分:11)

是的,正如您所提到的,您需要截取文件/文件夹枚举API并从枚举结果中过滤掉特定的文件/文件夹,以“隐藏”该文件/文件夹。这可以在用户模式或内核模式下完成。

用户模式:用户模式挂钩涉及DLL注入。你可以在很多地方挂钩:

  • IAT挂钩可执行文件:找出目标进程导入地址表中的条目FindXxx,并用注入的DLL中存在的trampoline函数地址覆盖它。
  • EAT挂钩由可执行文件加载的DLL:在加载的DLL(本例中为kernel32.dll)的导出地址表中找出FindXxx API的条目,并用注入的DLL中存在的trampoline函数的地址覆盖它。
  • 内联挂钩:将带有JMP的加载DLL中的API代码的前几条指令覆盖到您的蹦床功能。

通常,用户模式往往变得“丑陋”(难以管理),因为如果您需要系统范围的挂钩(或至少是Explorer.exe或您的目标应用程序),您需要将DLL注入所有正在运行的进程中)。许多应用程序,如安全软件,都有保护机制来检测和拒绝DLL注入。

实现用户模式挂钩的一种更简洁的方法是挂钩NTDLL.dll中的API(使用EAT或内联挂钩)。所有其他API(如FindFirstFile / FindNextFile)最终都会调用NTDLL.dll提供的等效NtXxx API(如NtQueryDirectoryFile)。 NtXxx API是控制通过执行INT 2E / SYSENTER跳转到内核模式的点。

内核模式:这涉及编写驱动程序。同样,在内核模式中,有许多地方可以安装hook:

  • SSDT挂钩:通过在驱动程序中使用trampoline函数的地址覆盖相应的SSDT索引,为所需的ZwXxx API(本例中为ZwQueryDirectoryFile)安装SSDT挂钩。
  • 内核内联钩子:用JMP覆盖内核导出的NT内核API的前几条指令(在本例中为NtQueryDirectoryFile),指向驱动程序中的trampoline函数。
  • 文件系统过滤器驱动程序:这是一种更简洁的方法,不涉及钩子。安装文件系统过滤器驱动程序并拦截读/写/枚举IOCTL并过滤掉结果以隐藏/锁定特定文件/文件夹。

内核模式钩子往往更清洁,因为它们通常安装在一个“集中位置”。但是,您应该非常小心,因为驱动程序代码中的小错误/错误处理最终会导致BSOD。

PS:有许多钩子库/框架可用于简化编写代码的工作。一些流行的是:
http://www.madshi.net/madCodeHookDescription.htm
http://easyhook.codeplex.com/

PPS:在未经用户同意的情况下使用此类技术隐藏文件/文件夹可能是一个值得怀疑的操作,并且可能会出现问题(请记住Sony DRM保护软件问题?;))。这就是rootkit的作用!有许多用户模式和内核模式rootkit使用上面提到的技术来隐藏文件/文件夹。有各种anti-rootkit软件可用于检测和恢复上述各种挂钩。许多反病毒软件在检测到类似rootkit的行为时会引发一个标志(如API挂钩,隐藏文件,SSDT挂钩等)。

资源很少:
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

答案 1 :(得分:0)

最简单的方法是使用Microsoft Detours覆盖您需要的功能。它也可以用于注入DLL,但是你已经覆盖了它。如果您知道的其他进程使用了​​特定的函数,请将其挂钩。如果没有,您将需要挂钩用于列出文件或打开文件的所有函数的构建块。仅仅调用CreateFile / FindFirst / FindFirstFile / etc就足够了,因为它们只调用内部函数。例如,如果挂钩实际映射到CreateFileA的CreateFile,则该进程仍然可以使用CreateFileW访问该文件。所以你想挂钩NtCreateFile和朋友。但是我想你知道你正在搞哪个过程,所以你也确切地知道要搞哪些功能。