如何在Windows上生成进程并查看它使用的文件?

时间:2010-09-09 02:20:26

标签: windows file trace spawn

我想在Microsoft Windows上编写一个C ++函数,它生成一个进程,并在进程的终止状态之外返回进程读取或写入的所有文件的列表。它不应该需要来自衍生应用程序的任何合作。

例如,如果生成的程序是Visual Studio C ++编译器,则该函数将生成一个列表,其中包含编译器打开的源文件,它读取的所有头文件以及它创建的.OBJ文件。如果它还包含程序包含的.DLL文件之类的内容,那就没问题了。但同样,无论产生的程序如何,它都应该有效;编译器只是一个例子。

扭曲:如果进程创建子进程,我也需要监视他们的文件访问。

第二个转折:如果进程尝试打开文件,我希望能够让它等到我可以创建该文件 - 然后让它恢复并打开文件。 (我认为这排除了ETW。)

我知道这可能听起来像一些可怕的kludge的成分。但是,如果我能让这个工作,最终的结果将非常酷。

1 个答案:

答案 0 :(得分:1)

  

第二个转折:如果进程试图打开一个文件,我希望能够让它等到我可以创建该文件 - 然后才让它恢复并打开文件

你只是按照这个要求进入Hack City--你是对的,ETW将是一个更容易解决的问题,但它也无法阻止文件调用。

基本上,这就是你要做的事情:

  1. 创建暂停的流程
  2. 在相反方向创建两个命名管道,其名称众所周知(可能包含流程的PID)
  3. Hook LoadModule,钩子会监视Kernel32加载
  4. 当加载Kernel32时,钩子CreateFileW和CreateFileA - 也挂钩CreateProcessEx和ShellExecute
  5. 当您的CreateFile钩子命中时,您将名称写入其中一个命名管道,然后在另一个上执行ReadFile,直到父进程发出信号要求您继续。
  6. 当您的CreateProcessEx钩子命中时,您可以从当前进程内部重新执行相同的进程(请记住,您不能让父进程执行CreateProcess',因为它会使继承的句柄陷入混乱)。
  7. 启动子进程。
  8. 请记住,您将注入代码并对内存中的映像进行修复,这些映像可能与您的位数不同(即您的应用程序是64位,但它启动的是32位进程),所以你必须同时注入你的填充码的x86和amd64版本。我希望通过编写这个冗长的dia骂,你已经说服自己,这实际上是一个非常难以正确的想法,并且挂钩Win32功能的人使Windows操作系统开发人员感到悲伤。