
HWSyscalls is a new method to execute indirect syscalls using HWBP, HalosGate and a synthetic trampoline on kernel32 with HWBP.
HWSyscalls è un nuovo metodo per eseguire syscall indirette usando 3 componenti principali:
Breakpoint hardware e Vectored Exception Handler per controllare il flusso di esecuzione.
HalosGate viene usato per trovare i numeri e gli indirizzi delle syscall.
Creazione di un trampolino sintetico su kernel32 con breakpoint hardware.
HWSyscalls è fornito come una libreria facile da includere che può essere aggiunta a qualsiasi progetto che voglia usare syscall indirette senza innescare i rilevamenti di EDR o AV basati sull'attuale rilevamento delle syscall indirette.
Le syscall indirette sono un metodo popolare usato in diverse varianti per chiamare le system call da ntdll; tuttavia, il problema principale nel chiamare syscall da ntdll è nel suo stesso cuore: uno strano accesso da un programma direttamente a ntdll, senza passare attraverso alcuna dll precedente. HWSyscalls è costruito sull'idea centrale delle syscall indirette, ma con una soluzione a questo problema combinando la funzionalità dei breakpoint hardware per creare il trampolino sintetico in kernel32 e HalosGate per ottenere gli SSN.
Per semplificare, un normale flusso di syscall indirette appare così:

Mentre il nostro appare così:

Abbiamo aggiornato la logica della funzione HWSyscallExceptionHandler con un po' di magia di manipolazione dello stack per rendere lo stack in grado di supportare l'unwinding. Lo abbiamo fatto chiamando direttamente la funzione NTAPI (il suo indirizzo ora viene restituito dalla funzione PrepareSyscall), facendo scattare l'HWBP nella funzione NTAPI, creando un nuovo stack frame e impostando l'indirizzo di ritorno del nuovo stack frame su un gadget "ADD RSP, 68; RET" trovato in kernel32 (o kernelbase), copiando anche gli argomenti dallo stack.
Lo stack ora supporta completamente l'unwinding e di fatto ritorna attraverso kernel32 nel suo percorso di ritorno da ntdll, senza alcuna necessità di breakpoint o di manipolazione del flusso di esecuzione da parte nostra:

Per ulteriori informazioni, dai un'occhiata al nostro post sul blog (PROSSIMAMENTE).
Per usare il progetto, dovrai includere HWSyscalls.h e chiamare InitHWSyscalls per trovare i gadget necessari e inizializzare il gestore delle eccezioni.
Al termine dell'esecuzione del tuo programma, chiama DeinitHWSyscalls per rimuovere il gestore delle eccezioni.
#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();
}
La verbosità di debug può essere attivata o disattivata modificando la definizione HWSYSCALLS_DEBUG in 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
//...
Per compilare questo progetto avrai bisogno di Visual Studio 2019 e successivi. È importante notare che questo progetto è stato creato solo per ambienti x64 e deve essere compilato senza ottimizzazioni. Puoi disattivarla da Impostazioni di progetto -> C/C++ -> Ottimizzazione -> Ottimizzazione (Disabilitata /Od).

Sektor7 per Halosgate e per l'implementazione degli HWBP insegnata nel loro incredibile Malware Development Advanced Vol 1.
@Am0nsec e @RtlMateusz per l'implementazione originale di Hellsgate.
Rad9800 per l'ispirazione che abbiamo tratto da TamperingSyscalls.
Yxel per il codice di pattern matching binario che abbiamo usato da Cronos.