c++ 使用 OpenProcess() 提升 .exe 的权限

Posted

技术标签:

【中文标题】c++ 使用 OpenProcess() 提升 .exe 的权限【英文标题】:c++ elevating privileges on an .exe using OpenProcess() 【发布时间】:2010-02-18 02:21:22 【问题描述】:

我一直在阅读 Hoglund 的一些书,我想我会尝试一下他的“简单调试器”...

反正我一直在尝试用线

hProcess = OpenProcess(PROCESS_ALL_ACCESS | PROCESS_VM_OPERATION, 0, aPID);

每次我在正在运行的进程上使用它时,hProcess 都会返回为 NULL,这是为什么 - 我使用的目标是 notepad.exe 的一个实例。

我可以使用以下方法终止进程没问题:

hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |
           PROCESS_VM_READ | PROCESS_TERMINATE, FALSE, aPID );

我想知道如何提升权限,以及为什么它不起作用。

谢谢,R.

【问题讨论】:

请添加更多上下文 - 您正在运行什么操作系统,调用失败后 GetLastError() 是什么,等等。 我在 windows XP pro service pack 3 上运行。返回的消息是拒绝访问。 【参考方案1】:

MSDN 中给出了一种可能性:

Windows Server 2003 和 Windows XP/2000: 大小 PROCESS_ALL_ACCESS 标志增加 Windows Server 2008 和 Windows Vista。 如果为 Windows 编译的应用程序 运行 Server 2008 和 Windows Vista 在 Windows Server 2003 或 Windows 上 XP/2000,PROCESS_ALL_ACCESS 标志 太大而功能 指定此标志失败 ERROR_ACCESS_DENIED。为了避免这种情况 问题,指定最小集合 所需的访问权限 手术。如果 PROCESS_ALL_ACCESS 必须 使用时,将 _WIN32_WINNT 设置为 最低操作系统目标 您的应用程序(例如,#define _WIN32_WINNT _WIN32_WINNT_WINXP)。有关详细信息,请参阅使用 Windows 标头。

您的目标是什么操作系统,PROCESS_ALL_ACCESS 使用了什么值?如果它是 Vista 之前的操作系统,并且您传递的值是 0xFFFF,这可能是问题的原因。

【讨论】:

【参考方案2】:

您使用的是 Vista 还是 Windows 7?如果是这样,您需要在二进制文件中嵌入一个UAC manifest 文件。在该清单中将 requestedExecutionLevel 设置为 requireAdministrator。这应该会让 UAC 提示输入管理员密码,然后尝试提升您的应用程序的权限。

【讨论】:

以上是关于c++ 使用 OpenProcess() 提升 .exe 的权限的主要内容,如果未能解决你的问题,请参考以下文章

openprocess提升为测试权限

c++ OpenProcess() 函数返回值为啥返回NULL 急需解决!!! 邮箱372199852@qq.com

OpenProcess 失败(SeDebugPrivilege?)

c++ 修改内存

VC++ 2008,OpenProcess 总是返回错误 5(拒绝访问)

OpenProcess 错误 87 参数无效