
HWSyscalls is a new method to execute indirect syscalls using HWBP, HalosGate and a synthetic trampoline on kernel32 with HWBP.
HWSyscalls est une nouvelle méthode pour exécuter des appels système indirects à l'aide de 3 composants principaux :
Les points d'arrêt matériels et le gestionnaire d'exceptions vecteur (Vectored Exception Handler) pour contrôler le flux d'exécution.
HalosGate est utilisé pour trouver les numéros et adresses des appels système.
Création d'un trampoline synthétique sur kernel32 avec des points d'arrêt matériels.
HWSyscalls est fourni sous forme de bibliothèque facile à intégrer, qui peut être ajoutée à tout projet souhaitant utiliser des appels système indirects sans déclencher les détections des EDR ou des AV basées sur la détection actuelle des appels système indirects.
Les appels système indirects sont une méthode populaire utilisée sous différentes variantes pour appeler des appels système depuis ntdll. Cependant, le principal problème de l'appel des appels système depuis ntdll se trouve au cœur même de cette approche : un accès inhabituel d'un programme directement à ntdll, sans passer par aucune dll préalable. HWSyscalls repose sur l'idée centrale des appels système indirects, mais apporte une solution à ce problème en combinant la fonctionnalité des points d'arrêt matériels pour créer le trampoline synthétique dans kernel32 et HalosGate pour obtenir les SSN.
Pour simplifier, un flux d'appels système indirects normal ressemble à ceci :

Alors que le nôtre ressemble à ceci :

Nous avons mis à jour la logique de la fonction HWSyscallExceptionHandler avec quelques astuces de manipulation de la pile afin de rendre la pile déroulable (unwindable). Pour ce faire, nous appelons directement la fonction NTAPI (son adresse est désormais retournée par la fonction PrepareSyscall), déclenchons le HWBP dans la fonction NTAPI, créons un nouveau cadre de pile et définissons l'adresse de retour de ce dernier sur un gadget "ADD RSP, 68; RET" trouvé dans kernel32 (ou kernelbase), tout en copiant également les arguments de la pile.
La pile est désormais complètement déroulable et retourne effectivement par kernel32 lors de son retour depuis ntdll, sans aucun besoin de points d'arrêt ni de manipulation du flux d'exécution de notre part :

Pour plus d'informations, consultez notre article de blog (BIENTÔT DISPONIBLE).
Pour utiliser le projet, vous devez inclure le fichier HWSyscalls.h et appeler InitHWSyscalls pour trouver les gadgets nécessaires et initialiser le gestionnaire d'exceptions.
À la fin de l'exécution de votre programme, appelez DeinitHWSyscalls pour supprimer le gestionnaire d'exceptions.
#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é du débogage peut être activée ou désactivée en modifiant la définition HWSYSCALLS_DEBUG dans 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
//...
Pour compiler ce projet, vous aurez besoin de Visual Studio 2019 ou version ultérieure. Il est important de noter que ce projet a été conçu uniquement pour les environnements x64 et doit être compilé sans optimisation. Vous pouvez la désactiver via Propriétés du projet -> C/C++ -> Optimisation -> Optimisation (Désactivée /Od).

Sektor7 pour Halosgate et pour l'implémentation du HWBP enseignée dans leur formidable Malware Development Advanced Vol 1.
@Am0nsec et @RtlMateusz pour l'implémentation originale de Hellsgate.
Rad9800 pour l'inspiration que nous avons tirée de TamperingSyscalls.
Yxel pour le code de correspondance de motifs binaires que nous avons utilisé depuis Cronos.