
Контроль запуска процессов на Ассемблере
Сегодня разберем интересную задачу: надо отслеживать запуск приложений в системе и, в случае необходимости, выборочно блокировать их запуск. Решения могут быть различные, я предлагаю вот такой способ. Он заключается в том, что в цепочку 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:
- ; Проверка запускаемого файла, после чего возвращаем нужный статус
- mov eax,STATUS_SUCCESS
- jmp .loc_ret
- ; или
- mov eax,STATUS_UNSUCCESSFUL
- jmp .loc_ret
- ...
- ...
- ...
- .file_ok:
- mov eax,STATUS_SUCCESS
- jmp .loc_ret
- ...
- ...
- .file_denied:
- mov eax,STATUS_UNSUCCESSFUL
- jmp .loc_ret
- ...
- ...
- ...
- .loc_ret:
- ret
- endp
- ;------------------------------------------------------------------
- ; Экспорт
- ;------------------------------------------------------------------
- section '.edata' export data readable
- export 'hook.dll',\
- CreateProcessNotify,'CreateProcessNotify'
Большой плюс такого способа перехвата заключается в том, что он может работать даже в пользовательском режиме. Готовые исходники не прилагаю.
Просмотров: 2598 | Комментариев: 5

Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье

Давидыч
(30.08.2017 в 19:54):
Шикарно!

ManHunter
(28.08.2017 в 07:09):
Совсем обленились :( Просто добавить стандартные заголовки dll к каркасу + полезная нагрузка, вот и будет исходник. Готовую dll собирать тоже не хочу по причине разной разрядности систем, сам я сижу на x86, поведение 32-разрядных библиотек такого плана на 64-битной системе не тестировал. Я свою систему разок навернул в процессе отладки (повесил MessageBox на payload и ребутнулся), пришлось загружаться с диска и удалять обработчик через командную строку. Так что нет, вся движуха только под вашу ответственность.
Да. Исходники с готовыми бинарниками я выкладываю только тогда, когда их можно сразу запустить и получить какой-то результат. Конкретно в этом случае только описание способа.
Да. Исходники с готовыми бинарниками я выкладываю только тогда, когда их можно сразу запустить и получить какой-то результат. Конкретно в этом случае только описание способа.

Wet
(28.08.2017 в 05:30):
Исходников нет, готовой dll тоже нет. В чем смысл тогда? Просто рассказали о способе?

Fan
(28.08.2017 в 05:26):
На самом интересном месте:не прилагаю)

Добавить комментарий
Заполните форму для добавления комментария

Ща пошаманим... >:3