0

我尝试编写实用程序管理器应用程序,并尝试在 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 并且是放大镜时,它才会起作用。

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

4

3 回答 3

3

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

编辑:正如您所指出的,该页面似乎适用于 Vista。令人讨厌的是 MSFT 如何剔除遗留信息并使其难以找到......

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

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

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

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

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

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

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

于 2009-04-20T06:46:05.873 回答
1

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

尝试将它放在以下受保护的路径之一中:

* ..\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吗?这似乎描述了你正在尝试做的一些事情。

于 2009-04-24T19:41:36.663 回答
0

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

于 2009-04-15T00:26:32.053 回答