Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Отслеживание пользовательских процессов


Автор: cnazgul 19.6.2010, 05:49
Доброго времени суток. 

Появилась необходимость отслеживать запущенные пользователем процессы . Список возможных процессов известен(есть доступ к приложениям для их исследования). Вопрос, как с достаточной достоверностью определить их наличие в памяти. Реализовать диспетчер задач можно, но большого смысла по именам искать процессы нет.. (один и тот же процесс может по сути иметь разные имена, простым переименованием приложения со стороны пользователя.. Process, proCess, NoProcess..). Есть ли какая нибудь однозначная информация о приложении (а заранее доступ к приложениям есть), способствующая их отлову? Почитал Рихтера.. На мой взгляд не нашлось подобной информации. Есть конечно возможность ловить их совокупными средствами мониторинга за системой (во всяком случае некоторые), но такое решение кажется мне очень уж громоздким.. 
Ради интереса собрал статистику о куче, тредах и модулях тестируемого процесса.. Только используемые модули конечно же идентичны. Искать же по используемым модулям долго да и не безопасно с точки зрения возможного совпадения с другими процессами(а вероятность немалая). Так как же мне их поймать? ) В сторону чего копать нужно в таких случаях? 

ЗЫ ОС - Windows. Язык Cи. И искать их желательно без админских прав в системе(но тут уж как получится..) 

Заранее спасибо.

Автор: borisbn 19.6.2010, 09:51
Создать в процессах именованный mutex и периодически пробовать открывать их?

Автор: EvilsInterrupt 19.6.2010, 12:30
cnazgul, Не совсем понятна задача.

>>Появилась необходимость отслеживать запущенные пользователем процессы 
Это создаваемые процессы ВАШИМ приложением или вообще ЛЮБОЙ запускаемый ?

Если первый вариант создавать дочерние с наследованием хэндлов и по хэндлу ивента сигнализировать, в родительском ожидать ивент ;)
Если второй, то  не так просто: хук CreateProcess, либо глубже а-ля Nt* , Zw* функции. 

Вобщем, просьба детализировать

Автор: xvr 19.6.2010, 12:59
Цитата(EvilsInterrupt @  19.6.2010,  12:30 Найти цитируемый пост)
Это создаваемые процессы ВАШИМ приложением или вообще ЛЮБОЙ запускаемый ?
Если второй, то  не так просто: хук CreateProcess, либо глубже а-ля Nt* , Zw* функции. 
Если второй, да если еще принять во внимание
Цитата(cnazgul @  19.6.2010,  05:49 Найти цитируемый пост)
один и тот же процесс может по сути иметь разные имена, простым переименованием приложения со стороны пользователя.. 
то это просто чехол  smile У исполняемого файла МОЖЕТ НЕ БЫТЬ однозначного идентификатора. Если файл переименуют, то однозначно можно сказать только по его содержимому (побайтовое сравнение с оригиналом).
Можно несколько оптимизировать этот процесс - делать не сравнение, а вычислять криптографический хэш (MD5 или SHA1)
Еще можно это делать не для всего файла, а только для секций кода и RO констант в нем (эти секции можно прочесть прямо в образе памяти процесса).
Т.е. для всех интересующих файлов делаются таблички с расположением секций в памяти (см формат PE файла) и их хэши. При создании нового процесса проверяется содержимое памяти для заданных областей


Автор: EvilsInterrupt 19.6.2010, 13:08
xvr, Ну не целиком побайтово, а вычислить адрес загрузки, взять AddressOfEntryPoint и от нее чего-нить, байты какого-нить куска кода проверить ;)

Автор: xvr 19.6.2010, 13:14
Цитата(EvilsInterrupt @ 19.6.2010,  13:08)
xvr, Ну не целиком побайтово, а вычислить адрес загрузки, взять AddressOfEntryPoint и от нее чего-нить, байты какого-нить куска кода проверить ;)

Могут совпасть даже у разных файлов

Автор: bra1ny 19.6.2010, 16:20
Цитата

Появилась необходимость отслеживать запущенные пользователем процессы . 

Цитата

Если второй, то  не так просто: хук CreateProcess, либо глубже а-ля Nt* , Zw* функции. 

PsSetCreateProcessNotifyRoutine (). Никаких хуков. Единственная проблема может быть в забитости PspCreateProcessNotifyRoutine   тогда придется подменять на свой обработчик( надо будет решать проблему с поиском PspCreateProcessNotifyRoutine ).


