Невозможно отучить людей изучать самые ненужные предметы.
Введение в CSS
Преимущества стилей
Добавления стилей
Типы носителей
Базовый синтаксис
Значения стилевых свойств
Селекторы тегов
Классы
CSS3
Надо знать обо всем понемножку, но все о немногом.
Идентификаторы
Контекстные селекторы
Соседние селекторы
Дочерние селекторы
Селекторы атрибутов
Универсальный селектор
Псевдоклассы
Псевдоэлементы
Кто умеет, тот делает. Кто не умеет, тот учит. Кто не умеет учить - становится деканом. (Т. Мартин)
Группирование
Наследование
Каскадирование
Валидация
Идентификаторы и классы
Написание эффективного кода
Вёрстка
Изображения
Текст
Цвет
Линии и рамки
Углы
Списки
Ссылки
Дизайны сайтов
Формы
Таблицы
CSS3
HTML5
Блог для вебмастеров
Новости мира Интернет
Сайтостроение
Ремонт и советы
Все новости
Справочник от А до Я
HTML, CSS, JavaScript
Афоризмы о учёбе
Статьи об афоризмах
Все Афоризмы
Помогли мы вам |
Для простоты в наших экспериментах мы будем использовать Microsoft Defender и Mimikatz.
Статья имеет ознакомительный характер и предназначена для специалистов по безопасности, проводящих тестирование в рамках контракта. Автор и редакция не несут ответственности за любой вред, причиненный с применением изложенной информации. Распространение вредоносных программ, нарушение работы систем и нарушение тайны переписки преследуются по закону.
Как антивирус узнает, что в системе был запущен какой‑либо процесс? Microsoft дает возможность разработчикам антивирусных решений получать через API нужные им события (например, PsSetCreateProcessNotifyRoutineEx
). Когда создается процесс, Microsoft Defender (да и все остальные антивирусы) сразу узнает об этом, получив соответствующий callback. Теперь‑то он может проинспектировать исполняемый файл и сделать вывод, разрешить этот процесс или нет (опустим этап статического анализа).
Вся штука в том, что уведомление CreateProcessNotify
— ни разу не про создание процесса. Callback полетит тогда, когда внутри этого процесса возникнет первый поток (thread). Между моментами, когда процесс был создан и когда антивирусное решение об этом узнало, образуется промежуток. Это самое время злоумышленники творчески используют для своих целей.
Исполняемый файл — это не процесс. Исполняемый файл может быть связан со множеством процессов (в Task Manager можно легко проследить, сколько процессов связано, например, с RuntimeBroker.
или svchost.
). Каждый процесс обязательно будет связан с каким‑либо PE-файлом (.
, .
и другие). При этом процессы предоставляют ресурсы, необходимые для выполнения программы.
Процесс содержит виртуальное адресное пространство, исполняемый код, открытые дескрипторы для системных объектов, контекст безопасности, уникальный идентификатор процесса, переменные среды, класс приоритета, минимальный и максимальный размеры рабочего множества и по крайней мере один поток выполнения.
Поток — это базовая единица, в которой операционная система выделяет процессорное время. Поток может выполнять любую часть кода процесса, включая части, которые в данный момент выполняются другим потоком.
Рассмотрим создание процесса по шагам.
hFile = CreateFile(“C:WindowsSystem32svchost.exe”)
.hSection = NtCreateSection(hFile, SEC_IMAGE)
). Image section представляет собой особый раздел и служит для отображения файла (или части файла) в память. Раздел соответствует PE-файлам и может быть создан только в них.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;
|
|