c++ - 从管理员帐户模拟 SYSTEM(或等效)

标签 c++ windows impersonation privileges

这个问题是this question的跟进和延续。关于我目前正在处理的权限问题。



问题总结:
我在没有调试程序 (SeDebugPrivilege) 权限的域管理员帐户下运行程序,但我需要在本地计算机上使用它。


Klugey 解决方案:
该程序可以将自身作为服务安装在本地机器上,并启动该服务。所述服务现在在 SYSTEM 帐户下运行,这使我们能够使用我们的 SeTCBPrivilege 权限创建一个新的具有 SeDebugPrivilege 的访问 token 。然后我们可以使用新创建的 token 重新启动具有提升权限的初始程序。


我个人不喜欢这个解决方案。我觉得应该有可能以管理员身份获得必要的权限, 不必进行系统修改,例如安装服务(即使只是临时的)。

我希望有一个解决方案可以最大限度地减少系统修改,并且最好可以即时完成(即:不需要重新启动自身)。我没有成功地尝试 LogonUser 作为 SYSTEM 并尝试在已知的 SYSTEM 进程(例如 csrss.exe)上 OpenProcessToken(失败,因为你不能使用 PROCESS_QUERY_INFORMATION OpenProcess 来获取进程的句柄,而没有我试图获得的权限)。

我已无计可施,无法找到解决此问题的替代方案。我希望有一种简单的方法可以在主机上获取特权 token 并为该程序模拟它,但我还没有找到方法。



如果有人知道解决这个问题的方法,或者甚至对可能的事情有建议,请告诉我。非常感谢您的帮助,谢谢!

最佳答案

根据设计,不允许任何进程获得 NT AUTHORITY\SYSTEM 权限,除非它由另一个具有 NT AUTHORITY\SYSTEM 权限的进程启动。该服务是一种解决方法,因为服务控制管理器本身在系统启动时由内核启动。

不幸的是,操作系统旨在阻止您正试图做的事情。如果您希望之后能够删除您的服务,只需授予相关用户本地计算机的 SeDebugPrivilege,然后让该服务自行卸载。

更好的是,让要修改其内存的程序更改 DACL,以允许您的管理员在没有 SeDebugPrivilege 的情况下访问它的内存。那么您根本不需要获取特权。

EDIT2:更好的是,首先使用共享内存。这就是它的用途。

关于c++ - 从管理员帐户模拟 SYSTEM(或等效),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2991957/

相关文章:

windows - 我如何在 windows 7 x64 上将 jboss EAP-7.0.0 作为 windows 服务运行?

c - ReadProcessMemory 返回一个更大的缓冲区(C,windows)

c++ - 模拟 MFC C++

hadoop - Hive 用户模拟

c++ - 用非常大的数字进行计算

c++ - 用 c 方法包装 c++ 方法

java - 从 Java 到 C++ : how to use one custom class var within another custom class?

C++ 让 Windows 服务启动另一个程序

linux - windows server 到 linux 的 MongoDb 数据

c# - 安全 Windows 模拟?