1

我想写一个windows钩子,它可以告诉我文件扩展名何时改变,以及是什么进程改变了它们。

我计划使用的方法是 Trampolining https://en.wikipedia.org/wiki/Trampoline_(computing)

我需要 2 条信息从注入的 DLL 返回到我的主程序。
1.扩展名改变的文件的路径 2.是什么进程改变了它

即 C:/whatever/MyFile.txt 变成 C:/whatever/MyFile.doc 和 PID 7344,SomeProgram.exe 改变了它

为了获得我需要的所有信息,我必须将哪些函数重新路由到我注入的 DLL。

4

1 回答 1

1

您需要挂钩NtSetInformationFile,因为这是重命名文件的大多数方法的“共同点”。您需要检查是否FileInformationClassFileRenameInformation.

获取 PID 就像调用一样简单,GetCurrentProcessId()因为您的 DLL 将在重命名文件的进程内运行。

但是,还有其他方法可以“重命名”文件,例如通过复制文件(使用 WinAPI 函数复制文件或通过实际打开新文件并写入其内容)然后删除原始文件。这不会被这个钩子捕获,因为它在技术上没有重命名操作。另一种更狡猾的方法是使用新名称创建指向同一文件的硬链接,然后删除原始文件。

此外,您还需要考虑同时拥有 32 位和 64 位版本的 DLL,否则一半的应用程序将无法察觉。

但总的来说,微软强烈反对挂钩 Windows API,尤其是在所有进程中,并且还可能让您陷入安全软件问题。根据您的用例以及它只是针对特定问题的私有工具还是您想要发布给第三方的软件,可能值得研究构建驱动程序来完成此任务,类似于 Process Monitor 的方式.

于 2016-04-25T13:29:11.673 回答