出于安全考虑,我的应用程序的UI模块使用high 强制性完整性级别运行。里面的一切都很好,除了一件事。为了与旧版本兼容,我需要允许用户向UI模块发出命令行调用。
目前,这一机制是这样运作的:
module.exe进程解析此命令行时,它将使用FindWindow通过其惟一的类名来定位UI模块的运行副本(或自定义的另一个副本)。然后它使用注册电文 API向它发送一个PostMessage。high完整性级别),当它接收到消息时,相应地处理它。问题是,因为运行中的UI模块副本具有high完整性级别,所以它无法从较低的完整性级别接收消息,或者在Windows运行该模块以解析快捷命令时无法接收该模块的副本,这使得它能够以medium完整性级别运行。
为了解决这个问题,我找到了这个UIAccess标志(请看这里,向下滚动到上面写着“UI自动化应用程序的UIAccess”)。
因此,我的假设是,如果设置此标志并对UI模块进行代码签名:

它将能够绕过我前面描述的UIPI限制。
它运行得很好:

但是我看到的是,当我从运行在PostMessage完整性级别的模块中调用ERROR_ACCESS_DENIED时,上面描述的算法中的medium API仍然失败。
我错过了什么?
发布于 2016-10-19 18:59:35
您所描述的内容将在Win32 API文档中介绍:
如果函数失败,则返回值为零。要获得扩展的错误信息,请调用GetLastError。当达到限制时,GetLastError返回
ERROR_NOT_ENOUGH_QUOTA。 当消息被UIPI阻塞时,使用GetLastError检索的最后一个错误设置为5(访问被拒绝)。
其中UIPI是用户界面权限隔离
什么是用户界面特权隔离(UIPI) 这也被称为UI特权级别隔离(UIPI)。 作为Vista安全初始化的一部分,具有UI的应用程序将以三种不同级别的权限运行。应用程序窗口可以与同级或更低级别的其他窗口交互,但不能与较高级别/权限的应用程序交互。 只有在具有调用
ChangeWindowMessageFilter()**.的消息的高级权限应用程序显式允许的情况下,低权限模式才能向高级特权应用程序发送消息此外,较低权限的应用程序只能读取高特权应用程序拥有的**HWND.。 Internet是一个运行在最低权限级别上的示例进程。 参考链接: http://msdn2.microsoft.com/en-us/library/ms632675.aspx http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnlong/html/AccProtVista.asp UIPI阻止低权限进程通过阻止以下行为访问较高权限进程。 低权限进程不能: -执行高级进程特权的窗口句柄验证。 -SendMessage或PostMessage到更高权限的应用程序窗口。这些应用程序编程接口(API)返回成功,但悄悄地删除窗口消息。 -使用线程挂钩连接到更高权限的进程。 -使用日志挂钩监视更高权限的进程。 -对较高权限进程执行动态链接库(DLL)-injection。 启用UIPI后,以下共享用户资源仍然在不同权限级别的进程之间共享。 -桌面窗口,它实际上拥有屏幕表面 -桌面堆只读共享内存 -全球原子表 -剪贴板
正如文档所述,更高权限的应用程序需要使用ChangeWindowMessageFilter()来允许来自低权限应用程序的特定窗口消息:
从用户界面特权隔离(UIPI)消息筛选器中添加或删除消息。
在Windows 7及更高版本上,改用ChangeWindowMessageFilterEx():
为指定的窗口修改用户界面特权隔离(UIPI)消息筛选器。
因此,在您的高级特权进程调用RegisterWindowMessage()以获取已注册的消息ID之后,它需要将该ID传递给ChangeWindowMessageFilter/Ex(),以便从较低权限的进程接收该消息。
https://stackoverflow.com/questions/40122964
复制相似问题