
HWSyscalls is a new method to execute indirect syscalls using HWBP, HalosGate and a synthetic trampoline on kernel32 with HWBP.
HWSyscalls هي طريقة جديدة لتنفيذ استدعاءات النظام غير المباشرة (Indirect Syscalls) باستخدام 3 مكوّنات رئيسية:
نقاط توقف الأجهزة (Hardware Breakpoints) ومعالج الاستثناءات المتجه (Vectored Exception Handler) للتحكم في تدفق التنفيذ.
يُستخدم HalosGate للعثور على أرقام وعناوين استدعاءات النظام (Syscall Numbers).
إنشاء ترامبولين اصطناعي (Synthetic Trampoline) في kernel32 باستخدام نقاط توقف الأجهزة.
HWSyscalls مُقدَّمة كمكتبة سهلة التضمين يمكن إضافتها إلى أي مشروع يرغب في استخدام استدعاءات النظام غير المباشرة دون تفعيل اكتشافات EDRs أو مضادات الفيروسات القائمة على تقنيات كشف استدعاءات النظام غير المباشرة الحالية.
تُعد استدعاءات النظام غير المباشرة طريقة شائعة تُستخدم في أشكال مختلفة لاستدعاء دوال النظام من ntdll، ومع ذلك، فإن المشكلة الأساسية في استدعاء الدوال من ntdll تكمن في جوهرها: وصول غير طبيعي من البرنامج مباشرة إلى ntdll، دون المرور عبر أي dll سابق. تم بناء HWSyscalls على الفكرة الأساسية لاستدعاءات النظام غير المباشرة ولكن مع حل لهذه المشكلة من خلال الجمع بين وظيفة نقاط توقف الأجهزة لإنشاء الترامبولين الاصطناعي في kernel32 و HalosGate للحصول على أرقام SSNs.
للتسهيل، يبدو التدفق الطبيعي لاستدعاءات النظام غير المباشرة هكذا:

بينما يبدو تدفقنا هكذا:

قمنا بتحديث منطق دالة HWSyscallExceptionHandler مع بعض الخدع المتعلقة بتلاعب المكدس (Stack Manipulation) لجعل المكدس قابلاً للتفكيك (Unwindable). فعلنا ذلك عن طريق استدعاء دالة NTAPI مباشرة (يتم الآن إرجاع عنوانها في دالة PrepareSyscall)، ثم الوصول إلى HWBP في دالة NTAPI، وإنشاء إطار مكدس جديد وتعيين عنوان الإرجاع لإطار المكدس الجديد إلى "ADD RSP, 68; RET" gadget موجود في kernel32 (أو kernelbase) مع نسخ وسائط المكدس أيضًا.
المكدس الآن قابل للتفكيك بالكامل ويعود فعليًا عبر kernel32 في طريقه من ntdll دون الحاجة إلى نقاط توقف أو تلاعب في تدفق التنفيذ من جانبنا:

لمزيد من المعلومات، اطّلع على مقالنا في المدونة (قريبًا).
لاستخدام المشروع، ستحتاج إلى تضمين HWSyscalls.h واستدعاء InitHWSyscalls للعثور على الـ gadgets المطلوبة وتهيئة معالج الاستثناءات.
في نهاية تنفيذ برنامجك، قم باستدعاء DeinitHWSyscalls لإزالة معالج الاستثناءات.
#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();
}
يمكن تشغيل أو إيقاف مستوى تفصيل التصحيح (Debug Verbosity) عن طريق تغيير تعريف HWSYSCALLS_DEBUG في 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
//...
لتجميع هذا المشروع، ستحتاج إلى Visual Studio 2019 أو أحدث. من المهم ملاحظة أن هذا المشروع أُنشئ فقط لبيئات x64 ويجب تجميعه بدون تحسينات (Optimization). يمكنك تعطيل ذلك من Project Settings -> C/C++ -> Optimization -> Optimization (Disabled /Od).

Sektor7 لـ Halosgate ولتنفيذ HWBP الذي يُدرَّس في دورتهم الرائعة Malware Development Advanced Vol 1.
@Am0nsec و @RtlMateusz لـ التنفيذ الأصلي لـ Hellsgate.
Rad9800 للإلهام الذي حصلنا عليه من TamperingSyscalls.
Yxel لكود مطابقة الأنماط الثنائية (Binary Pattern Matching) الذي استخدمناه من Cronos.