【问题标题】:Hooking ExtTextOutW not gives the text with proper information挂钩 ExtTextOutW 不会为文本提供正确的信息
【发布时间】:2012-08-07 09:05:20
【问题描述】:

我正在创建一个可以从任何窗口上的选定矩形中获取文本的应用程序。所以我通过挂钩 ExtTextOut(A/W)、TextOut(A/W)、DrawText(A/W) api 来做到这一点。 我能够从 Windows 中检索文本,但在某些特殊情况下,我无法正确获取文本。 当我尝试调试它时,我看到 ExtTextOutW 的 HDC 参数不能用于获取 HWND,因为当我尝试调用 WindowFromDC(hdc) 时,它返回 NULL HWND。

我试图找出原因然后我发现这个 HDC 是 memoryDC 那么有没有办法从那个 memory DC 中获取 HWND。

所以请有人帮我从 HDC 获取实际的 HWND。

【问题讨论】:

    标签: winapi hook


    【解决方案1】:

    我认为您必须关注 HDC,因为它很可能是 BitBlt() 或类似的 HDC,与实际的 HWND 相关联:

    • 缓存写入内存的文本HDCs
    • 挂钩BitBlt()等,并检查BitBlt()的源HDC是否是已写入文本的内存HDCs之一。如果是,检查目标HDC 是否有HWND,如果没有,则它是内存HDC,必须再次遵循

    【讨论】:

    • 首先非常感谢您的回复。实际上我已经尝试过 BitBlt,但它也不能满足我的要求。我不知道为什么,但是挂钩的 BitBlt 只被调用一次(对于主窗口)。我认为要么我做错了什么,要么还有其他问题。我在想每个子窗口都应该调用 BitBlt,但事实并非如此。请提出建议。
    • BitBlt() 有多种变体,例如StretchBlt()。如何修补导入地址表?如果加载了新的 DLL 怎么办?你检测到并修补它吗? (通过 patch 我的意思是 hook)。 BitBlt() 本身是不够的,因为文本已经写好了。但结合文本输出功能,它可能会为您提供答案。作为测试,建议只将参数打印到文本输出函数和BitBlt() 和朋友的日志文件(或某处),看看HDCs 是否匹配。
    • 感谢朋友的建议。我尝试了 BitBlt 的一些变体,例如:StretchBlt、StretchDIBits,并插入与日志相关的代码,但我的日志文件中不会打印任何内容。这意味着没有调用任何挂钩函数(StretchBlt 或 StretchDIBits)。实际上,我是挂钩的新手,所以可能是我做错了什么。
    • 我已经尝试了很多,但我的挂钩 BitBlt 方法只调用了一次。请帮我。我不知道如何更进一步。
    • @vab711,我用我需要监控的特定应用程序完成了一次。我在回答中描述的是该特定应用程序的行为方式。记住调用函数有两种方式:一种是在程序代码中使用函数名,导致导入地址表中有一个条目,被补丁IAT拦截,另一种是使用GetProcAddress()。如果应用程序正在使用GetProcAddress(),您需要拦截它并返回您的挂钩函数地址,而不是TextOutBitBlt() 等。挂钩函数非常重要。
    猜你喜欢
    • 1970-01-01
    • 2015-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-01
    • 1970-01-01
    • 2020-09-05
    • 2021-10-02
    相关资源
    最近更新 更多