【问题标题】:How to install a utility manager application that it can run on the secure desktop?如何安装可以在安全桌面上运行的实用程序管理器应用程序?
【发布时间】:2009-04-27 03:47:11
【问题描述】:

我尝试编写实用程序管理器应用程序,并尝试在 WinXP SP3 上对其进行测试。 我添加到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Accessibility\Utility Manager,登录后加载实用程序管理器时效果很好。

但是,当我在登录前(通过 Window+U)或从锁定屏幕尝试在启动时从实用程序管理器加载它时,会出现一条错误消息,说(大约,因为它是 WinXP 的德语版本)“此应用程序无法在安全桌面上执行。请联系您的系统管理员以获得所需的权限。

我必须做些什么不同的事情才能在安全桌面上进行这项工作?

[b]编辑:[/b] 我听从了 David Pope 的建议并尝试调试 utilman.exe(使用OllyDebug,因为我比使用新的调试器更习惯...,并要求它在进程创建时中断)。好像我的应用程序根本没有启动。由于 OllyDebug 似乎禁用了某些功能(例如中断 API 调用)(可能是因为该进程以不同的用户身份运行),我使用 Sysinternals Process Monitor 仔细检查了它。启动屏幕键盘时,会出现“进程创建”事件;启动我的工具时,没有出现任何事件。

另一个注意事项:当我将 osk.exe(屏幕键盘)放入我的新注册表项时,它工作正常(我基本上在菜单中有两个屏幕键盘条目),但如果我复制 osk.exe到 osk2.exe 并将 osk2.exe 作为可执行文件,屏幕键盘上的副本将在非安全桌面上启动。所以在调用可执行文件之前必须是某种验证(针对文件名+内容)?用我的工具(或 osk.exe)替换 magnify.exe 将使该工具在下次重新启动后无法工作(当 utilman 重新启动时??)。

换句话说:只有文件名为 osk.exe 并且是屏幕键盘或文件名为 magnify.exe 并且是放大镜时,它才会起作用。

这也不会在事件日志中创建任何信息。

【问题讨论】:

    标签: winapi accessibility


    【解决方案1】:

    您是否按照this page 上的所有说明进行操作?它似乎涵盖的注册表设置比您描述的要多。

    编辑:正如您所指出的,该页面看起来是针对 Vista 的。令人讨厌的是 MSFT 如何剔除遗留信息并使其难以找到......

    要检查的一件事是事件日志 - 也许它们包含线索。可以提高审核级别以查看更多与安全相关的数据。

    我没有您的代码,因此我无法自己调试它,但我能够将调试器挂接到 utilman.exe 并在它在安全桌面上启动实用程序时获得控制权。也许如果你这样做,你可以找出安全违规。

    1. 在目标计算机上:
      • 安装适用于 Windows 的调试工具。
      • 启用 RDP 访问。
      • 锁定屏幕。
      • 按 Win-U 调出实用程序管理器并使其保持运行。
      • 确保您的符号和源代码在目标上与它们在开发机器上编译的路径相同。
    2. 在另一台机器上:
      • 以具有调试/管理员权限的用户身份进入目标计算机。
    3. 在 RDP 会话中:
      • 运行 WinDBG 并附加到 utilman 进程(F6 键)
      • 如果它没有进入调试器,请按 ctrl-break。
      • 执行.childdbg 1 以确保您的实用程序在启动时加载到此调试器实例中。
      • g 继续运行。
    4. 返回目标计算机控制台(登录屏幕):
      • 从实用程序管理器启动您的实用程序。调试器(在 RDP 会话中)应该会在新进程中中断,您应该能够从那里进行调试。

    (我在我尝试过的机器上没有 Visual Studio;如果你在目标机器上安装了 VStudio,你可能可以使用它而不是 WinDBG。)

    如果您的实用程序甚至没有加载,那么 Windows 会在调用 CreateProcess 之前进行某种验证。安全日志可能会在这方面为您提供帮助。

    编辑 2 我尝试使用 strings 实用程序来定位生成对话框的程序,但我使用的是英文版 WinXP,所以我没有实际的字符串。我还没有运气寻找硬编码的“osk.exe”等。

    如果您能弄清楚是什么 EXE 放置了该对话框(可能是 utilman,可能是 winlogon...),您应该能够使用调试器附加到它并返回堆栈以查找错误的检查.一旦检查失败的大致区域,您应该能够在代码路径中更早设置一个断点,该断点应该在您下次尝试启动时进入调试器。您应该能够从那里逐步完成失败的检查。对于所有这些,请确保您有可用的OS symbols,因为它应该使“路标”更易于阅读。我不知道你的调试器是否支持符号服务器。

    【讨论】:

    • Vista 的键好像变了。这些密钥在我的 XP 版本中不存在。
    【解决方案2】:

    您的程序是否经过数字签名?你的程序是从哪里运行的?

    尝试将其置于以下受保护路径之一:

    * ..\Program Files\ (and subfolders)
    * ..\Program Files (x86)\ (and subfolders, in 64-bit versions of Windows only)
    * ..\Windows\System32\ 
    

    你见过http://netsecurity.about.com/od/secureyourwindowspc/qt/uacuiaccess.htm 吗?这似乎描述了您正在尝试做的一些事情。

    【讨论】:

    • 我现在使用测试密钥(在我的测试机器上受信任)对我的应用程序进行了数字签名。它没有帮助。该文件已位于 \Windows\System32 文件夹中。该链接中的问题有点不同(它是关于在非安全桌面上的 Vista 上运行提升提示),我想在 WinXP 上的安全桌面上运行应用程序。但无论如何,签署应用程序可能是一个好主意,只是它没有帮助。
    【解决方案3】:

    我不确定该消息的来源是什么,但我知道有一个名为 Winlogon 的桌面对象是安全的 CTRL+ALT+DELETE 桌面。在您的 GUI 线程中创建任何窗口之前,您可以使用 OpenDesktopSetThreadDesktop,这将使您的窗口能够在那里显示。在较新版本的 Windows 中,可能还有另一种方法可以使用辅助功能 API。

    【讨论】:

    • 是的,我知道。在安全桌面上打开我自己的窗口不是我的问题。我想将我的程序添加到实用程序管理器。您知道,当您在登录屏幕上按 Window+U 时,您可以打开放大镜或屏幕键盘或某些 Windows 版本的旁白。我只想进入那个列表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多