
Контроль запуска процессов на Ассемблере

Контроль запуска процессов на Ассемблере
Сегодня разберем интересную задачу: надо отслеживать запуск приложений в системе и, в случае необходимости, выборочно блокировать их запуск. Решения могут быть различные, я предлагаю вот такой способ. Он заключается в том, что в цепочку AppCertDlls встраивается наша собственная библиотека-обработчик. При первом и любом последующем вызове функции CreateProcess обработчику будет передан полный путь до запускаемого файла.
Такой способ перехвата используется еще со времен Windows 2000, но подробно не документирован до сих пор. Ничего удивительного, что "коробочный" FASM совершенно не в курсе используемых в нем данных. Сперва немного констант:
Code (Assembler) : Убрать нумерацию
- ; Флаги запроса
- APPCERT_IMAGE_OK_TO_RUN = 1
- APPCERT_CREATION_ALLOWED = 2
- APPCERT_CREATION_DENIED = 3
- ; Флаги результата
- STATUS_SUCCESS = 0x00000000
- STATUS_UNSUCCESSFUL = 0xC0000001
Очень важное замечание. Финальную точку в "голосовании" о судьбе запускаемого процесса принимает обработчик, который находится последним в очереди. Даже если все предыдущие обработчики приняли решение, что процесс запускать не надо, и передали по цепочке STATUS_UNSUCCESSFUL, то последний обработчик легко может отменить это решение, вернув флаг STATUS_SUCCESS, и наоборот. На мой взгляд, это очень странное поведение со стороны системы. Ведь ничто не мешает, например, вредоносной программе встроить свой обработчик последним и контролировать таким образом запуск приложений. Если вы создаете приложение просто для логирования запуска процессов, то хорошим тоном будет учитывать "мнение" предыдущих обработчиков и передавать его дальше по цепочке.
Каркас dll в общем виде выглядит следующим образом. Я оставил только значимые части.
Code (Assembler) : Убрать нумерацию
- ;------------------------------------------------------------------
- ; Секция кода
- ;------------------------------------------------------------------
- proc CreateProcessNotify lpApplicationName:DWORD, Reason:DWORD
- mov eax,[Reason]
- ; Мы первый или единственный обработчик в цепочке
- cmp eax,APPCERT_IMAGE_OK_TO_RUN
- je .check_file
- ; Файл уже проверен, запуск разрешен
- cmp eax,APPCERT_CREATION_ALLOWED
- je .file_ok
- ; Файл уже проверен, запуск запрещен
- cmp eax,APPCERT_CREATION_DENIED
- je .file_denied
- ...
- ...
- ...
- .check_file:
- ; Проверка запускаемого файла, после чего возвращаем нужный статус