
HWSyscalls HWBP, HalosGate और kernel32 पर HWBP के साथ एक सिंथेटिक ट्रैम्पोलिन का उपयोग करके अप्रत्यक्ष syscalls निष्पादित करने की एक नई विधि है।
HWSyscalls अप्रत्यक्ष syscalls (indirect syscalls) को निष्पादित करने की एक नई विधि है जिसमें 3 मुख्य घटक शामिल हैं:
निष्पादन के प्रवाह को नियंत्रित करने के लिए Hardware breakpoints और Vectored Exception Handler।
syscall नंबर और पते खोजने के लिए HalosGate का उपयोग किया जाता है।
hardware breakpoints के साथ kernel32 पर एक सिंथेटिक ट्रैम्पोलिन बनाना।
HWSyscalls को एक आसानी से शामिल की जाने वाली लाइब्रेरी के रूप में प्रदान किया गया है, जिसे किसी भी प्रोजेक्ट में जोड़ा जा सकता है जो बिना उन EDRs या AVs डिटेक्शन को ट्रिगर किए indirect syscalls का उपयोग करना चाहता है जो वर्तमान indirect syscalls डिटेक्शन पर आधारित हैं।
Indirect syscalls एक लोकप्रिय विधि है जिसका उपयोग ntdll से सिस्टम कॉल करने के लिए विभिन्न रूपों में किया जाता है, हालाँकि, ntdll से syscalls को कॉल करने की मुख्य समस्या इसके मूल में है: किसी भी पिछले dll से गुजरे बिना किसी प्रोग्राम का सीधे ntdll तक अजीब एक्सेस।
HWSyscalls, indirect syscalls के मूल विचार पर आधारित है, लेकिन इस समस्या के समाधान के साथ - hardware breakpoints की कार्यक्षमता को मिलाकर kernel32 में सिंथेटिक ट्रैम्पोलिन बनाने और SSNs प्राप्त करने के लिए HalosGate का उपयोग करता है।
इसे आसान बनाने के लिए, एक सामान्य indirect syscalls प्रवाह इस प्रकार दिखता है:

जबकि हमारा इस प्रकार दिखता है:

हमने स्टैक को unwindable बनाने के लिए कुछ स्टैक हेरफेर जादू के साथ HWSyscallExceptionHandler फ़ंक्शन के तर्क को अपडेट किया है। हमने ऐसा NTAPI फ़ंक्शन को सीधे कॉल करके (इसका पता अब PrepareSyscall फ़ंक्शन में लौटाया जाता है), NTAPI फ़ंक्शन में HWBP को हिट करके, एक नया स्टैक फ्रेम बनाकर और नए स्टैक फ्रेम के रिटर्न पते को kernel32 (या kernelbase) में पाए जाने वाले "ADD RSP, 68; RET" गैजेट पर सेट करके किया है, साथ ही स्टैक आर्ग्युमेंट्स को भी कॉपी किया है।
अब स्टैक पूरी तरह से unwindable है और ntdll से वापस आते समय वास्तव में kernel32 से होकर गुजरता है, बिना हमारी ओर से किसी ब्रेकपॉइंट और निष्पादन प्रवाह हेरफेर की आवश्यकता के:

अधिक जानकारी के लिए, हमारी ब्लॉग पोस्ट (जल्द आ रही है) देखें।
प्रोजेक्ट का उपयोग करने के लिए, आपको HWSyscalls.h को शामिल करना होगा और आवश्यक gadgets खोजने तथा exception handler को प्रारंभ करने के लिए InitHWSyscalls को कॉल करना होगा।
अपने प्रोग्राम के निष्पादन के अंत में, exception handler को हटाने के लिए 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();
}
HWSyscalls.h में HWSYSCALLS_DEBUG परिभाषा को बदलकर डिबग वर्बोसिटी को चालू या बंद किया जा सकता है।
#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 वातावरण के लिए बनाया गया है और इसे बिना ऑप्टिमाइज़ेशन के संकलित किए जाने की आवश्यकता है। आप इसे Project Settings -> C/C++ -> Optimization -> Optimization (Disabled /Od) से अक्षम कर सकते हैं।

Sektor7 को Halosgate के लिए और HWBP कार्यान्वयन के लिए धन्यवाद, जो उनके अद्भुत Malware Development Advanced Vol 1 में सिखाया जाता है।
@Am0nsec और @RtlMateusz को मूल Hellsgate कार्यान्वयन के लिए धन्यवाद।
Rad9800 को उस प्रेरणा के लिए धन्यवाद जो हमें TamperingSyscalls से मिली।
Yxel को बाइनरी पैटर्न मिलान कोड के लिए धन्यवाद, जिसे हमने Cronos से उपयोग किया।