
HWSyscalls is a new method to execute indirect syscalls using HWBP, HalosGate and a synthetic trampoline on kernel32 with HWBP.
HWSyscalls es un nuevo método para ejecutar syscalls indirectas usando 3 componentes principales:
Puntos de interrupción de hardware y un Vectored Exception Handler para controlar el flujo de ejecución.
HalosGate se utiliza para encontrar los números y direcciones de syscalls.
Creación de un trampolín sintético en kernel32 con puntos de interrupción de hardware.
HWSyscalls se proporciona como una librería fácil de incluir que se puede añadir a cualquier proyecto que quiera usar syscalls indirectas sin activar las detecciones de EDRs o AVs basadas en la detección actual de syscalls indirectas.
Las syscalls indirectas son un método popular que se usa en diferentes variantes para llamar a las llamadas al sistema desde ntdll. Sin embargo, el principal problema de llamar a syscalls desde ntdll está en su núcleo: un acceso extraño desde un programa directamente a ntdll, sin pasar por ninguna dll previa. HWSyscalls se basa en la idea central de las syscalls indirectas, pero con una solución a este problema combinando la funcionalidad de los puntos de interrupción de hardware para crear el trampolín sintético en kernel32 y HalosGate para obtener los SSNs.
Para que sea más fácil, un flujo normal de syscalls indirectas se ve así:

Mientras que el nuestro se ve así:

Hemos actualizado la lógica de la función HWSyscallExceptionHandler con algo de manipulación mágica de la pila para hacer que la pila se pueda desenrollar. Lo hemos hecho llamando directamente a la función NTAPI (su dirección ahora se devuelve en la función PrepareSyscall), alcanzando el HWBP en la función NTAPI, creando un nuevo marco de pila y estableciendo la dirección de retorno del nuevo marco de pila a un gadget "ADD RSP, 68; RET" que se encuentra en kernel32 (o kernelbase), además de copiar también los argumentos de la pila.
La pila ahora es completamente desenrollable y de hecho retorna a través de kernel32 en su camino de vuelta desde ntdll sin necesidad de puntos de interrupción ni manipulación del flujo de ejecución por nuestra parte:

Para más información, consulta nuestra publicación en el blog (PRÓXIMAMENTE).
Para usar el proyecto, necesitarás incluir HWSyscalls.h y llamar a InitHWSyscalls para encontrar los gadgets necesarios e inicializar el manejador de excepciones.
Al final de la ejecución de tu programa, llama a DeinitHWSyscalls para eliminar el manejador de excepciones.
#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() {
// Inicializa el manejador de excepciones y encuentra los gadgets necesarios.
if (!InitHWSyscalls())
return;
// ...
// ¡Ejecuta tu función!
NtOpenProcess_t pNtOpenProcess = (NtOpenProcess_t)PrepareSyscall((char*)("NtOpenProcess"));
NTSTATUS status = pNtOpenProcess(&targetHandle, PROCESS_ALL_ACCESS, &object, &clientID);
// ...
// Eliminando el manejador de excepciones.
DeinitHWSyscalls();
}
La verbosidad de depuración se puede activar o desactivar cambiando la definición HWSYSCALLS_DEBUG en HWSyscalls.h
#pragma once
#include <windows.h>
#include <inttypes.h>
#include <stdio.h>
#pragma region Defines
#define HWSYSCALLS_DEBUG 0 // 0 deshabilitar, 1 habilitar
#define UP -32
//...
Para compilar este proyecto necesitarás Visual Studio 2019 o posterior. Es importante tener en cuenta que este proyecto fue hecho solo para entornos x64 y necesita compilarse sin optimización. Puedes deshabilitarla desde Project Settings -> C/C++ -> Optimization -> Optimization (Disabled /Od).

Sektor7 por Halosgate y por la implementación de HWBP que se enseña en su increíble Malware Development Advanced Vol 1.
@Am0nsec y @RtlMateusz por la implementación original de Hellsgate.
Rad9800 por la inspiración que obtuvimos de TamperingSyscalls.
Yxel por el código de coincidencia de patrones binarios que usamos de Cronos.