【问题标题】:OpenProcess returns ERROR_ACCESS_DENIED for 32bit elevated processesOpenProcess 为 32 位提升的进程返回 ERROR_ACCESS_DENIED
【发布时间】:2019-11-12 06:51:42
【问题描述】:

我正在寻找我想终止的机器上的特定提升的 32 位进程。首先,我需要确保执行的是正确的文件。

为此,我遵循 Microsoft 的 this 示例,了解如何使用 OpenProcess()EnumProcessModules()GetModuleFileNameEx 获取所有进程文件名() 核函数。

从 Visual Studio 和提升的 Powershell(x86 或 x64)执行时,我得到一个 OpenProcess() 返回码 299,但进程句柄没问题,我可以得到文件名。

当我在提升的 CMD shell(在 Win10 x64 和 Win7 x86 上测试)中运行相同的二进制文件时,OpenProcess() 返回 5,表示 ERROR_ACCESS_DENIED。 -- 这对我来说是个问题,因为出于特定原因,该工具最终会从 CMD 运行。

我已经尝试为 OpenProcess() 调整所需的标志,但两个版本给出的结果与上述相同。

  • PROCESS_QUERY_INFORMATION | PROCESS_VM_READ | PROCESS_TERMINATE
  • PROCESS_QUERY_LIMITED_INFORMATION | PROCESS_VM_READ | PROCESS_TERMINATE
HANDLE hProcess = OpenProcess(dwDesiredAccess, FALSE, processID);
EnumProcessModules(hProcess, &hMod, sizeof(hMod), &cbNeeded);
GetModuleFileNameEx(....);

提前感谢任何提示和指点!

【问题讨论】:

  • 如果 OpenProcess() 返回 0 则失败 & GetLastError() 会告诉你为什么,这是你检查的吗?
  • OpenProcess 返回一个进程句柄。如果失败,则返回 NULL。否则它返回一个有效的句柄。如果它返回一个有效的句柄,就不要调用GetLastError,结果是没有意义的。所以 299 错误代码没有任何意义。
  • 但是,是什么让您认为您可以从非提升的进程获得提升的进程的句柄?系统说访问被拒绝是有原因的,不是吗?
  • 使用Process Explorer 列出您的进程拥有的所有权限。将在调试器下运行时的列表与从命令行运行时的列表进行比较。
  • @DavidHeffernan OP 的代码没有从未提升的进程中运行。它从提升的 Powershell 运行

标签: c winapi process


【解决方案1】:

最终,我在 C 中放弃了这一点,并在 C# 中使用 System.Diagnostics.Process 方法实现了它,没有任何缺陷。

感谢您的所有努力!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多