У меня тут одна прога в PID возвращает -1. Как она это делает, или точнее, какие для этого есть способы?
Это клиент, который "следит за безопасностью информации" у нас на рабочих компах. Вот мне и интересно, как он свой PID скрывает. Это можно сделать с user-уровня?
_DEN_ System Explorer показывает для него нормальный PID, или тот же -1 ? Насчет как самому сделать, надо наверное покопаться в структурах [fs:xxx].
Получить Id можно через описатель процесса (WinXP SP1+), правда тут уже нужен сам описатель: Код (Text): void GetProcessId( HANDLE Process ); // Ошибка в MSDN2003a - тип не void, а DWORD Есть вариант внедрить в сей процесс ловушку (общую для всех процессов) в которой данную функцию вызывать так: Код (Text): DWORD pid = GetProcessId (GetCurrentProcess()); BOOL ugly = (pid != GetCurrentProcessId ()); После опознания процесса можно сдампить его и хорошенько диассемблировать... Другой вариант опознания - брутфорсом проверить все pid в диапазоне от 4 до 65532 (на предмет ошибки функции OpenProcess), и полученный список сравнить с тем что дает Process32First/Process32Next. Вот кстати такой код: Код (Text): var plist: array [1..16384] of dword; cnt, n: dword; h: THandle; t, i, err: dword; begin re.Clear; // rich edit control clears cnt := 0; n := 8; t := GetTickCount; repeat err := 0; SetLastError (0); h := OpenProcess (PROCESS_ALL_ACCESS, false, n); if h = 0 then err := GetLastError (); if (h <> 0) then begin inc (cnt); plist [cnt] := n; //re.Lines.Add(format ('Success open process 0x%x', [n])); CloseHandle (h); end; if (err <> 0) then begin if ERROR_INVALID_PARAMETER <> err then begin inc (cnt); plist [cnt] := n; // re.Lines.Add(format ('Failed open process 0x%x', [n])); end; end; inc (n, 4); until n >= 65536; t := GetTickCount - t; re.Lines.Add (format ('Time for all = %d, process count = %d', [t, cnt])) end; По отношению к Process Explorer он находит куда много больше процессов - 68 против 36 (на моей рабочей машине iCel@2400) за ничтожное время - 35 мсек. [edited] Прошу прощения - вкралась ошибка - шаг должен быть равен 4, таким образом находиться всего 34 процесса, что меньше чем у Process Explorer.
Как раз два процесса которые алгоритм не находит в Process Explorer обозначенны как: DPCs PID = n/a Interrupts PID = n/a.
Посмотри здесь, по высказываниям ms-men (знакомым ник кажется ) забить PID в системный уровнь можно из ring0, правда я не думаю что это-то что нужно.
_DEN_ Странно, на мой пост с брут-форс алгоритмом, ты так не радовался (жаловался) Я кстати пришел к выводу, что этот алгоритм хорошо подходит и для асма - время выполнения не очень большое, импортировать надо не много.