寻找WndProc地址

时间:2009-12-15 10:37:03

标签: windows unicode winapi ansi wndproc

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

不幸的是,这对我来说不够好,我需要实际的地址。 Spy ++大部分时间都能正常工作(但有时甚至会失败)。所以它应该是可能的。感谢名单。


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

2 个答案:

答案 0 :(得分:4)

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

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

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

即使你调用了正确的函数,你仍然可以得到一个句柄 - 它完全有可能ansi代码已经子类化了一个unicode窗口。所以windowproc已被callWindowProc句柄之一完全取代。

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

答案 1 :(得分:1)

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

  

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

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