Как отследить запуск нового процесса?
От: Valery Boronin Россия linkedin.com/in/boronin
Дата: 06.11.01 19:45
Оценка: 6 (1)
Привет!
Как узнать, что система хочет запустить новый процесс?
Интересуют все способы, кроме как по таймеру опрашивать список запущенных процессов.
В идеале желательно иметь свой hook/callback который кто-то будет дергать с именем запускаемого процесса как параметр.
Подойдут и решения, основанные на драйверах, но тогда нужно решение для 9х и для НТ!

И в довесок, любой ли процесс можно терминировать или тормознуть(terminate) на время (suspend\resume process) из своего процесса?
Какие тут ограничения?
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Re: Как отследить запуск нового процесса?
От: Sasparella США  
Дата: 06.11.01 20:11
Оценка:
Здравствуйте Valery Boronin, Вы писали:

VB>Привет!

VB>Как узнать, что система хочет запустить новый процесс?
VB>Интересуют все способы, кроме как по таймеру опрашивать список запущенных процессов.
VB>В идеале желательно иметь свой hook/callback который кто-то будет дергать с именем запускаемого процесса как параметр.
VB>Подойдут и решения, основанные на драйверах, но тогда нужно решение для 9х и для НТ!

VB>И в довесок, любой ли процесс можно терминировать или тормознуть(terminate) на время (suspend\resume process) из своего процесса?

VB>Какие тут ограничения?

Мне кажется можно попробовать написать dll, перехватывающую вызовы CreateProcess и внедрить ее во все запущеные процессы. В том числе и explorer.

Ну а там уж простор для воображения. Как внедрять и перехватывать — подробно описано у Рихтера.

Саша.
Re[2]: Как отследить запуск нового процесса?
От: Valery Boronin Россия linkedin.com/in/boronin
Дата: 06.11.01 20:30
Оценка:
да, конечно, этот вариант с хуками мной уже рассматривался, более того, в принципе я уже нашел такое решение...
но там есть свои подводные камушки, может быть даже не в случае ловли CreateProcess...
еще нашел вариант с драйверами, можно найти ссылку на этом сайте
http://rsdn.ru/qna/?baseserv/hookapi.xml
так что похоже вопрос решен
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Re[3]: Как отследить запуск нового процесса?
От: Ihor Osovyak Украина  
Дата: 20.11.04 09:29
Оценка:
Здравствуйте, Valery Boronin, Вы писали:

VB>да, конечно, этот вариант с хуками мной уже рассматривался, более того, в принципе я уже нашел такое решение...

VB>но там есть свои подводные камушки, может быть даже не в случае ловли CreateProcess...
VB>еще нашел вариант с драйверами, можно найти ссылку на этом сайте
VB>http://rsdn.ru/qna/?baseserv/hookapi.xml
VB>так что похоже вопрос решен

Проходил мимо, случайно заметил.. Лучше позно, чем никогда.. Может кто поиском пользуется.

Для NT ряда — PsSetCreateProcessNotifyRoutine — можно поставить на уровне ядра...
Есть еще один, не совсем очевидный способ — драйвер-фильтр файловой системы и отслеживание IRP_MJ_CREATE с последующим анализом currentIrpStack->Parameters.Create.SecurityContext->DesiredAccess на предмет наличия флажка FILE_EXECUTE. Преимущество этого способа по сравнению с вариантом на основании PsSetCreateProcessNotifyRoutine — то, что мы получаем нотификацию "до того" и есть возможность отменить запуск процесса, а также то, что мы получаем нотификацию не только об "откритии" основного файла, а и нотификацию об отображении всех подгружаемых длл для соотв. процесса.
Re[4]: Как отследить запуск нового процесса?
От: Злость Россия  
Дата: 22.11.04 08:21
Оценка: 2 (2)
Здравствуйте, Ihor Osovyak, Вы писали:

[skip]

IO>Проходил мимо, случайно заметил.. Лучше позно, чем никогда.. Может кто поиском пользуется.


IO>Для NT ряда — PsSetCreateProcessNotifyRoutine — можно поставить на уровне ядра...


Ограниченый ресурс.

