В реальных сценариях важно ограничивать действия, выполняемые вредоносным ПО, и концентрироваться на основных задачах.
Чем больше действий выполняет вредоносное ПО, тем вероятнее, что его обнаружат системы мониторинга.
Вот например такая ситуация, как в этом уроке, правилом хорошего тона перед перезаписью атакуемой функции, необходимо сохранить оригинал, а потом после выполнения полезной нагрузки восстановить функцию.
Но для этого нужно знать, что полезная нагрузка выполнилась.)
Объекты синхронизации Windows могут быть использованы для управления выполнением полезной нагрузки. Эти объекты координируют доступ к общим ресурсам для нескольких потоков или процессов, обеспечивая контролируемый доступ к общим ресурсам и предотвращая конфликты или состояния гонки, когда несколько потоков или процессов пытаются одновременно получить доступ к одному и тому же ресурсу. Используя объекты синхронизации, можно контролировать, сколько раз полезная нагрузка будет выполнена на системе.
Существует несколько типов объектов синхронизации, включая семафоры, мьютексы и события. Каждый тип объекта синхронизации работает несколько иначе, но в конечном итоге все они служат одной цели - координировать доступ к общим ресурсам.
Семафоры
Семафоры - это инструменты синхронизации, которые используют значение, хранящееся в памяти, для контроля доступа к общему ресурсу. Существует два типа семафоров: бинарные и счетные.
Бинарный семафор имеет значение 1 или 0, указывая, доступен ли ресурс или недоступен соответственно. Счетный семафор, с другой стороны, имеет значение больше 1, представляя количество доступных ресурсов или количество процессов, которые могут одновременно получать доступ к ресурсу.
Для управления выполнением полезной нагрузки при каждом выполнении полезной нагрузки будет создаваться именованный объект семафора. Если двоичный файл выполняется несколько раз, первое выполнение создаст именованный семафор, и полезная нагрузка будет выполнена, как предполагалось. При последующих запусках создание семафора не удастся, так как семафор с таким же именем уже работает. Это указывает на то, что полезная нагрузка в настоящее время выполняется из предыдущего запуска и поэтому не должна выполняться снова, чтобы избежать дублирования.
CreateSemaphoreA будет использоваться для создания объекта семафора. Важно создать его как именованный семафор, чтобы предотвратить выполнение после первоначального запуска двоичного файла. Если именованный семафор уже работает, CreateSemaphoreA вернет дескриптор существующего объекта, и GetLastError вернет ERROR_ALREADY_EXISTS.
В приведенном ниже коде, если семафор "ControlString" уже работает, GetLastError вернет ERROR_ALREADY_EXISTS.
C:
HANDLE hSemaphore = CreateSemaphoreA(NULL, 10, 10, "ControlString");
if (hSemaphore != NULL && GetLastError() == ERROR_ALREADY_EXISTS)
// Полезная нагрузка уже выполняется
else
// Полезная нагрузка не выполняется
Мьютексы
Мьютекс, сокращенно от "взаимного исключения", - это инструмент синхронизации, используемый для управления доступом к общим ресурсам среди процессов и потоков. На практике поток, пытающийся получить доступ к общему ресурсу, проверяет статус мьютекса. Если он заблокирован, поток ждет, пока мьютекс не будет разблокирован. Если мьютекс не заблокирован, поток блокирует его, выполняет необходимые операции с общим ресурсом и затем разблокирует мьютекс по завершении. Это обеспечивает доступ к общему ресурсу только одного потока за раз, предотвращая конфликты и порчу данных.
CreateMutexA используется для создания именованного мьютекса следующим образом:
C:
HANDLE hMutex = CreateMutexA(NULL, FALSE, "ControlString");
if (hMutex != NULL && GetLastError() == ERROR_ALREADY_EXISTS)
// Полезная нагрузка уже выполняется
else
// Полезная нагрузка не выполняется
События
События - это еще один инструмент синхронизации, который может быть использован для координации выполнения потоков или процессов. Они могут быть ручными или автоматическими, причем ручные события требуют явных действий по установке или сбросу, а автоматические события активируются внешними условиями, такими как истечение времени таймера или завершение задачи.
Для использования событий в программе может быть использована функция WinAPI CreateEventA. Использование функции демонстрируется ниже:
C:
HANDLE hEvent = CreateEventA(NULL, FALSE, FALSE, "ControlString");
if (hEvent != NULL && GetLastError() == ERROR_ALREADY_EXISTS)
// Полезная нагрузка уже выполняется
else
// Полезная нагрузка не выполняется
Хочется отметить что выше код использует не совсем правильно объекты синхронизации, а призван лишь для демонстрации, для большего понимания как с ними работать, рекомендуется обратится либо к документации Microsoft, либо поискать статьи по объектам синхронизации.
Вот например семафоры, нужно использовать с событиями:WaitForSingleObject (Потоки ожидают доступа к разделяемому ресурсу).
А для работы мьютексами например обычно используют функции захвата и освобождения мьютекса.
Изучить эти темы предлагаю самостоятельно, т.к. материала очень много по этой части.)
Последнее редактирование: