我想编写一个Windows挂钩,可以告诉我文件扩展名何时更改,以及哪些进程更改了它们。
我打算使用的方法是Trampolining https://en.wikipedia.org/wiki/Trampoline_(computing)
我需要从注入的DLL中将2条信息返回到我的主程序中 1.更改了扩展名的文件的路径 2.什么过程改变了它
即。 C:/whatever/MyFile.txt成为C:/whatever/MyFile.doc 和PID 7344,SomeProgram.exe改变了它
为了获得我需要的所有信息,我必须将哪些函数重新路由到我注入的DLL。
答案 0 :(得分:1)
您需要挂钩NtSetInformationFile
,因为这是重命名文件的大多数方法的“共同点”。您需要检查FileInformationClass
是否为FileRenameInformation
。
获取PID就像调用GetCurrentProcessId()
一样简单,因为你的DLL将在重命名文件的进程中运行。
但是,还有其他方法可以“重命名”文件,例如通过复制文件(使用WinAPI函数复制文件或实际打开新文件并编写其内容)然后删除原始文件。这不会被这个钩子捕获,因为它在技术上没有重命名操作。另一种更偷偷摸摸的方式是使用新名称创建同一文件的硬链接,然后删除原始文件。
此外,您需要考虑同时拥有32位和64位版本的DLL,否则一半的应用程序将低于您的雷达。
但总的来说,微软不鼓励挂钩Windows API,特别是在所有进程中,也可能会让您遇到安全软件问题。根据您的使用情况以及它是否只是一个特定问题的私有工具或您想要发布给第三方的软件,可能值得研究构建驱动程序来完成此任务,类似于Process Monitor的工作方式