Как скрыть PID процесса?

Тема в разделе "WASM.WIN32", создана пользователем _DEN_, 16 июн 2005.

  1. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    У меня тут одна прога в PID возвращает -1. Как она это делает, или точнее, какие для этого есть способы?
     
  2. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    странная прога как называется?

    и какие функции возвращают ToolHelp / GetWindowThreadProcessId?
     
  3. krid24

    krid24 Member

    Публикаций:
    0
    Регистрация:
    17 авг 2004
    Сообщения:
    88
    Видимо изменяет соотв. поле в структуре EPROCESS (точнее, EPROCESS.UniqueProcessId)
     
  4. Avoidik

    Avoidik New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2004
    Сообщения:
    288
    Адрес:
    Russia
  5. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Это клиент, который "следит за безопасностью информации" у нас на рабочих компах. Вот мне и интересно, как он свой PID скрывает. Это можно сделать с user-уровня?
     
  6. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    alpet



    У него окон нету :dntknw:
     
  7. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    _DEN_

    System Explorer показывает для него нормальный PID, или тот же -1 ? Насчет как самому сделать, надо наверное покопаться в структурах [fs:xxx].
     
  8. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    alpet



    Что за System Explorer?
     
  9. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
  10. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    alpet



    Не, ниче не показывает. PID: n/a говорит.
     
  11. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    Получить Id можно через описатель процесса (WinXP SP1+), правда тут уже нужен сам описатель:
    Код (Text):
    1.  
    2. void GetProcessId(
    3.   HANDLE Process
    4. ); // Ошибка в MSDN2003a - тип не void, а DWORD
    5.  


    Есть вариант внедрить в сей процесс ловушку (общую для всех процессов) в которой данную функцию вызывать так:
    Код (Text):
    1.  
    2. DWORD pid = GetProcessId (GetCurrentProcess());
    3. BOOL ugly = (pid != GetCurrentProcessId ());
    4.  


    После опознания процесса можно сдампить его и хорошенько диассемблировать...



    Другой вариант опознания - брутфорсом проверить все pid в диапазоне от 4 до 65532 (на предмет ошибки функции OpenProcess), и полученный список сравнить с тем что дает Process32First/Process32Next.

    Вот кстати такой код:
    Код (Text):
    1.  
    2. var plist: array [1..16384] of dword;
    3.     cnt, n: dword;
    4.     h: THandle;
    5.     t, i, err: dword;
    6. begin
    7.  re.Clear; // rich edit control clears
    8.  cnt := 0;
    9.  n := 8;
    10.  t := GetTickCount;
    11.  repeat
    12.   err := 0;
    13.   SetLastError (0);
    14.   h := OpenProcess (PROCESS_ALL_ACCESS, false, n);
    15.   if h = 0 then err := GetLastError ();
    16.   if (h <> 0) then
    17.    begin
    18.     inc (cnt);
    19.     plist [cnt] := n;
    20.     //re.Lines.Add(format ('Success open process 0x%x', [n]));
    21.     CloseHandle (h);
    22.    end;
    23.   if (err <> 0) then
    24.    begin
    25.     if ERROR_INVALID_PARAMETER <> err then
    26.      begin
    27.       inc (cnt);
    28.       plist [cnt] := n;
    29.       // re.Lines.Add(format ('Failed open process 0x%x', [n]));
    30.      end;
    31.    end;
    32.    inc (n, 4);
    33.  until n >= 65536;
    34.  t := GetTickCount - t;
    35.  re.Lines.Add (format ('Time for all = %d, process count = %d', [t, cnt]))
    36. end;
    37.  


    По отношению к Process Explorer он находит куда много больше процессов - 68 против 36 (на моей рабочей машине iCel@2400) за ничтожное время - 35 мсек.

    [edited]

    Прошу прощения - вкралась ошибка - шаг должен быть равен 4, таким образом находиться всего 34 процесса, что меньше чем у Process Explorer.
     
  12. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    Как раз два процесса которые алгоритм не находит в Process Explorer обозначенны как:

    DPCs PID = n/a

    Interrupts PID = n/a.
     
  13. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Хмм... Походу ничего. Похоже кусок клиента работает в kernel-mode.
     
  14. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    Посмотри

    здесь, по высказываниям ms-men (знакомым ник кажется :)) забить PID в системный уровнь можно из ring0, правда я не думаю что это-то что нужно.
     
  15. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    ААаа!!! Дельфи!!!! ААааа!!!
     
  16. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    _DEN_

    Странно, на мой пост с брут-форс алгоритмом, ты так не радовался (жаловался) :)



    Я кстати пришел к выводу, что этот алгоритм хорошо подходит и для асма - время выполнения не очень большое, импортировать надо не много.