我正在尝试在某个进程中检测对CoCreateInstance的所有调用(理想情况下,我能够检测子进程中的调用)。
为了实现这个目标,我在Windows 7上使用Microsoft Visual Studio 2008创建了一个代理DLL,它将标准ole32.dll
库中除了一个函数以外的所有函数都转发出去,具体做法可以参考各种文章,例如
Intercepted: Windows Hacking via DLL Redirection。生成的DLL看起来很好,但是我就是无法让已有的程序(测试应用程序我使用了标准的ActiveX Control Test Container (tstcon32.exe))加载我的代理DLL。不管我怎么做,这些程序似乎总是会加载C:\Windows\SysWow64\ole32.dll
,根据Process Explorer的显示结果。到目前为止,我已经尝试了以下几件事情:
- 将包含我的代理DLL的目录添加到
PATH
环境变量的开头,然后调用程序;没有任何效果。 - 将我的代理DLL复制到被调用程序所在的目录中;也没有成功。 在调用程序的同一目录下创建一个名为
- 使用基于清单的重定向,例如在DLL重定向使用清单问题中所述,但似乎也没有任何效果。然而,这种方法似乎并不简单,所以很有可能是我做错了什么。
.local
的文件,就像Dynamic-Link Library Redirection文章中所描述的那样,并将代理DLL放入相同的目录中——也不起作用。但后来,我读到这在更近期的Windows版本上已经停止工作了。此外,ole32.dll
是一个“已知的DLL”,根据HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs
注册表设置,因此基于.local
的重定向可能根本无法工作。
有没有人有使用桩DLL重定向标准DLL(如ole32.dll
)的经验?你是如何强制应用程序选择你的桩DLL的?