Это странно. Ранее, работая под управлением Windows 7 x64, мне не удалось вызвать Win32 OpenProcess для 64-битных процессов. Погубился немного, и пришел к тонущему выводу, что этого просто не случилось.OpenProcess на x64 изображениях из приложения Win32
Тогда произошло смешное. Я пробовал его против идентификатора процесса для explorer.exe, и святой карп, он сработал! Начинал бросать в него другие идентификаторы процессов, и это просто проклятый дерьмо.
Как оказалось, я могу назвать OpenProcess против хорошего числа 64 процессов - исследователь, IType, Ipoint, taskhost, CMD, Mstsc, ... и т.д.
И другие поп 5 (Доступ запрещен) - winlogon, csrss, services, svchost, mdm, ...
Я подтверждаю «битность» и идентификатор процесса с помощью Process Explorer. Кроме того, вызов GetModuleFileNameEx в 64-битных процессах всегда терпит неудачу, поэтому предлагает двойную проверку для 32/64.
Это код:
' Get a handle to the process.
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, 0, ProcessID)
If hProcess Then
' Grab the filename for base module.
nChars = GetModuleFileNameEx(hProcess, 0, Buffer, Len(Buffer))
' If running in x64, http://winprogger.com/?p=26
If Err.LastDllError = ERROR_PARTIAL_COPY Then
nChars = GetProcessImageFileName(hProcess, Buffer, Len(Buffer))
End If
' Truncate and return buffer.
If nChars Then
GetProcessFileName = Left$(Buffer, nChars)
End If
Call CloseHandle(hProcess)
Else
Debug.Print "LastDllError:"; Err.LastDllError
End If
Ничего особенного. Просто хочу запросить процессы для таких вещей, как имя файла или время процесса. Кто-нибудь знает, какие различия между теми, которые я могу открыть, и теми, которые я не могу?
Дополнительная информация: Выполняется с администратором. UAC выключен. Да, это 32-битное приложение. У меня не было лучших результатов, используя PROCESS_QUERY_LIMITED_INFORMATION.
Спасибо ... Карл
Ouch. Да, это все, хорошо. Это также дало возможность GetProcessTimes. Я вижу, что Process Explorer также работает с этим параметром. Итак, если я буду запускать это под учетной записью пользователя с наименьшими привилегиями, это тоже не может быть сделано? В любом случае, спасибо! :-) –
Несколько групп имеют SeDebugPrivilege по умолчанию, в основном просто SYSTEM и группу администраторов. У наименее привилегированных пользователей определенно нет. Если бы это было так, повышение до полной привилегии было бы тривиальным, поскольку вы можете вводить код, который вы хотите запустить в привилегированный процесс. – Michael
Прежде чем приступить к этому сообщению, я подумал, что мне придется делать отдельные сборки в моем сценарии, но благодаря SeDebugPrivilege я могу теперь вызвать openprocess из 32-битного процесса и загрузить 64-битный процесс в моем случае im, чтобы загрузить lsass. – Syler