UniqueProcessId
显示请求的进程ID并且PebBaseAddress
不为空,但是系统在读取它时抛出AV。
此代码在大多数情况下都有效,但对于某些特定进程会失败(它们似乎不相关:
iexplore.exe
、vcpkgsrv.exe
、rdpclip.exe
等)。 Win10 22H2
这是文本代码
// using PROCESS_ALL_ACCESS nor MAXIMUM_ALLOWED doesn't help
AutoHandleNull hProcess{ ::OpenProcess(ProcessQueryRight/*PROCESS_QUERY_LIMITED_INFORMATION*/, FALSE, procEntry.th32ProcessID) };
if (hProcess)
{
::PROCESS_BASIC_INFORMATION pbi{};
ULONG returnLength;
const NTSTATUS st = pNtQueryInformationProcess(hProcess.get(), ProcessBasicInformation, &pbi, sizeof(pbi), &returnLength);
if (NT_SUCCESS(st) && pbi.PebBaseAddress && pbi.PebBaseAddress->SessionId == sessionID)
{
return procEntry.th32ProcessID;
}
}
PebBaseAddress
位于目标进程的地址空间中,因此需要使用ReadProcessMemory
。