10

我正在使用代理 DLL 来拦截对CreateWindowExA/CreateWindowExW的调用。这很好用,除了一些应用程序(尤其是一些 Visual Basic 6 应用程序)似乎能够创建窗口而无需通过这两个函数中的任何一个。像Spy++这样的工具能够显示窗口,但我的钩子函数没有注意到它们。

我的第一个怀疑是,也许这些(旧)应用程序使用CreateWindowA/CreateWindowW来创建窗口,但至少对于我的编译器(MSVC6 到 MSVC10)来说,CreateWindow这只是一个#define;文档的备注部分证实了这一点。

我的第二个想法是我可以安装一个CBT hookusingSetWindowsHookEx来检测 Windows 的创建。然而,结果是一样的:这个钩子注意到与我的钩子 API 函数相同的窗口,但它没有注意到在 Spy++ 中可见的所有窗口。

所以我的问题是:可能有一段时间CreateWindowA/CreateWindowW不是#define,而是一个真正的函数?此功能是否仍由 导出user32.dll,也许是出于兼容性原因?我怎样才能得到这个函数的句柄来挂钩它?

或者是否有其他一些可能未记录的函数可用于创建函数,就像 egNtCreateProcess可以用来代替CreateProcess

4

2 回答 2

7

三个简单的猜测:

1) VB 应用程序是否有可能在底层调用“DialogBox”API(例如 DialogBoxParam、CreateDialogIndirect 等)?

2) 您正在运行 64 位操作系统并正在挂钩 64 位 user32.dll。因此,32 位应用程序并没有上瘾。c:\windows\syswow64 中有 user32.dll 的 32 位副本

3)您没有挂钩应用程序正在使用的 user32.dll。许多较旧的应用程序可能会获得一些 DLL 重定向。在命令提示符下,从 c:\windows\winsxs 目录执行“dir /s user32.dll”。您将在此处至少看到另一个 user32.dll 副本。忘记什么时候发生这种情况,但是您可以为“winsxs”使用 Bing 并获取一些页面讨论并排目录如何解决较新 Windows 操作系统版本上的兼容性问题。

我怀疑#3 是你的问题的原因。

于 2011-05-19T06:43:08.470 回答
1

我认为您的问题可能是 VB 应用程序正在使用 GetProcAddress() 来调用 CreateWindow**() 函数。如果您挂钩 GetProcAddress,您应该能够确认这一点。

于 2012-09-13T07:43:18.543 回答