
कर्नेल-मोड प्रक्रिया संरक्षण ड्राइवर उपयोगकर्ता GUI के साथ
Kernel-मोड प्रक्रिया सुरक्षा ड्राइवर जो ObRegisterCallbacks का उपयोग करके हैंडल से मेमोरी एक्सेस अनुमतियों को हटाता है। बुनियादी कार्यान्वयन जो हैंडल निर्माण को हुक करता है और अनधिकृत एक्सेस प्रयासों से PROCESS_VM_READ/WRITE/OPERATION को हटाता है।


नोट: यदि GIF एनिमेट नहीं होती है, तो इसे सीधे Imgur पर देखें
ड्राइवर ऊँचाई 321123 पर OB कॉलबैक पंजीकृत करता है और OB_OPERATION_HANDLE_CREATE तथा OB_OPERATION_HANDLE_DUPLICATE संचालनों को इंटरसेप्ट करता है। जब कोई प्रक्रिया किसी संरक्षित लक्ष्य के लिए हैंडल खोलने का प्रयास करती है, तो हम स्रोत प्रक्रिया के नाम की एक श्वेतसूची (explorer.exe, csrss.exe, svchost.exe, MsMpEng.exe, RuntimeBroker.exe) से तुलना करते हैं और यदि अनुमति नहीं है तो एक्सेस अधिकार हटा देते हैं।
वर्तमान कार्यान्वयन PsGetProcessImageFileName (अप्रलेखित API) का उपयोग करके नाम-आधारित मिलान है। सुरक्षा सूची को स्पिनलॉक सिंक्रनाइज़ेशन के साथ एक लिंक्ड लिस्ट के माध्यम से प्रबंधित किया जाता है। वर्कर थ्रेड मौजूद है लेकिन रिफ्रेश लॉजिक अभी लागू नहीं किया गया है।
यूज़र-मोड घटक सुरक्षा सूची में प्रक्रियाएँ जोड़ने के लिए ImGui GUI प्रदान करता है। संचार METHOD_BUFFERED ट्रांसफर का उपयोग करके \\Device\\Aegis सिमलिंक पर IOCTL कोड के माध्यम से होता है। ड्राइवर \\DosDevices\\Aegis से \\Device\\Aegis तक एक सिमलिंक बनाता है ताकि यूज़र-मोड इसे \\\\.\\Aegis के माध्यम से एक्सेस कर सके।
कर्नेल (km/):
driver.c - DriverEntry, OB पंजीकरण, IOCTL डिस्पैचर, डिवाइस/सिमलिंक निर्माणprotect_manager/ - प्रक्रिया सूची प्रबंधन, वर्कर थ्रेड (रिफ्रेश लॉजिक लंबित)यूज़र-मोड (um/):
client.cpp - मुख्य लूप, ImGui रेंडरिंग, विंडो प्रबंधनgui/ - DirectX 11 + ImGui सेटअप, कस्टम फ़ॉन्ट (Gilroy)service_manager/ - ड्राइवर लोड/अनलोड के लिए SCM एकीकरणioctl_manager/ - ड्राइवर संचार के लिए DeviceIoControl रैपर321123 के साथ पंजीकृत (तीसरे पक्ष के मानक 321000+ हैं, टकराव से बचने के लिए थोड़ी अधिक सेट की गई)PsGetProcessImageFileName का उपयोग करता है - अप्रलेखित API जो केवल .exe फ़ाइलनाम (अधिकतम 15 वर्ण) लौटाता हैKSPIN_LOCK संचालनNonPagedPool (हमेशा RAM में, तेज़ पहुँच, सीमित पूल)PagedPool (पेज आउट किया जा सकता है)KEVENT के साथ सिस्टम थ्रेड (वर्तमान में स्टब)METHOD_BUFFERED, डिवाइस प्रकार 0x8000 (तीसरे पक्ष की श्रेणी)SERVICE_DEMAND_START के साथ सेवा "AegisDriver" बनाता हैioctl.h में परिभाषित IOCTL कोड के साथ DeviceIoControlOB कॉलबैक पंजीकरण:
// Register OB callbacks for handle creation/duplication
OB_CALLBACK_REGISTRATION ob_registration = { 0 };
OB_OPERATION_REGISTRATION op_registration = { 0 };
RtlSecureZeroMemory(&ob_registration, sizeof(ob_registration));
RtlSecureZeroMemory(&op_registration, sizeof(op_registration));
op_registration.ObjectType = PsProcessType;
op_registration.Operations = OB_OPERATION_HANDLE_CREATE | OB_OPERATION_HANDLE_DUPLICATE;
// we care about duplication because smart hackers or malware, often do not create handles
// but duplicate current ones to not arouse suspicion
op_registration.PreOperation = pre_open_process;
RtlInitUnicodeString(&ob_registration.Altitude, L"321123");
// 321000 is standard for 3rd party drivers, we set it a bit higher to not have collision
status = ObRegisterCallbacks(&ob_registration, ®_handle);
हैंडल एक्सेस स्ट्रिपिंग:
OB_PREOP_CALLBACK_STATUS pre_open_process(PVOID reg_context, POB_PRE_OPERATION_INFORMATION info)
{
if (info->ObjectType == *PsProcessType) {
PEPROCESS proc = (PEPROCESS)info->Object;
char* process_name = (char*)PsGetProcessImageFileName(proc);
// Lock list at DISPATCH_LEVEL to prevent BSOD
KIRQL irql;
KeAcquireSpinLock(&g_protect_manager->list_lock, &irql);
// Check if process is in protection list
for (entry = g_protect_manager->process_list.Flink;
entry != &g_protect_manager->process_list;
entry = entry->Flink) {
pprocess proces = CONTAINING_RECORD(entry, process, entry);
if (strcmp(proces->path, process_name) == 0) {
// Check source process - allow system processes
PEPROCESS source_process = IoGetCurrentProcess();
char* source_name = (char*)PsGetProcessImageFileName(source_process);
if (strcmp(source_name, "explorer.exe") == 0 ||
strcmp(source_name, "csrss.exe") == 0 || ...) {
KeReleaseSpinLock(&g_protect_manager->list_lock, irql);
return OB_PREOP_SUCCESS;
}
// Strip VM_READ, VM_WRITE, VM_OPERATION (0x1, 0x10, 0x20)
// We don't set to 0 because it can cause bugs
info->Parameters->CreateHandleInformation.DesiredAccess &= ~(0x1 | 0x10 | 0x20);
KeReleaseSpinLock(&g_protect_manager->list_lock, irql);
return OB_PREOP_SUCCESS;
}
}
KeReleaseSpinLock(&g_protect_manager->list_lock, irql);
}
return OB_PREOP_SUCCESS;
}
प्रक्रिया सूची प्रबंधन:
NTSTATUS protect_manager_protect_process(pprotect_manager self, pprocess process)
{
// KIRQL (Kernel Interrupt Request Level) 0-31 tells CPU to not disturb
// 0 = PASSIVE_LEVEL, 2 = DISPATCH_LEVEL, 31 = HIGH_LEVEL
KIRQL irql;
// Acquire spinlock, raises IRQL to DISPATCH_LEVEL (2)
// Locks the list so it doesn't change while we edit
KeAcquireSpinLock(&self->list_lock, &irql);
InsertTailList(&self->process_list, &process->entry);
KeReleaseSpinLock(&self->list_lock, irql);
// Signal worker thread to refresh
self->refresh_needed = TRUE;
KeSetEvent(&self->worker_event, 0, FALSE); // FALSE = auto revert IRQL
return STATUS_SUCCESS;
}
यूज़र-मोड IOCTL संचार:
bool ioctl_manager::check(std::string name)
{
// Open driver device via symlink \\\\.\\Aegis -> \\Device\\Aegis
this->driver_object = CreateFile(this->path, GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING, 0, NULL);
// Send process name to driver via IOCTL
result = DeviceIoControl(this->driver_object, IOCTL_PROTECT_PID,
(LPVOID)data.c_str(), data.size() + 1,
NULL, 0, &bytes_returned, NULL);
CloseHandle(this->driver_object); // don't forget to close handles
return result;
}
सभी कोड कर्नेल अवधारणाओं, IRQL स्तरों, मेमोरी प्रबंधन और संभावित समस्याओं की विस्तृत टिप्पणियों के साथ हैं। बेझिझक स्रोत देखें - यह शैक्षिक और अच्छी तरह से दस्तावेजित है।
bcdedit /set testsigning on)बिल्ड आउटपुट: km.sys (ड्राइवर) और um.exe (यूज़र-मोड ऐप)।
OB_OPERATION_HANDLE_CREATE को संभालता है, डुप्लिकेशन हमले संभव हैंprotect_manager.c में रिफ्रेश लॉजिक खाली हैExAllocatePool2 के बजाय ExAllocatePool का उपयोग करता हैPsActiveProcessHead से अनलिंक करके प्रक्रिया छिपाना, PsLoadedModuleList से ड्राइवर छिपानाकेवल शैक्षिक उद्देश्यों के लिए। अप्रलेखित APIs का उपयोग करता है जो Windows अपडेट के साथ टूट सकते हैं। चलाने के लिए टेस्ट साइनिंग या उचित कोड साइनिंग आवश्यक है।