【发布时间】: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 运行