我正在尝试从提升的进程创建中或低完整性进程。我知道还有其他类似的问题,但它们主要关注使用资源管理器或任务计划程序等解决方法,我想坚持使用CreateRestrictedToken()
+CreateProcessAsUser()
.
我认为一定可以以某种方式执行此操作,因为我相信 UAC 在您登录时会执行此操作,但我无法使令牌中的所有内容看起来像正常的 UAC Medium IL 令牌。
您可以通过创建令牌来获得 80%CreateRestrictedToken(hThisProcessToken, LUA_TOKEN, ...)
然后设置TokenOwner
, TokenDefaultDacl
and TokenIntegrityLevel
打电话之前CreateProcessAsUser()
.
剩下的问题是TokenVirtualizationAllowed
, TokenVirtualizationEnabled
, TokenElevation
, TokenElevationType
and TokenMandatoryPolicy
where SetTokenInformation()
失败并显示 ERROR_PRIVILEGE_NOT_HELD 或 ERROR_INVALID_PARAMETER。
如果我以 SYSTEM @ SECURITY_MANDATORY_SYSTEM_RID 身份运行并启用所有权限,而不是以管理员 @ SECURITY_MANDATORY_HIGH_RID 身份运行,那么我可以设置TokenMandatoryPolicy
and TokenVirtualization*
但设置TokenElevation*
还是失败了! (目前仅在 Windows 8 上进行了测试)
没有正确的TokenElevation*
令牌中的值是一个大问题,因为 Internet Explorer 无法在保护模式下启动,因为它认为令牌已提升。
The 文档 https://msdn.microsoft.com/en-us/library/windows/desktop/aa379591(v=vs.85).aspx for SetTokenInformation()
没有说哪个TOKEN_INFORMATION_CLASS
可以设置的项目以及需要哪些权限(如果有),我不明白为什么不允许您将这些设置为与实际完整性级别匹配的较低安全值(TokenIntegrityLevel
)的令牌。
使用更安全的API https://msdn.microsoft.com/en-us/library/windows/desktop/ms722422(v=vs.85).aspx创建一个SAFER_LEVELID_NORMALUSER
token 并没有解决任何这些问题,并且还创建了一个比普通 Medium IL 令牌更受限制的令牌。
我发现有人类似的问题 https://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/20a2d22b-6de6-449a-82f8-6b17e6ccd5be/how-to-createprocess-not-as-administrator?forum=windowssecurity#e558fff4-1a1f-4849-a0ee-0a953a0aa761从早期的 Vista/Longhorn 时代开始,从那以后没有任何改变吗?