Автор: cnazgul 19.6.2010, 20:29
2EvilsInterrupt
Да:
Цитата(EvilsInterrupt @  19.6.2010,  12:30 Найти цитируемый пост)
вообще ЛЮБОЙ запускаемый

От имени пользователя.

2bra1ny
Цитата(bra1ny @  19.6.2010,  16:20 Найти цитируемый пост)
PsSetCreateProcessNotifyRoutine ()

извините, просто всегда думал, что вызвать её не из драйвера(а с под user mode) довольно затруднительно. Да и Вы верно говорите, что:
Цитата(bra1ny @  19.6.2010,  16:20 Найти цитируемый пост)
Единственная проблема может быть в забитости 

вероятно, это не самое гибкое и красивое решение.. Но если вы более детально обрисуете возможности использования/плюсы/ и т.п. буду очень признателен.

2xvr
Сам думал о нечто подобном:
Цитата(xvr @  19.6.2010,  12:59 Найти цитируемый пост)
Можно несколько оптимизировать этот процесс - делать не сравнение, а вычислять криптографический хэш (MD5 или SHA1)

Но если можно, вот об это по подробнее немного:
Цитата(xvr @  19.6.2010,  12:59 Найти цитируемый пост)
Еще можно это делать не для всего файла, а только для секций кода и RO констант в нем (эти секции можно прочесть прямо в образе памяти процесса).

Т.е. грубо так - читаем данные по заданным адресам(смотрим на таблицу секций процесса?), делаем хеш, сравниваем с нашим эталоном.. ?
Получается, что в такой реализации, мы пробегаем по всем юзерским процессам и проводим описанный выше алгоритм. А если это требуется делать каждые 5-10 сек (ловить процессы "зайцы" необходимо почти "на лету"..), то на сколько это будет быстродейственно?

Автор: bra1ny 19.6.2010, 20:50
Цитата

Извините, просто всегда думал, что вызвать её не из драйвера(а с под user mode) довольно затруднительно

я про юзер мод ничего не говорил.
Цитата

вероятно, это не самое гибкое и красивое решение.. Но если вы более детально обрисуете возможности использования/плюсы/

плюсы в том , что то документировано , и работает стабильно , нежели хуки  ) 

Автор: xvr 19.6.2010, 22:05
Цитата(cnazgul @  19.6.2010,  20:29 Найти цитируемый пост)
Т.е. грубо так - читаем данные по заданным адресам(смотрим на таблицу секций процесса?), делаем хеш, сравниваем с нашим эталоном.. ?
Сначала сравниваем саму таблицу секций (для каждого процесса). Если совпала с одним (или более) нашими эталонами, тогда вычисляем хэши и сравниваем с эталонами.
Цитата

А если это требуется делать каждые 5-10 сек (ловить процессы "зайцы" необходимо почти "на лету"..), то на сколько это будет быстродейственно? 
Если удастся отсеять большинство процессов на стадии сравнения таблиц секций, то довольно быстро

Автор: 12usver12 20.6.2010, 12:03
в юзермоде нет универсальных решений отслежевания процессов...
мне кажется что в твом случае хватит такого решения, в цикле
EnumProcesses  ->   pids  
GetPathByPid   -> exepath
CalcCRC32(exepath)  - > сравнить с TableCRC32 , если не все процессы из TableCRC32 работают -> ахтунг 

вот чисто теоретический есть метод контроля за созданием процесса (никогда не проверял), только придется копнуть в сторону сервера подсистем csrss.exe, любой 
 процесс создающй новый - информирует сервер подсистем о создании процесса, поэтому можно нужное хукнуть только в этом процессе (csrss)

Автор: bra1ny 20.6.2010, 12:28
Цитата

сервера подсистем csrss.exe

это настолько все не документировано , что жесть))

Автор: cnazgul 20.6.2010, 15:31
Цитата(xvr @  19.6.2010,  12:59 Найти цитируемый пост)
Еще можно это делать не для всего файла, а только для секций кода и RO констант в нем (эти секции можно прочесть прямо в образе памяти процесса).

вот тут подумалось.. а на сколько такая реализация будет оправдана, при использовании РЕ-протекторов для процессов-"зайцев" ?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)