我正在使用代理DLL拦截对CreateWindowExA
/CreateWindowExW
的调用。除了某些应用程序(最值得注意的是一些Visual Basic 6应用程序)似乎能够创建窗口而不通过这两个函数中的任何一个之外,这样可以很好地退出。像Spy++这样的工具能够显示Window,但我的钩子函数没有注意到它们。
我的第一个怀疑是这些(旧的)应用程序可能使用CreateWindowA
/CreateWindowW
来创建窗口,但至少对于我的编译器(MSVC6到MSVC10),CreateWindow
只是#define;文件的备注部分证实了这一点。
我的第二个想法是,我可以使用CBT hook
安装SetWindowsHookEx
来检测窗口的创建。但是,结果是一样的:这个钩子注意到与我的钩子API函数相同的窗口,但它没有注意到Spy ++中可见的所有窗口。
所以我的问题是:是否有一段时间CreateWindowA
/CreateWindowW
不是#define,而是一个真正的函数?此功能是否仍由user32.dll
导出,可能是出于兼容性原因?如何处理此函数来挂钩它?
或者可能有一些其他的,可能没有记载的功能,可用于创建功能,就像例如可以使用NtCreateProcess
代替CreateProcess
?
答案 0 :(得分:6)
三个简单的猜测:
1)VB应用程序是否真的可以在引擎盖下调用“DialogBox”API(例如DialogBoxParam,CreateDialogIndirect等等)?
2)您正在运行64位操作系统并挂起64位user32.dll。因此,32位应用程序不会被吸引。在c:\ windows \ syswow64
中有一个32位的user32.dll副本3)您没有挂钩应用正在使用的user32.dll。许多较旧的应用程序可能正在获得一些DLL重定向。在命令提示符下,从c:\ windows \ winsxs目录中执行“dir / s user32.dll”。您将在此处看到至少另一个user32.dll副本。忘记发生这种情况,但你可以Bing为“winsxs”并获得一些页面讨论并排目录如何解决更新的Windows操作系统版本上的compat问题。
我怀疑#3是你问题的原因。
答案 1 :(得分:1)
我认为您的问题可能是VB应用程序正在使用GetProcAddress()来调用CreateWindow **()函数。如果您挂钩GetProcAddress,您应该能够确认这一点。