Что нового

Ставим hook на WinAPI CreateProcess()

Ganibal95

GreenBytes
Сообщения
877
Репутация
240
Здравствуйте, помогите поставить хук на создание процесса, т.е отловить все параметры создания процесса, ну и при условии отложить создание...
Материал по функции CreateProcess()
Я видел хуки на мышку, клавиатуру, а вот с этим разобраться не могу...


Добавлено:
Сообщение автоматически объединено:

или есть способ узнать о появлении нового процесса, но что-бы цп 00 было...
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
способ узнать о появлении нового процесса
Может так ?:
Код:
$processes1 = ProcessList()
While 1
	$processes2 = ProcessList()
	If (UBound($processes2) -1) > (UBound($processes1) -1) Then Exit MsgBox(4096 + 64, 'TEST', 'NEW PROCESS')
	Sleep(100)
WEnd
 
Автор
Ganibal95

Ganibal95

GreenBytes
Сообщения
877
Репутация
240
Zaramot
Я примерно так-же использовал, пока не обнаружил что на моем компе это кушает 01 ЦП, когда установил на чужой, (он слабее) у него аж 7-11 цп...
По этому вынужден найти более лучший способ...
 

erlik

Продвинутый
Сообщения
317
Репутация
84
Ganibal95
OffTopic:
Может умные люди чего и посоветуют, однако вот тебе инфа с одного сайта:
В ядре, как известно, есть функция PsSetCreateProcessNotifyRoutine, обратившись к которой из драйвера режима ядра можно установить хук на создание процесса. Или образом, аналогичным использованному Руссиновичем в FileMon и RegMon, поставить перехватчик на NtCreateProcess в ntoskrnl, точно также, из драйвера ядра. Гарантируется безусловное оповещение о создаваемых процессах, обойти которое в принципе невозможно.
Вывод сделать несложно - полноценный перехват создания процесса (чтобы его потом и отменить можно было) из AutoIT вряд ли реализуем. Если только драйвер соответствующий не напишешь ;)
А фильтры SetWindowsHookEx работают только для окон, оболочки, клавиатуры, мыши ну и еще кой-чего...Список ниже.

WH_CALLWNDPROC - хук вызывается пpи вызове SendMessage.
WH_CALLWNDPROCRET - хук вызывается, когда возвpащается SendMessage.
WH_GETMESSAGE - хук вызывается, когда вызывается GetMessage или PeekMessage.
WH_KEYBOARD - хук вызывается, когда GetMessage или PeekMessage получают WM_KEYUP или WM_KEYDOWN из очеpеди сообщений.
WH_MOUSE - хук вызывается, когда GetMessage или PeekMessage получают сообщение от мыши из очеpеди сообщений.
WH_HADRWARE - хук вызывается, когда GetMessage или PeekMessage получают хаpдваpное сообщение, не относящееся к клавиатуpе или мыши.
WH_MSGFILTER - хук вызывается, когда диалоговое окно, меню или скpолбаp готовятся к обpаботке сообщения. Этот хук - локальный. Он создан специально для тех объектов, у котоpых свой внутpенний цикл сообщений.
WH_SYSMSGFILTER - то же самое WH_MSGFILTER, но системный.
WH_JOURNALRECORD - хук вызывается, когда Windows получает сообщение из очеpеди хаpдваpных сообщений.
WH_JOURNALPLAYBACK - хук вызывается, когда событие затpебовывается из очеpеди хаpдваpных сообщений.
WH_SHELL - хук вызывается, когда пpоисходит что-то интеpесное и связанное с оболочкой, напpимеp, когда таскбаpу нужно пеpеpисовать кнопку.
WH_CBN - хук используется специально для CBT.
WH_FOREGROUND - такие хуки используются Windows. Обычным пpиложениям от них пользы немного.
WH_DEBUG - хук используется для отладки хук-пpоцедуpы
А что касается мониторинга процессов, то даже taskmgr кушает 2% ресурсов каждые полсекунды проверяя нет ли нового процесса. И видимо, это единственный способ в твоем случае.
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Код:
$objService =  ObjGet("WinMgmts:\\.\root\cimv2")
$objEventSource = $objService.ExecNotificationQuery _
            ("SELECT * FROM __InstanceCreationEvent " & _
             "WITHIN 5 WHERE (TargetInstance ISA 'Win32_Process' " & _
              "AND TargetInstance.Name='NOTEPAD.EXE') ")
While 1
  $objEvent = $objEventSource.NextEvent
  $objEvent.TargetInstance.Terminate
WEnd
 

La2Angel

Новичок
Сообщения
156
Репутация
1
Данный пример, вырубает процесс, но я могу многое уже сделать :smile: как минимум проходит секунды 2-3.
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Проходит 5 сек. WITHIN 5 - меняешь на 1 будет прибивать раз в секунду
 

sims

Осваивающий
Сообщения
184
Репутация
24
OffTopic:
erlik [?]
Вывод сделать несложно - полноценный перехват создания процесса (чтобы его потом и отменить можно было) из AutoIT вряд ли реализуем. Если только драйвер соответствующий не напишешь
Что же мешает написать драйвер?
Видел примеры драйверов, перехватывающих функции ядра и они относительно не сложны. Написать для PsSetCreateProcessNotifyRoutine думаю так же не составит труда.
Для этого понадобится WDK (Windows Driver Kit) и хорошее знание Си.
Если с Си не дружите, то можно воспользоваться инструментом по проще, с синтаксисом похожим на AutoIt. http://pure-basic.narod.ru/forum_files/driver/5_11/PureBasic_5.11_Driver_x86_v1.0.zip
Обсуждение создания перехватывающих функции драйверов и возможные "подводные камни" при их разработке. http://purebasic.info/phpBB3ex/viewtopic.php?f=19&t=3239

Подключить такой драйвер к AutoIt будет не сложно.
 

oesoes

xor eax,eax
Сообщения
171
Репутация
9
sims [?]
Вывод сделать несложно - полноценный перехват создания процесса (чтобы его потом и отменить можно было) из AutoIT вряд ли реализуем. Если только драйвер соответствующий не напишешь
У меня тоже есть велосипед! :laugh: По теме: такой хук внедряется через библиотеку, так как без нее возможно только захучить свой процесс (а соответственно и только свои вызовы API), но никак не чужbt. То есть сама процедура-обработчик должна быть именно в подключаемой библиотеке.

Но! Какие библиотеки, скажете Вы, мы ведь тут на AutoIT разрабатываем. Для себя на работе мой коллега (он занимается околосистемным программированием и всем, что с ним связано) отыскал такую вот штуку: http://www.nektra.com/products/deviare-api-hook-windows/ - профессиональный хук-движок, которую можно юзать через все, что дружит с COM. Наш язык с ним дружит, справка там правда на C#, но написана очень подробно, так что, думаю, разберетесь. :ok:
 
Верх