2

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

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

一个转折:如果进程创建子进程,我还需要监视它们的文件访问。

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

我知道这可能听起来像是一些可怕的杂物的成分。但如果我能做到这一点,最终的结果会非常酷。

4

1 回答 1

1

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

你只是带着这个要求把自己放进了哈克城——你是对的,ETW 是一个更容易的解决方案,但它也无法阻止文件调用。

基本上,这就是你必须要做的:

  1. 创建进程挂起
  2. 创建两个方向相反的命名管道,其名称众所周知(可能包含进程的 PID)
  3. 钩住 LoadModule,钩子会监视 Kernel32 被加载
  4. 当 Kernel32 被加载时,钩子 CreateFileW 和 CreateFileA - 也钩子 CreateProcessEx 和 ShellExecute
  5. 当您的 CreateFile 钩子命中时,您将名称写入其中一个命名管道,然后在另一个上执行 ReadFile,直到父进程向您发出继续信号。
  6. 当您的 CreateProcessEx 钩子命中时,您可以从当前进程内部重新执行相同的进程(请记住,您不能让父进程执行 CreateProcess'ing,因为它会弄乱继承的句柄)。
  7. 启动子进程。

请记住,您将注入代码并对内存中的图像进行修复,该图像的位数可能与您的不同(即您的应用程序是 64 位,但它正在启动一个 32 位进程),因此您将必须同时拥有 x86 和 amd64 版本的 shim 代码才能注入。我希望通过写这篇冗长的谩骂你已经说服自己,这实际上是一个糟糕的想法,而且很难做到正确,并且挂钩 Win32 功能的人会让 Windows 操作系统开发人员感到难过。

于 2010-09-09T05:41:52.507 回答