Обнаружение дочерних процессов - PullRequest
3 голосов
/ 14 октября 2010

Есть ли способ (в C ++ и Windows XP) определить, порождает ли один процесс какие-либо другие процессы?

например,

write.exe в system32 порождает wordpad.exe, затем исчезает, есть ли функция, которая сообщает мне, собирается ли процесс сделать это?

для тех, кто заинтересован, я решил проблему, используя этот раздел MSDN:
http://msdn.microsoft.com/en-us/library/aa390425(v=VS.85).aspx

Ответы [ 3 ]

3 голосов
/ 14 октября 2010

Ничего в Win32 API для этого нет. Однако он поддерживается через WMI с помощью запроса Win32_ProcessStartTrace. Вы найдете код C #, который демонстрирует запрос в моем ответе в этой теме . Написание кода WMI на C ++ довольно болезненно, вы найдете ссылку на стандартный код, который вы должны написать, в статье библиотеки MSDN.

Имейте в виду, что это не особенно быстро. Мне не ясно, насколько сильно поставщик WMI получает ядро ​​для генерации уведомлений, но учитывая скорость, которую он крякает, как опрос. Другими словами, к тому времени, когда вы получите уведомление, процесс, скорее всего, будет в хорошем состоянии. В противном случае это будет нормой для многозадачной операционной системы.

2 голосов
/ 14 октября 2010

Вы можете перечислять по дереву процессов, которое идентифицирует запущенные процессы и их родителей. Это обратное тому, что вы хотите (вы хотите идентифицировать дочерние процессы, а не родительские процессы). Но, конечно, отслеживая идентификаторы родительских процессов при перечислении, вы можете определить, какие подпроцессы породили данный процесс.

Для этого вызовите CreateToolhelp32Snapshot, а затем используйте Process32First и Process32Next для перечисления процессов. Перечисление заполнит структуру PROCESSENTRY32, которая содержит th32ParentProcessID член.

Это метод опроса; может быть другой способ перехватить функцию CreateProcess, но у меня нет никакой информации об этом.

0 голосов
/ 14 октября 2010

Я думаю, вам нужно создать глобальную подключаемую DLL-библиотеку, которая присоединяется к каждому запущенному процессу.Затем DLL находит место, где вызов функции CreateProcess сопоставляется с фактическим CreateProcess из kernel32, и изменяет запись таблицы, чтобы перенаправить вызов на собственный код, чтобы «обнаружить» вызов CreateProcess.Все это при условии, что какой-то пользовательский брандмауэр не помешает выполнению вашей глобальной ловушки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...