Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何创建具有较低完整性级别(IL)的新流程?_C++_Windows_Security_Winapi - Fatal编程技术网

C++ 如何创建具有较低完整性级别(IL)的新流程?

C++ 如何创建具有较低完整性级别(IL)的新流程?,c++,windows,security,winapi,C++,Windows,Security,Winapi,从Windows Vista开始,具有较低完整性级别(IL)的进程似乎无法向具有较高完整性级别的进程发送消息。从安全的角度来看,这是有道理的,但它破坏了一些进程间的通信 我们有一个遗留应用程序(进程a),不幸的是,它必须以提升的“管理员”权限运行(通过将其快捷方式设置为始终以管理员身份运行来实现)。有时它需要实例化一个单独的应用程序(流程B)。因此,进程B继承了与进程a相同的提升权限(和IL)。问题就出在这里。流程B的其他独立实例可能没有提升的权限,所有这些流程B实例都需要能够相互发送消息。如果

从Windows Vista开始,具有较低完整性级别(IL)的进程似乎无法向具有较高完整性级别的进程发送消息。从安全的角度来看,这是有道理的,但它破坏了一些进程间的通信

我们有一个遗留应用程序(进程a),不幸的是,它必须以提升的“管理员”权限运行(通过将其快捷方式设置为始终以管理员身份运行来实现)。有时它需要实例化一个单独的应用程序(流程B)。因此,进程B继承了与进程a相同的提升权限(和IL)。问题就出在这里。流程B的其他独立实例可能没有提升的权限,所有这些流程B实例都需要能够相互发送消息。如果进程B的一个实例被提升而另一个实例没有被提升,那么这显然是失败的

我知道我们可以使用API方法在UIPI消息过滤器中打开漏洞,但这似乎不是理想的解决方案。相反,我更愿意让进程A以较低的权限生成进程B,特别是让它可以与其他进程B实例通信。我认为默认情况下,其他进程B实例在“中等”IL下运行,因此我希望进程A使用相同的IL生成进程B实例

我的搜索让我找到了和API方法,但尽管有这些文档,令牌和安全描述符的所有方面仍然让我非常困惑

我在这里也遇到了一些线程(和),但我找不到任何好的代码示例


有人能给我提供一些简单但“正确”的代码来帮助我使用适当的Windows IL生成子进程吗?具体地说,我想举一个例子,说明如何将现有进程作为令牌,并将其转换为具有减少的特权(我很确定我可以解决其余的问题)。我真的不清楚在修改流程令牌之前是否需要复制它。

我已经使用了这里描述的方法来实现这一点。基本思想是让Explorer为您运行进程B。由于资源管理器通常以中等完整性级别运行,因此这将为您提供所需的内容

http://brandonlive.com/2008/04/27/getting-the-shell-to-run-an-application-for-you-part-2-how/

第一个链接至少会给你一个好的背景

我们有一个遗留应用程序(进程a),不幸的是,它必须以提升的“管理员”权限运行(通过将其快捷方式设置为始终以管理员身份运行来实现)

一种更简洁的方法是将设置为清单。

警告!虽然这种方法对于最初的海报可能或多或少是合适的,但总的来说,这并不是一个好主意。特别要注意的是(根据注释线程),据报道,人工操纵的令牌会在更复杂的应用程序中引起问题,因此,如果您正在使用它们,请务必坚持使用基本的Win32 API。当然也有潜在的安全隐患

在大多数类似于OP的场景中,最好用启动器应用程序替换启动提升应用程序的快捷方式。然后,只要提升的应用程序正在运行,启动器就可以保持运行,并为提升的应用程序提供一个自然的有限令牌,用于启动非提升的进程


MSDN的文章中有启动低完整性流程的代码,类似于您的案例

首先,复制流程令牌,因为您不能(或者至少不应该)处理已经在使用的令牌。然后使用TokenIntegrityLevel类设置完整性级别。示例代码中似乎有一个错误,因为低完整性级别的正确SID是S-1-16-4096,而不是S-1-16-1024,但您仍然需要中等完整性级别,即S-1-16-8192。这些都可以找到


一旦此操作成功(即,一旦您能够从高完整性进程启动中等完整性进程),您应该尝试使用CreateRestrictedToken创建新令牌而不是DuplicateToken,并删除管理员令牌和所有权限(SeChangeNotifyPrivilege除外)。否则,新进程将具有中等完整性,但仍具有管理员权限,这可能使在同一会话中运行的任何恶意代码更容易提升其权限。

我可能没有回答您的完整问题,但正如您提到的CreateProcessAsUser和CreateRestrictedToken。我有一个使用这个API的代码。我写的代码是基于以下内容编写的

来源:[Windows Vista开发者版-第4部分-用户帐户控制]()

该代码可在以下链接中找到


示例代码:

目前我无法测试,但我最担心的是版本兼容性。这是否适用于从XP开始的所有Windows版本?它是否依赖于未来版本中可能出现的任何问题?它看起来还使用了Internet Explorer分发的库(请参阅)。如果用户没有安装IE,又如何,过程A不是VisualStudio项目,而是一个旧的C++ Builder应用程序。我知道如何在VisualStudio中设置应用程序清单,但您也可以使用其他C++项目来执行吗?在C++ XBuilder的XE2版本中,可以使用.RC文件将外部文件清单链接到项目的资源中。C++Builder XE2在项目选项中添加了对自定义清单的支持。@RemyLebeau–很高兴知道这一点,谢谢!顺便说一句,你很久以前在Borland论坛上为我回答了一个问题。幸运的是,我和你身边的其他人都能分享你的专业知识。[=@Jeremy:这些都是值得关注的问题。对于XP,你必须做好准备