【问题标题】:Finding WndProc Address查找 WndProc 地址
【发布时间】:2009-12-15 10:37:02
【问题描述】:

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

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


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

【问题讨论】:

    标签: windows unicode winapi ansi wndproc


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 克里斯很快,谢谢。但是:我打电话给正确的人,并得到句柄而不是地址。 Spy++ 确实为同一个窗口获得了正确的地址。所以是可行的
    • 我错了。我回去检查了一下。原来 ::GetWindowLongA() 成功了。谢谢和荣誉!
    • 请记住,如果您从另一个进程取回一个地址,那么除非您将其内存映射到您的地址空间,否则它在 您的 进程中是没有意义的。
    • 我认识 Paul,事实上我的代码被注入到另一个进程中,所以这就是我的地址空间所在的位置。因此,“另一个过程”是指我无法控制该过程本身,也没有它的来源。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-25
      • 2011-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-15
      相关资源
      最近更新 更多