我尝试编写一个Utility Manager应用程序,我试图在WinXP SP3上测试它。
我将其添加到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Accessibility\Utility Manager
,并且在我登录时加载公用事业管理器时效果很好。
但是,当我尝试在登录前(通过Window + U)或从锁定的屏幕启动时从Utility Manager加载它时,会出现一条错误消息,说(大约,因为它是德语版的WinXP)此应用程序无法在安全桌面上执行。请与系统管理员联系以获取所需的权限“。
我需要做些什么才能使其在安全桌面上运行?
并[b]编辑:[/ B] 我按照David Pope的建议尝试调试utilman.exe(使用OllyDebug,因为我比使用新的调试器更习惯于此,并要求它打破进程创建)。似乎我的应用程序根本没有开始。由于OllyDebug似乎禁用了一些函数(比如中断API调用)(可能是因为该进程以不同的用户身份运行),所以我使用Sysinternals Process Monitor对其进行了双重检查。启动屏幕键盘时,会出现“已创建过程”事件;启动我的工具时,不会出现任何事件。
另一方面注意:当我将osk.exe(屏幕键盘)放入我的新注册表项时,它工作正常(我在菜单中基本上有两个屏幕键盘条目),但如果我复制osk.exe到osk2.exe并将osk2.exe作为可执行文件,屏幕键盘onls的副本在非安全桌面上启动。所以在调用可执行文件之前必须进行某种验证(针对文件名+内容)?用我的工具(或osk.exe)替换magnify.exe将使下一次重启后(当utilman重新启动时)不能正常工作。
换句话说:它只有在文件命名为osk.exe并且是屏幕键盘或文件名为magnify.exe并且是magnifyer时才有效。
这不会在事件日志中创建任何信息。
答案 0 :(得分:3)
您是否按照this page上的所有说明进行操作?它似乎涵盖了比你描述的更多的注册表设置。
编辑:正如您所指出的,看起来该页面适用于Vista。令人烦恼的是,MSFT如何剔除遗留信息并使其难以找到......
要检查的一件事是事件日志 - 也许它们包含一条线索。可以提高审计级别以查看更多与安全相关的数据。
我没有你的代码所以我自己无法调试它,但是我能够将调试器挂钩到utilman.exe并在安全桌面上启动实用程序时获得控制权。也许如果你这样做,你可以找出安全违规行为。
.childdbg 1
以确保实用程序在启动时加载到此调试器实例中。g
继续投放。(我在尝试过的机器上没有Visual Studio;如果你在目标机器上安装了VStudio,你可以使用它而不是WinDBG。)
如果您的实用程序甚至没有加载,那么Windows在调用CreateProcess之前正在进行某种验证。安全日志可能会帮助您。
编辑2 我尝试使用strings实用程序找到生成对话框的程序,但我使用的是英文WinXP,所以我没有实际的字符串。我也寻找硬编码的“osk.exe”等没有运气。
如果你能弄清楚EXE在那个对话框中的位置(也许是utilman,也许是winlogon ......),你应该能够使用调试器附加到它上面并向上走回堆栈以查找错误输出的检查。一旦您检查失败的一般附近,您应该能够在代码路径中设置一个断点,该断点在您下次尝试启动时应该进入调试器。你应该能够从那里逐步完成失败的检查。对于所有这些,请确保您有OS symbols可用,因为它应该使“路标”更容易阅读。我不熟悉您的调试器是否支持符号服务器。
答案 1 :(得分: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吗?这似乎描述了你想要做的一些事情。
答案 2 :(得分:0)
我不确定该消息的来源是什么,但我知道有一个名为Winlogon的桌面对象是安全的CTRL + ALT + DELETE桌面。在GUI线程中创建任何窗口之前,您可以使用OpenDesktop和SetThreadDesktop,这样可以使窗口显示在那里。在较新版本的Windows中,可能有另一种方法可以使用辅助功能API。