4

如何找到 WndProc 的地址(另一个进程的窗口)。即使我注入一个 DLL 并尝试使用 GetClassInfoEx() 或 GetWindowLong() 或 GetWindowLongPtr() 找到它,我总是会得到像 0xffff08ed 这样的值,这绝对不是可执行地址。它是根据 MSDN:“......窗口过程的地址,或代表窗口过程地址的句柄。”

不幸的是,这对我来说还不够好,我需要实际地址。Spy++ 在大多数情况下都能正确完成工作(但即使这样有时也会失败)。所以应该是可以的。谢谢。


[编辑:]感谢Chris Becke为我的小问题提供了超快速且正确的解决方案!

4

2 回答 2

4

也许您因为要求的 windowproc 版本错误而受到阻碍。

Window Procs 和应用程序一样,有两种形式:ansi 和 unicode。Windows 无法将指向 ansi 窗口的原始指针返回给 unicode 应用程序,反之亦然,因为它们会尝试使用错误的字符串类型调用它。

因此,没有 GetWindowLongPtr 函数。它是一个宏,可解析为 windows api 提供的两个“真实”函数:GetWindowLongPtrA 和 GetWindowLongPtrW。如果窗口是 unicode 窗口,并且调用 GetWindowLongPtrA,则窗口将返回句柄而不是原始指针,以便它可以拦截调用(通过 CallWindowProc 进行)并将字符串从 ansi 编组为 unicode。相反的转换持有另一种方式。

即使你调用了正确的函数,你仍然可能得到一个句柄——ansi 代码完全有可能继承了一个 unicode 窗口。因此 windowproc 已完全被 callWindowProc 句柄之一所取代。

在那种情况下 - 我猜运气不好。

于 2009-12-15T11:13:26.700 回答
1

扩展 Chris Becke 的回答(这解决了我的问题,谢谢!):

因此,没有 GetWindowLongPtr 函数。它是一个宏,可解析为 windows api 提供的两个“真实”函数:GetWindowLongPtrA 和 GetWindowLongPtrW。如果窗口是 unicode 窗口,并且调用 GetWindowLongPtrA,则窗口将返回句柄而不是原始指针,以便它可以拦截调用(通过 CallWindowProc 进行)并将字符串从 ansi 编组为 unicode。相反的转换持有另一种方式。

IsWindowUnicode您可以通过调用该函数来检查有问题的窗口是 unicode 还是 ANSI 窗口。使用此信息,您可以确定GetWindowLongPtr需要调用哪个函数(在运行时),

于 2015-04-03T11:45:12.040 回答