【问题标题】:Is HWND unique among a window station?HWND 在窗口站中是独一无二的吗?
【发布时间】:2013-08-10 05:01:49
【问题描述】:

假设我在WinSta0中创建了两个桌面D1和D2,D2有一个窗口B。

我的问题是:

属于D1的线程能否通过GetWindowText(hwnd for B, ....)获取窗口B的标题文字?

【问题讨论】:

    标签: windows security winapi gdi handle


    【解决方案1】:

    层次结构是 Session => Window Station => Desktop => Thread => window。当您使用服务时,会话很重要,它们在隔离会话 0 中运行。每个会话至少有 WinSta0 作为交互式窗口站。会话 0 有额外的服务。

    一个窗口站有多个桌面,至少是您通常与之交互的默认桌面和 Winlogon 桌面,一个用于登录和屏幕保护程序的安全桌面。加上您创建的其他内容,例如您的 D2 桌面。

    桌面有一个单独的桌面堆,用于存储窗口对象。每个 HWND 在该堆中都是唯一的。您将需要 GetThreadDesktop() 跳回层次结构并从已知线程返回到它创建窗口的桌面。 EnumDesktopWindows() 获取该桌面拥有的顶级窗口。

    获取线程 ID 通常是一个障碍,您至少需要了解有关该进程的一些信息。您可以从中枚举该进程拥有的线程,例如 CreateToolhelp32Snapshot()。

    这将为您提供桌面句柄。但是 GetWindowText 只能使用 D1 句柄,您需要调用 SetThreadDesktop() 才能切换到 D2。

    【讨论】:

      【解决方案2】:
      1. EnumWindowStations()
      2. EnumDesktops() - 需要一个窗口站
      3. EnumDesktopWindows() - 需要桌面

      (和)

      1. EnumWindows()
      2. EnumChildWindows() - 需要一个父窗口

      使用上面的函数,做一个测试,看看它们是否是唯一的。我会说它们应该是。

      PS:更多here

      【讨论】:

      • 谢谢。如果你是真的,如何防止在默认桌面下运行的进程获取属于winlogon桌面的窗口的文本,比如密码?
      • @xmllmx Each Window Station is a securable object。我不认为这很容易。我什至不会考虑能够如此轻松地读取 winlogon 密码......至少无需注入您的进程并连接键盘。除非你在这里得到更好的答案,否则你需要做一些测试。
      • @xmllmx 也签出this answer here。可能有用!
      【解决方案3】:

      HWND 在台式机中是独一无二的。

      tagWND 结构(别名 HWND)的第一个成员是 _THRDESKHEAD 结构

      typedef struct tagWND
          {
          /*0x000*/     struct _THRDESKHEAD head;
              /*0x014*/     ..............
      

      (来自 win32k!tagWND 符号)

      typedef struct _THRDESKHEAD
      {
         THROBJHEAD;
         PDESKTOP    rpdesk; //DESKTOP OBJECT
         PVOID       pSelf;   
      } THRDESKHEAD, *PTHRDESKHEAD;
      

      (来自 ReactOS 源代码)

      所以每个 HWND 都被分配到桌面边界。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-08-18
        • 2012-10-08
        • 2015-06-20
        • 2017-01-01
        • 2013-07-13
        • 1970-01-01
        • 2011-01-17
        相关资源
        最近更新 更多