Как получить параметры, с которыми были запущены процессы?

Тема в разделе "WASM.WIN32", создана пользователем Flasher, 3 окт 2008.

  1. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Нашел в инете несколько проц-менеджеров которые умеют это делать, даже спец утилиту..
    CmdLine в аттаче.
    Собственно сабж, не подскажите как они получают эту инфу?

    чего-то аттач барахлит :) http://openfile.ru/93701/
     
  2. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    Через PEB процесса, думается.
    Что-то типа -
    Код (Text):
    1. PPEB GetPeb()
    2. {
    3.     PPEB lpPeb;
    4.  
    5.     __asm {
    6.         mov eax, fs:[0x18]
    7.         mov eax, [eax+0x30]
    8.         mov lpPeb,eax
    9.     }
    10.     return lpPeb;
    11. }
    Далее в PEB имеем все окружение процесса, в т.ч. его параметры в структуре PROCESS_PARAMETERS. Смотри описание PEB.
     
  3. inviZ

    inviZ Сергей

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    92
    Адрес:
    Хабаровск
    Flasher
    Для получения PEB чужого процесса используй NtQueryInformationProcess (описание найдешь в MSDN).
     
  4. Velheart

    Velheart New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    526
    Хехе, а в утилитке кто-то сильно постарался, чтобы не подсмотрели, как она это делает =), у меня только в DeFixed загрузилась =)
     
  5. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    А процесс может быть создан с параметрами ???, в NtCreateProcess даже имени модуля из которого процесс создаётся нет. Они записываются после создания процесса. PEB.ProcessParameters:RTL_USER_PROCESS_PARAMETERS.
    Для защиты код может затереть это поле. Нормально запись параметров процесса исполняется во второй выделенный блок памяти, а это обычно 0x20000.
     
  6. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    Clerk, ты прав в NtCreateProcess имени модуля нет. Оно указывается раньше, до вызова NtCreateProcess при вызове NtOpenFile -> NtCreateSection.
    ТС спрашивает, как получить параметры, с которыми процесс был запущен, а не создан. Вещи разные... ))
     
  7. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    steelfactor
    Да, точно. Я к тому, что если затереть память с адреса PEB.ProcessParameters то никак не получится определить.
     
  8. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    Хех, интересная мысль...
     
  9. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Можно так:
    > Определяем 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.
     
  10. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    Ну, теперь Flasher'у только осталось все это реализовать =)))
     
  11. GMax

    GMax Member

    Публикаций:
    0
    Регистрация:
    3 июл 2006
    Сообщения:
    218
    Что то вроде этого:
    Код (Text):
    1. function GetCmdByPid(Pid: dword): string;
    2. var
    3.  hProcess, Bytes: dword;
    4.  Info: PROCESS_BASIC_INFORMATION;
    5.  ProcessParametres: pointer;
    6.  ImagePath: TUnicodeString;
    7.  ImgPath: array[0..MAX_PATH] of WideChar;
    8. begin
    9.  Result := '';
    10.  ZeroMemory(@ImgPath, MAX_PATH * SizeOf(WideChar));
    11.  hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, false, Pid);
    12.  if ZwQueryInformationProcess(hProcess, ProcessBasicInformation, @Info,
    13.                               SizeOf(PROCESS_BASIC_INFORMATION), nil) = STATUS_SUCCESS then
    14.   begin
    15.    if ReadProcessMemory(hProcess, pointer(dword(Info.PebBaseAddress) + $10),
    16.                         @ProcessParametres, SizeOf(pointer), Bytes) and
    17.       ReadProcessMemory(hProcess, pointer(dword(ProcessParametres) + $40),
    18.                         @ImagePath, SizeOf(TUnicodeString), Bytes)  and
    19.       ReadProcessMemory(hProcess, ImagePath.Buffer, @ImgPath,
    20.                         ImagePath.Length, Bytes) then
    21.         begin
    22.           Result := ExtractFileName(WideCharToString(ImgPath));
    23.         end;
    24.    end;
    25.  CloseHandle(hProcess);
    26. end;
     
  12. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Зная Энди я уверен что вопрос с подвохом. Видимо это тест собственной защиты, просто так не считать.
    Есть ситуации, когда память разделяется между потоками, два потока обратившиеся к одному и томуже адресу считывают разные значения. Не важно как это реализовано, это - одни из самых эффективных способов защиты в юзермоде, будьто манипуляции с сегментными регистрами, HB и др. Я бы выполнил всё описанное, но именно в потоке принадлежащему процессу откуда извлекается инфа(уже имеющимся в процессе).
     
  13. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Спасибо господа, это то что нужно..
    Clerk, угумс, как обычно.., защита, защита и еще раз защита ;)