
HWSyscalls é um novo método para executar syscalls indiretas usando HWBP, HalosGate e um trampolim sintético no kernel32 com HWBP.
HWSyscalls é um novo método para executar syscalls indiretos usando 3 componentes principais:
Breakpoints de hardware e o Vectored Exception Handler para controlar o fluxo de execução.
HalosGate é usado para encontrar números e endereços de syscalls.
Criação de um trampolim sintético em kernel32 com breakpoints de hardware.
HWSyscalls é fornecido como uma biblioteca de fácil inclusão que pode ser adicionada a qualquer projeto que queira usar syscalls indiretos sem acionar as detecções de EDRs ou AVs baseadas na detecção atual de syscalls indiretos.
Syscalls indiretos é um método popular usado em diferentes variações para chamar chamadas de sistema a partir de ntdll; no entanto, o principal problema de chamar syscalls a partir de ntdll está em seu núcleo: um acesso estranho de um programa diretamente a ntdll, sem passar por qualquer dll anterior. HWSyscalls é construído sobre a ideia central de syscalls indiretos, mas com uma solução para esse problema ao combinar a funcionalidade de breakpoints de hardware para criar o trampolim sintético em kernel32 e o HalosGate para obter os SSNs.
Para facilitar, um fluxo normal de syscalls indiretos se parece com isto:

Enquanto o nosso se parece com isto:

Atualizamos a lógica da função HWSyscallExceptionHandler com um pouco de mágica de manipulação de pilha para tornar a pilha desenrolável. Fizemos isso chamando a função NTAPI diretamente (seu endereço agora é retornado na função PrepareSyscall), atingindo o HWBP na função NTAPI, criando um novo stack frame e definindo o endereço de retorno do novo stack frame para um gadget "ADD RSP, 68; RET" encontrado em kernel32 (ou kernelbase), além de copiar também os argumentos da pilha.
A pilha agora é completamente desenrolável e, na verdade, retorna através de kernel32 no caminho de volta de ntdll sem qualquer necessidade de breakpoints e manipulação do fluxo de execução por nossa parte:

Para mais informações, confira o nosso post no blog (EM BREVE).
Para usar o projeto, você precisará incluir o HWSyscalls.h e chamar InitHWSyscalls para encontrar os gadgets necessários e inicializar o handler de exceções.
Ao final da execução do seu programa, chame DeinitHWSyscalls para remover o handler de exceções.
#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();
}
A verbosidade de depuração pode ser ativada ou desativada alterando a definição HWSYSCALLS_DEBUG em 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
//...
Para compilar este projeto, você precisará do Visual Studio 2019 ou posterior. É importante notar que este projeto foi feito apenas para ambientes x64 e precisa ser compilado sem otimização. Você pode desativá-la em Project Settings -> C/C++ -> Optimization -> Optimization (Disabled /Od).

Sektor7 pelo Halosgate e pela implementação de HWBP que é ensinada em seu incrível Malware Development Advanced Vol 1.
@Am0nsec e @RtlMateusz pela implementação original do Hellsgate.
Rad9800 pela inspiração que obtivemos do TamperingSyscalls.
Yxel pelo código de correspondência de padrões binários que usamos do Cronos.