【问题标题】:Filesystem hooking文件系统挂钩
【发布时间】:2013-08-10 09:29:45
【问题描述】:

我正在制作一个我想添加到任何 .exe 的虚拟文件系统库 为此,我需要挂钩所有 Windows 文件功能。

我知道有很多这些函数,但它们是高级 API,是否有这些函数使用的低级函数的完整列表?

我的意思是 ZwOpenFile

我需要的是尽可能少的函数集来挂钩以覆盖整个文件系统处理。从 Windows API 中扭转这一点有点困难。

我已经涵盖了基础知识(现在只读取文件并且肯定不完整)但我还需要文件写入/目录枚举。

奇怪的是,例如FindFirstFileA 使用ZwOpenFile

ZwOpenFile hook. ObjectName : \??\D:\VFS\* Handle : 20
NtQueryDirectoryFileHook hook. Handle : 20
NtQueryDirectoryFileHook hook. Handle : 20
D:/VFS/Test
D:/VFS/test2.txt
D:/VFS/test3.txt
NtQueryDirectoryFileHook hook. Handle : 20
ZwOpenFile hook. ObjectName : \??\D:\VFS\Test\* Handle : 24
NtQueryDirectoryFileHook hook. Handle : 24
NtQueryDirectoryFileHook hook. Handle : 24
D:/VFS/Test/huh.txt
NtQueryDirectoryFileHook hook. Handle : 24
ZwOpenFile hook. ObjectName : \??\C:\Windows\system32\apphelp.dll Handle : 44

感兴趣的功能:

NtCreateFile
NtOpenFile
NtLockFile
NtUnlockFile
NtReadFile
NtWriteFile
NtClose

NtWriteFileGather
NtReadFileScatter

NtQueryDirectoryFile

NtQueryInformationFile
NtSetInformationFile

related


NtQueryVolumeInformationFile
MapViewOfFile
NtOpenSection
NtUnmapViewOfSection

NtFsControlFile
NtDeviceIoControlFile
NtNotifyChangeDirectoryFile

【问题讨论】:

  • openrce.org/reference_library/win32_call_chains/XPSP2/KERNEL32 我真的不想通过这一切去挖掘
  • 写一个文件系统过滤驱动不是更好吗?
  • 这与我想要做的完全相反..我想要一个文件中的 exe 及其资产(包括 dlls inis 等)(如果修改保存在硬盘上),我在这里安装驱动程序客户端机器;/
  • 同意垫子。 EXE 将是完全错误的解决方案。所有程序都可以通过内核访问驱动程序,但 EXE 在特定用户帐户下运行,因此很难从其他帐户访问。
  • 并且用户模式挂钩对内核模式下尝试打开文件的代码没有影响。正确的方法是编写文件系统重定向器。模拟网络驱动器可能会让您利用系统中已经存在的大量基础设施来完成这类事情。

标签: c++ winapi hook


【解决方案1】:

你需要 ZwCreateFile 来挂钩文件的打开或创建; ZwDeleteFile 用于挂钩文件删除;如果要控制文件锁定,还需要 ZwLockFile 和 ZwUnlockFile;挂钩 ZwQueryInformationFile 和 ZwSetInformationFile 将帮助您检测文件信息的变化。如果要控制文件的读取和写入,还需要挂钩 ZwReadFile 和 ZwWriteFile;和 ZwMapViewOfSection / ZwUnmapViewOfSection 来处理文件映射。

对于目录枚举,您需要挂钩 ZwQueryDirectoryFile。

所有这些功能都可以轻松地从用户模式挂钩。

【讨论】:

  • 我已经准备好了(无论如何都是部分),但它会涵盖所有可能的高级 api 吗?我在 Windows 内部的经验告诉我,有一些奇怪的功能在背后捅我一刀 :)
  • 我相信它足以涵盖所有基本的文件操作。无论如何,所有高级 API 都会调用这些 Zw* 服务。
  • 您使用什么版本的 Windows?我现在查看了调试器,在 Zw* 函数之前没有 NOP :(
  • 对,它们只是之前函数的 pad nop,我看错了
  • 一个更大的问题是 FindFirstFileA 使用 ZwOpenFile o0 我在调试器下感觉无数个小时,无论如何我接受你的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多