IO>Есть еще один, не совсем очевидный способ — драйвер-фильтр файловой системы и отслеживание IRP_MJ_CREATE с последующим анализом currentIrpStack->Parameters.Create.SecurityContext->DesiredAccess на предмет наличия флажка FILE_EXECUTE.


Не могу связать наличие этого флага и запуск процесса — совсем. Причем здесь то, что данные могут читаться использую файл подкачки, я так и не понял.

[skip]

Если уж спустимся в ядро — тогда перехват Zw(Nt)CreateSection и проверка флага SEC_IMAGE. Даст как раз то — что нам нужно. Вернее — опять в переди паравоза и как следствие будут излишние данные.
Правда, Ложь — мне все одно — я имею свое мнение.
Если функция недокументированна — это не значит, что ее не используют все ваши конкуренты в своих продуктах.
Любой строй переходный и отрицать это значит быть закостенелым идиотом.
Re[4]: Как отследить запуск нового процесса?
От: Valerio Россия linkedin.com/in/boronin
Дата: 22.11.04 09:07
Оценка: 1 (1)
Здравствуйте, Ihor Osovyak, Вы писали:

IO>Проходил мимо, случайно заметил.. Лучше позно, чем никогда.. Может кто поиском пользуется.

Да, давно это было... время идет Поиском наверняка кто-то пользуется )

IO>Для NT ряда — PsSetCreateProcessNotifyRoutine — можно поставить на уровне ядра...

Спасибо, за нафталиновую тему, проблема с тех пор была изучена и решения действительно уже известны

поиск с ключевым словом procmon выдаст достаточно материала по теме.
Например, эту ветку: Ещё раз про перехват запуска приложения
Автор:
Дата: 09.03.04
и другие.

IO>Есть еще один, не совсем очевидный способ — драйвер-фильтр файловой системы и отслеживание IRP_MJ_CREATE с последующим анализом currentIrpStack->Parameters.Create.SecurityContext->DesiredAccess на предмет наличия флажка FILE_EXECUTE. Преимущество этого способа по сравнению с вариантом на основании PsSetCreateProcessNotifyRoutine — то, что мы получаем нотификацию "до того" и есть возможность отменить запуск процесса, а также то, что мы получаем нотификацию не только об "откритии" основного файла, а и нотификацию об отображении всех подгружаемых длл для соотв. процесса.

тут Злость уже замечание внес, +1
... << RSDN@Home 1.1.4 beta 3 rev. 223>>
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Re[5]: Как отследить запуск нового процесса?
От: Ihor Osovyak Украина  
Дата: 24.11.04 10:22
Оценка:
Здравствуйте, Злость, Вы писали:


IO>>Есть еще один, не совсем очевидный способ — драйвер-фильтр файловой системы и отслеживание IRP_MJ_CREATE с последующим анализом currentIrpStack->Parameters.Create.SecurityContext->DesiredAccess на предмет наличия флажка FILE_EXECUTE.


З>Не могу связать наличие этого флага и запуск процесса — совсем. Причем здесь то, что данные могут читаться использую файл подкачки, я так и не понял.


При том, что образ бинарника отображается на память процесса — механизм MMP, который всегда сопровождается установкой соотв. флага. Конечно, немного не совсем прямое решение, да и будут случаи "фальшстартов" — но во вногих практических случаев это приемлимо.

З>[skip]


З>Если уж спустимся в ядро — тогда перехват Zw(Nt)CreateSection и проверка флага SEC_IMAGE. Даст как раз то — что нам нужно. Вернее — опять в переди паравоза и как следствие будут излишние данные.


Спасибо за наводку. Посмотрю. Хотя, предчувствую, что этот вариант не дает возможность перехвачивать подгрузку DLL..
Re[6]: Как отследить запуск нового процесса?
От: SergH Россия  
Дата: 24.11.04 18:27
Оценка:
Здравствуйте, Ihor Osovyak, Вы писали:

IO>Спасибо за наводку. Посмотрю. Хотя, предчувствую, что этот вариант не дает возможность перехвачивать подгрузку DLL..


Не пробовал, но имхо даёт. Это перехват того же MMF, только на этапе создания секции, а не на этапе чтения файла.
Делай что должно, и будь что будет
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.