
HWSyscalls — это новый метод выполнения косвенных системных вызовов с использованием HWBP, HalosGate и синтетического трамплина на kernel32 с HWBP.
HWSyscalls — это новый метод выполнения косвенных системных вызовов, использующий 3 основных компонента:
Аппаратные точки останова и векторизованный обработчик исключений для управления потоком выполнения.
HalosGate используется для поиска номеров и адресов системных вызовов.
Создание синтетического трамплина в kernel32 с помощью аппаратных точек останова.
HWSyscalls поставляется в виде простой в подключении библиотеки, которую можно добавить в любой проект, желающий использовать косвенные системные вызовы без срабатывания детектирования EDR или AV, основанного на современных методах обнаружения косвенных системных вызовов.
Косвенные системные вызовы — это популярный метод, который используется в различных вариациях для выполнения системных вызовов из ntdll. Однако основная проблема системных вызовов из ntdll кроется в их сути: аномальный доступ программы напрямую к ntdll, минуя любые предыдущие DLL. HWSyscalls построен на основной идее косвенных системных вызовов, но решает эту проблему, объединяя функциональность аппаратных точек останова для создания синтетического трамплина в kernel32 и HalosGate для получения SSN.
Для простоты понимания, обычный поток косвенных системных вызовов выглядит так:

А наш — так:

Мы обновили логику функции HWSyscallExceptionHandler, добавив немного магии с манипуляцией стеком, чтобы сделать стек разматываемым.
Мы сделали это, напрямую вызвав функцию NTAPI (её адрес теперь возвращается в функции PrepareSyscall), вызвав срабатывание аппаратной точки останова внутри функции NTAPI, создав новый стековый кадр и установив адрес возврата нового стекового кадра на гаджет ADD RSP, 68; RET, найденный в kernel32 (или kernelbase), а также скопировав аргументы стека.
Теперь стек полностью разматывается и фактически возвращается через kernel32 на пути обратно из ntdll, без необходимости в точках останова и манипуляции потоком выполнения с нашей стороны:

Для получения дополнительной информации смотрите наш пост в блоге (СКОРО).
Чтобы использовать проект, вам нужно подключить HWSyscalls.h и вызвать InitHWSyscalls для поиска необходимых гаджетов и инициализации обработчика исключений.
В конце выполнения вашей программы вызовите DeinitHWSyscalls, чтобы удалить обработчик исключений.
#include "HWSyscalls.h"
typedef NTSTATUS(WINAPI* NtOpenProcess_t)(
OUT PHANDLE ProcessHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN OPTIONAL PCLIENT_ID ClientId);
void main() {
// Initialize the exception handler and find the required gadgets.
if (!InitHWSyscalls())
return;
// ...
// Execute your function!
NtOpenProcess_t pNtOpenProcess = (NtOpenProcess_t)PrepareSyscall((char*)("NtOpenProcess"));
NTSTATUS status = pNtOpenProcess(&targetHandle, PROCESS_ALL_ACCESS, &object, &clientID);
// ...
// Removing the exception handler.
DeinitHWSyscalls();
}
Уровень подробности отладки можно включить или выключить, изменив определение HWSYSCALLS_DEBUG в HWSyscalls.h:
#pragma once
#include <windows.h>
#include <inttypes.h>
#include <stdio.h>
#pragma region Defines
#define HWSYSCALLS_DEBUG 0 // 0 disable, 1 enable
#define UP -32
//...
Для компиляции этого проекта вам понадобится Visual Studio 2019 или новее. Важно отметить, что этот проект создан только для x64-сред и должен компилироваться без оптимизации. Вы можете отключить её в Project Settings -> C/C++ -> Optimization -> Optimization (Disabled /Od).

Sektor7 за Halosgate и за реализацию HWBP, которая преподаётся в их потрясающем курсе Malware Development Advanced Vol 1.
@Am0nsec и @RtlMateusz за оригинальную реализацию Hellsgate.
Rad9800 за вдохновение, которое мы получили от TamperingSyscalls.
Yxel за код сопоставления бинарных паттернов, который мы использовали из Cronos.