| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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* функции. Вобщем, просьба детализировать |
| Автор: EvilsInterrupt 19.6.2010, 13:08 |
| xvr, Ну не целиком побайтово, а вычислить адрес загрузки, взять AddressOfEntryPoint и от нее чего-нить, байты какого-нить куска кода проверить ;) |
| Автор: xvr 19.6.2010, 13:14 | ||
Могут совпасть даже у разных файлов |
| Автор: bra1ny 19.6.2010, 16:20 | ||||
PsSetCreateProcessNotifyRoutine (). Никаких хуков. Единственная проблема может быть в забитости PspCreateProcessNotifyRoutine тогда придется подменять на свой обработчик( надо будет решать проблему с поиском PspCreateProcessNotifyRoutine ). |
| Автор: cnazgul 19.6.2010, 20:29 | ||||
| 2EvilsInterrupt Да: От имени пользователя. 2bra1ny извините, просто всегда думал, что вызвать её не из драйвера(а с под user mode) довольно затруднительно. Да и Вы верно говорите, что: вероятно, это не самое гибкое и красивое решение.. Но если вы более детально обрисуете возможности использования/плюсы/ и т.п. буду очень признателен. 2xvr Сам думал о нечто подобном:
Но если можно, вот об это по подробнее немного:
Т.е. грубо так - читаем данные по заданным адресам(смотрим на таблицу секций процесса?), делаем хеш, сравниваем с нашим эталоном.. ? Получается, что в такой реализации, мы пробегаем по всем юзерским процессам и проводим описанный выше алгоритм. А если это требуется делать каждые 5-10 сек (ловить процессы "зайцы" необходимо почти "на лету"..), то на сколько это будет быстродейственно? |
| Автор: bra1ny 19.6.2010, 20:50 | ||||
я про юзер мод ничего не говорил.
плюсы в том , что то документировано , и работает стабильно , нежели хуки ) |
| Автор: xvr 19.6.2010, 22:05 | ||||
|
| Автор: 12usver12 20.6.2010, 12:03 |
| в юзермоде нет универсальных решений отслежевания процессов... мне кажется что в твом случае хватит такого решения, в цикле EnumProcesses -> pids GetPathByPid -> exepath CalcCRC32(exepath) - > сравнить с TableCRC32 , если не все процессы из TableCRC32 работают -> ахтунг вот чисто теоретический есть метод контроля за созданием процесса (никогда не проверял), только придется копнуть в сторону сервера подсистем csrss.exe, любой процесс создающй новый - информирует сервер подсистем о создании процесса, поэтому можно нужное хукнуть только в этом процессе (csrss) |
| Автор: bra1ny 20.6.2010, 12:28 | ||
это настолько все не документировано , что жесть)) |
| Автор: cnazgul 20.6.2010, 15:31 | ||
вот тут подумалось.. а на сколько такая реализация будет оправдана, при использовании РЕ-протекторов для процессов-"зайцев" ? |