Содержание статьи
Для простоты в наших экспериментах мы будем использовать Microsoft Defender и Mimikatz.
warning
Статья имеет ознакомительный характер и предназначена для специалистов по безопасности, проводящих тестирование в рамках контракта. Автор и редакция не несут ответственности за любой вред, причиненный с применением изложенной информации. Распространение вредоносных программ, нарушение работы систем и нарушение тайны переписки преследуются по закону.
Особенности процессов
Как антивирус узнает, что в системе был запущен какой‑либо процесс? Microsoft дает возможность разработчикам антивирусных решений получать через API нужные им события (например, PsSetCreateProcessNotifyRoutineEx
). Когда создается процесс, Microsoft Defender (да и все остальные антивирусы) сразу узнает об этом, получив соответствующий callback. Теперь‑то он может проинспектировать исполняемый файл и сделать вывод, разрешить этот процесс или нет (опустим этап статического анализа).
Вся штука в том, что уведомление CreateProcessNotify
— ни разу не про создание процесса. Callback полетит тогда, когда внутри этого процесса возникнет первый поток (thread). Между моментами, когда процесс был создан и когда антивирусное решение об этом узнало, образуется промежуток. Это самое время злоумышленники творчески используют для своих целей.
Важно понимать
Исполняемый файл — это не процесс. Исполняемый файл может быть связан со множеством процессов (в Task Manager можно легко проследить, сколько процессов связано, например, с RuntimeBroker.
или svchost.
). Каждый процесс обязательно будет связан с каким‑либо PE-файлом (.
, .
и другие). При этом процессы предоставляют ресурсы, необходимые для выполнения программы.
Процесс содержит виртуальное адресное пространство, исполняемый код, открытые дескрипторы для системных объектов, контекст безопасности, уникальный идентификатор процесса, переменные среды, класс приоритета, минимальный и максимальный размеры рабочего множества и по крайней мере один поток выполнения.
Поток — это базовая единица, в которой операционная система выделяет процессорное время. Поток может выполнять любую часть кода процесса, включая части, которые в данный момент выполняются другим потоком.
Создание процесса
Рассмотрим создание процесса по шагам.
- Сначала мы получаем дескриптор (handle) для исполняемого файла, который запускаем, например так:
hFile
.= CreateFile( “C:\ Windows\ System32\ svchost. exe”) - Создаем image section (например,
hSection
). Image section представляет собой особый раздел и служит для отображения файла (или части файла) в память. Раздел соответствует PE-файлам и может быть создан только в них.= NtCreateSection( hFile, SEC_IMAGE) - Создаем процесс в image section (например,
hProcess
).= NtCreateProcessEx( hSection) - Назначаем аргументы и переменные среды (например,
CreateEnvironmentBlock/
).NtWriteVirtualMemory - Создаем поток для выполнения процесса (например,
NtCreateThreadEx
).
Важный момент: процессы запускаются из исполняемых файлов, но информация внутри исполняемого файла может меняться относительного того, что находится в image section (так как она кешируется memory manager).
Сканирование процесса в поисках зловреда
Как уже было сказано, антивирусы могут получать уведомления о событиях создания процессов и потоков (PsSetCreateProcessNotifyRoutineEx и PsSetCreateThreadNotifyRoutineEx).
Выглядит это примерно так:
typedef struct _PS_CREATE_NOTIFY_INFO { SIZE_T Size; union { ULONG Flags; struct { ULONG FileOpenNameAvailable : 1; ULONG IsSubsystemProcess : 1; ULONG Reserved : 30; }; }; HANDLE ParentProcessId; CLIENT_ID CreatingThreadId; struct _FILE_OBJECT *FileObject; PCUNICODE_STRING ImageFileName; PCUNICODE_STRING CommandLine; NTSTATUS CreationStatus;} PS_CREATE_NOTIFY_INFO, *PPS_CREATE_NOTIFY_INFO;
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»