Нашел в инете несколько проц-менеджеров которые умеют это делать, даже спец утилиту.. CmdLine в аттаче. Собственно сабж, не подскажите как они получают эту инфу? чего-то аттач барахлит http://openfile.ru/93701/
Через PEB процесса, думается. Что-то типа - Код (Text): PPEB GetPeb() { PPEB lpPeb; __asm { mov eax, fs:[0x18] mov eax, [eax+0x30] mov lpPeb,eax } return lpPeb; } Далее в PEB имеем все окружение процесса, в т.ч. его параметры в структуре PROCESS_PARAMETERS. Смотри описание PEB.
Flasher Для получения PEB чужого процесса используй NtQueryInformationProcess (описание найдешь в MSDN).
Хехе, а в утилитке кто-то сильно постарался, чтобы не подсмотрели, как она это делает =), у меня только в DeFixed загрузилась =)
А процесс может быть создан с параметрами ???, в NtCreateProcess даже имени модуля из которого процесс создаётся нет. Они записываются после создания процесса. PEB.ProcessParameters:RTL_USER_PROCESS_PARAMETERS. Для защиты код может затереть это поле. Нормально запись параметров процесса исполняется во второй выделенный блок памяти, а это обычно 0x20000.
Clerk, ты прав в NtCreateProcess имени модуля нет. Оно указывается раньше, до вызова NtCreateProcess при вызове NtOpenFile -> NtCreateSection. ТС спрашивает, как получить параметры, с которыми процесс был запущен, а не создан. Вещи разные... ))
steelfactor Да, точно. Я к тому, что если затереть память с адреса PEB.ProcessParameters то никак не получится определить.
Можно так: > Определяем PEB(NtQueryInformationProcess, ProcessBasicInformation) > Читаем указатель ProcessParameters c определённого адреса PEB + 0x10 > Проверяем валидность указателя с помощью NtQueryVirtualMemory > Если память выделена устанавливаем атрибуты PAGE_READWRITE и читаем блок себе в процесс. > Проверяем корректность RTL_USER_PROCESS_PARAMETERS(.MaximumLength = размер_блока, валидность юникодовских строк - CurrentDirectory, DllPath, ImagePathName, CommandLine). > Если считать не удалось, невалидный указатель, то юзаем NtQueryVirtualMemory несколько раз(первый - чтобы узнать размер первого блока памяти, второй - по дефолту RTL_USER_PROCESS_PARAMETERS). > Юзаем п4/п5. > Если не удалось прочитать, то есть защита, получаем полное имя процесса(NtQueryInformationProcess, ProcessImageFilename), конвентируем его в дос-формат и сканим всю память процесса на наличие этой строки. > Если она найдена сканим память на наличие указателя на эту строку. > Если он найден, проверяем валидность структуры UNICODE_STRING ниже на 4 по адресу найденного указателя. > Если структура валидна, предпологаем что она - часть структуры RTL_USER_PROCESS_PARAMETERS и проверяем её валидность с этого адреса UNICODE_STRING - 0x38.
Что то вроде этого: Код (Text): function GetCmdByPid(Pid: dword): string; var hProcess, Bytes: dword; Info: PROCESS_BASIC_INFORMATION; ProcessParametres: pointer; ImagePath: TUnicodeString; ImgPath: array[0..MAX_PATH] of WideChar; begin Result := ''; ZeroMemory(@ImgPath, MAX_PATH * SizeOf(WideChar)); hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, false, Pid); if ZwQueryInformationProcess(hProcess, ProcessBasicInformation, @Info, SizeOf(PROCESS_BASIC_INFORMATION), nil) = STATUS_SUCCESS then begin if ReadProcessMemory(hProcess, pointer(dword(Info.PebBaseAddress) + $10), @ProcessParametres, SizeOf(pointer), Bytes) and ReadProcessMemory(hProcess, pointer(dword(ProcessParametres) + $40), @ImagePath, SizeOf(TUnicodeString), Bytes) and ReadProcessMemory(hProcess, ImagePath.Buffer, @ImgPath, ImagePath.Length, Bytes) then begin Result := ExtractFileName(WideCharToString(ImgPath)); end; end; CloseHandle(hProcess); end;
Зная Энди я уверен что вопрос с подвохом. Видимо это тест собственной защиты, просто так не считать. Есть ситуации, когда память разделяется между потоками, два потока обратившиеся к одному и томуже адресу считывают разные значения. Не важно как это реализовано, это - одни из самых эффективных способов защиты в юзермоде, будьто манипуляции с сегментными регистрами, HB и др. Я бы выполнил всё описанное, но именно в потоке принадлежащему процессу откуда извлекается инфа(уже имеющимся в процессе).