19 Şubat 2016 Cuma

DLL Injection

Giriş
DLL Injection ilginç bir konu. Bir kaç tane farklı yöntemi var. Hepsini anlamadım.

CreateRemoteThread Yöntemi
Anladığım bir örnek şöyle çalışıyor. Bu yönteme aynı zamanda User Mode Hooks via Injected Threads deniyor.
HANDLE process = OpenProcess(PROCESS_ALL_ACCESS, FALSE, procID);

LPVOID arg = (LPVOID)VirtualAllocEx(process, NULL, ...);

int n = WriteProcessMemory(process, .....);

HANDLE threadID = CreateRemoteThread(process, .........);
CreateRemoteThread yönteminde olaylar şöyle işliyor. Bu metod bir başka uygulama içinde thread yaratmak imkanı sunar.

1.Önce OpenProcess ile saldırılacak uygulama'nın handle'ı bulunur.
Burada OpenProcess başka uygulamada hem thread yaratma, hem de belleğine yazma hakkı da elde ediyor.İkinci parametre Inherit Handle anlamına geliyor. TRUE kullanıldığını hiç görmedim.
HANDLE process = OpenProcess(PROCESS_ALL_ACCESS, TRUE, procID);
Sadece yazma hakkını şöyle elde ederiz.
OpenProcess(PROCESS_VM_WRITE,false,firefox_pid);

2. Daha sonra VirtualAlloc ile saldırılacak uygulama içinde bellek ayrılır.
3. Bu belleğe yüklenmesini istediğim DLL'in ismini string olarak yazarız.
WriteProcessMemory ile ReadProcessMemory çok benzer imzalara sahip. ReadProcessMemory metodunun imzası şöyle.

İlk parametre OpenProcess ile elde edilen değer.
İkinci parametre açılan process içindeki bir adres.
Üçüncü ve dördüncü parametreler kendi belleğim ve büyüklüğü.
Son parametre ise okuma işlemi sonucunda kaç byte okunduğudur.
BOOL WINAPI ReadProcessMemory(
    HANDLE hProcess,
    LPCVOID lpBaseAddress,
    LPVOID lpBuffer,
    SIZE_T nSize,
    SIZE_T *lpNumberOfBytesRead
);

4. CreateRemoteThread bir başlama metodu ister. Başlama metodu olarak DLL'imiz içindeki bir metodu veririz.

Yaratılan Thread içinde uygulamayı Task Manager'dan öldürülemez hale getirmek mümkün.
DWORD ProtectProcess(void)
{
    HANDLE hProcess = GetCurrentProcess();
    PACL pEmptyDacl;
    DWORD dwErr;

    // using malloc guarantees proper alignment
    pEmptyDacl = (PACL)malloc(sizeof(ACL));

    if (!InitializeAcl(pEmptyDacl, sizeof(ACL), ACL_REVISION))
    {
        dwErr = GetLastError();
    }
    else
    {
        dwErr = SetSecurityInfo(hProcess, SE_KERNEL_OBJECT, 
                   DACL_SECURITY_INFORMATION, NULL, NULL, pEmptyDacl, NULL);
    }

    free(pEmptyDacl);
    return dwErr;
}




Hiç yorum yok:

Yorum Gönder