Я пытаюсь получить командную строку запуска процессов в Windows, используя код ниже: Но я получаю только командную строку IDman.exe
так:работает команда технологической линии
C:\Program Files (x86)\Internet Download Manager\IDMan.exe" /onboot
Но я знаю, что есть много других процессов с командами.
Подумайте, что случилось с моим кодом.
PVOID GetPebAddress(HANDLE ProcessHandle)
{
_NtQueryInformationProcess NtQueryInformationProcess =
(_NtQueryInformationProcess)GetProcAddress(
GetModuleHandleA("ntdll.dll"), "NtQueryInformationProcess");
PROCESS_BASIC_INFORMATION pbi;
NtQueryInformationProcess(ProcessHandle, 0, &pbi, sizeof(pbi), NULL);
return pbi.PebBaseAddress;
}
void get_process_cmd_line(DWORD pID)
{
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION |
PROCESS_VM_READ |
PROCESS_TERMINATE,
FALSE, pID);
PPEB ppeb = (PPEB) GetPebAddress(hProcess);
PPEB ppebCopy = (PPEB)malloc(sizeof(PEB));
BOOL result = ReadProcessMemory(hProcess,
ppeb,
ppebCopy,
sizeof(PEB),
NULL);
if(!result){std::cout<<"Er. adress";return;}
PRTL_USER_PROCESS_PARAMETERS pRtlProcParam = ppebCopy->ProcessParameters;
PRTL_USER_PROCESS_PARAMETERS pRtlProcParamCopy =
(PRTL_USER_PROCESS_PARAMETERS)malloc(sizeof(RTL_USER_PROCESS_PARAMETERS));
result = ReadProcessMemory(hProcess,
pRtlProcParam,
pRtlProcParamCopy,
sizeof(RTL_USER_PROCESS_PARAMETERS),
NULL);
if(!result){std::cout<<"Er. ";return;}
PWSTR wBuffer = pRtlProcParamCopy->CommandLine.Buffer;
USHORT len = pRtlProcParamCopy->CommandLine.Length;
PWSTR wBufferCopy = (PWSTR)malloc(len);
result = ReadProcessMemory(hProcess,
wBuffer,
wBufferCopy,
len,NULL);
if(!result){std::cout<<"Er. cmdLine";return;}
std::wcout<<wBufferCopy;
return;
}
Редактирование: я заметил, что когда get_process_cmd_line (DWORD pID) преуспеет в получении командной строки процесса, это уже не может быть успешным !!! –