
HWSyscalls is a new method to execute indirect syscalls using HWBP, HalosGate and a synthetic trampoline on kernel32 with HWBP.
HWSyscalls ist eine neue Methode zur Ausführung indirekter Syscalls mithilfe von 3 Hauptkomponenten:
Hardware-Breakpoints und ein Vectored Exception Handler, um den Ausführungsfluss zu steuern.
HalosGate wird verwendet, um Syscall-Nummern und -Adressen zu finden.
Erstellen eines synthetischen Trampolins auf kernel32 mit Hardware-Breakpoints.
HWSyscalls wird als einfach einzubindende Bibliothek bereitgestellt, die jedem Projekt hinzugefügt werden kann, das indirekte Syscalls verwenden möchte, ohne EDR- oder AV-Erkennungen auszulösen, die auf der aktuellen Erkennung indirekter Syscalls basieren.
Indirekte Syscalls sind eine beliebte Methode, die in verschiedenen Varianten verwendet wird, um Systemaufrufe aus ntdll heraus zu tätigen. Das Hauptproblem beim Aufrufen von Syscalls aus ntdll liegt jedoch im Kern: Ein ungewöhnlicher Zugriff eines Programms direkt auf ntdll, ohne eine vorherige DLL zu durchlaufen.
HWSyscalls basiert auf der Kernidee indirekter Syscalls, bietet jedoch eine Lösung für dieses Problem, indem es die Funktionalität von Hardware-Breakpoints kombiniert, um das synthetische Trampolin in kernel32 zu erzeugen, und HalosGate nutzt, um die SSNs zu erhalten.
Zur Veranschaulichung sieht ein normaler Ablauf indirekter Syscalls folgendermaßen aus:

Unserer sieht dagegen so aus:

Wir haben die Logik der HWSyscallExceptionHandler-Funktion mit etwas Stack-Manipulations-Magie aktualisiert, um den Stack abwickelbar zu machen.
Dies haben wir erreicht, indem wir die NTAPI-Funktion direkt aufrufen (ihre Adresse wird nun in der PrepareSyscall-Funktion zurückgegeben), den HWBP in der NTAPI-Funktion auslösen, einen neuen Stack-Frame erstellen und die Rücksprungadresse des neuen Stack-Frames auf ein in kernel32 (oder kernelbase) gefundenes "ADD RSP, 68; RET"-Gadget setzen, während auch die Stack-Argumente kopiert werden.
Der Stack ist jetzt vollständig abwickelbar und führt auf dem Rückweg von ntdll tatsächlich durch kernel32, ohne dass wir Breakpoints oder eine Manipulation des Ausführungsflusses benötigen:

Weitere Informationen finden Sie in unserem Blogbeitrag (KOMMT BALD).
Um das Projekt zu verwenden, müssen Sie HWSyscalls.h einbinden und InitHWSyscalls aufrufen, um die erforderlichen Gadgets zu finden und den Exception Handler zu initialisieren.
Rufen Sie am Ende der Programmausführung DeinitHWSyscalls auf, um den Exception Handler zu entfernen.
#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();
}
Die Ausführlichkeit der Debug-Ausgaben kann durch Ändern der Definition HWSYSCALLS_DEBUG in HWSyscalls.h ein- oder ausgeschaltet werden.
#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
//...
Zum Kompilieren dieses Projekts benötigen Sie Visual Studio 2019 und neuere Versionen. Es ist wichtig zu beachten, dass dieses Projekt nur für x64-Umgebungen erstellt wurde und ohne Optimierung kompiliert werden muss. Sie können dies unter Projekteinstellungen -> C/C++ -> Optimierung -> Optimierung (Deaktiviert /Od) deaktivieren.

Sektor7 für Halosgate und für die HWBP-Implementierung, die in ihrem großartigen Malware Development Advanced Vol 1 gelehrt wird.
@Am0nsec und @RtlMateusz für die ursprüngliche Hellsgate-Implementierung.
Rad9800 für die Inspiration, die wir aus TamperingSyscalls erhalten haben.
Yxel für den Binärmuster-Abgleichcode, den wir aus Cronos verwendet haben.