DLL injection, kötü amaçlı etkinliği meşru bir Windows işleminin altına enjekte ederek kendini kullanıcıdan ve sistemden gizleme yöntemidir. Kötü amaçlı yazılım, kurban cihazı kendi DLL’ini yüklemeye zorlar ve onu meşru, tamamen doğal görünen bir işlemin alt işlemi haline getirir. Kendisini gizlemesi için kullanacağı bu işlem svchost.exe veya explorer.exe gibi herhangi bir işlem olabilir.

Artık, kötü amaçlı yazılımların normal bir process’in altına bir subprocess enjekte edeceğini ve etkinliğini gizleyerek yakalanmaktan kaçınmaya çalışacağını biliyoruz. Ancak konuyu kavrayabilmek için öncelikle DLL’nin tam olarak ne olduğunu ve ne işe yaradığını anlamamız gerekir. Dynamic-Link Library’nin (Dinamik Bağlantı Kütüphanesi) kısaltması olan DLL, Windows uygulamalarının birden çok uygulama arasında kod paylaşması için Windows tarafından sunulan kütüphanelerdir.

Windows’taki her büyük program bazı temel işlemlere ihtiyaç duyar ve DLL tarafından sağlanan, önceden tanımlamış, daha küçük işlevleri kullanır. Bu açıdan bakıldığında, Windows’taki programların kullandığı DLL’ler, kodlamada kullanılan ve yazılımcının işini kolaylaştıran hazır kütüphanelere benzemektedir.

Hepimiz Windows API’ı (Uygulama Programlama Arayüzü) daha önce duymuşuzdur. İşte bu DLL’leri Windows API’ın en temel bloğu olarak düşünebilirsiniz. Örneğin:

  • kernel32.dll — dosya ve klasörlere erişir ve bunlar üzerinde değişiklik yapar.
  • gdi32.dll — grafikleri görüntülemek ve işlemek için kullanılır.
  • wsock32.dll — internet ve ağ uygulamaları tarafından ağ bağlantılarını işlemek için kullanılır.

Daha derine inersek:

Kötü amaçlı yazılımlar, Windows API işlevlerini kullanarak DLL oluşturur veya kötü amaçlı DLL dosyasının yolunu bir process içine yazar. target.exe yürütüldüğünde, “target.exe” önceden tanımlanmış yollardan gerekli DLL’leri çağırır ve yükler. Bu sayede normal bir uygulama mal.dll’i çalıştıracak ve tamamen normal olan uygulamanın zararsız bir subprocess’i olarak gösterecektir.

Yukarıdaki resimde gösterildiği gibi, target.exe içine kötü amaçlı DLL enjeksiyonunu gerçekleştirmekten sorumlu olacak bir başlatıcı dosyamız var. target.exe her yürütüldüğünde, mal.dll de yürütülür. Bu teknik, meşru bir işlem (bizim senaryomuzda target.exe) içerisine kötü amaçlı etkinlikleri gizlemek için kullanılan bir tekniktir.

Nasıl yapılır?

İşleme özel güvenlik duvarını atlamak ve target.exe’ye erişmek için belirli adımlar vardır.

-Zararlı DLL’in yolunu hazırlama

İlk olarak, başlatıcı olarak adlandıracağımız kötü amaçlı yazılım, mevcut çalışma dizinini almak için GetCurrentDirectory’yi ve mal.dll’in yolunu hazırlamak için lstrcatA’i kullanır.

-Hedef işlemin PID’sini (işlem kimliğini) alma

Bir sonraki adım target.exe’nin process ID’sini almaktır. EnumProcesses isimli fonksiyon sistemde her bir process objesinin process tanımlayıcısını alıp bunları bir dizide depolar, daha sonra launcher bu listede gezip “target.exe”yi bulana kadar karşılaştırma yapar ve “target.exe”ye atanmış doğru PID’yi bulana kadar döngüyü tekrar eder.

-target.exe’ye ulaşmak için tanıtıcı edinme

PID alındıktan sonra, bu PID, target.exe’ye bir tanıtıcı elde etmek için OpenProcess işlevine parametre olarak kullanılabilir.

-target.exe sanal adres alanı içinde bellek ayırma

VirtualAllocEx- Bu işlev, önceki adımdan alınan tanıtıcı kullanarak target.exe içindeki belleği ayırır.

-Yeni oluşturulan belleğe mal.dll’in tam yolunu yazma

Bu kodda, “Buffer” parametresi, mal.dll’in tam yolunu içeren bir dizeye işaret eder. lpBaseAddress yeni oluşturulan belleğin başlangıç noktasıdır ve hProcess, target.exe için bir tanıtıcı içerir. Buffer’ı lpBaseAddress‘e yazmak için WriteProcessMemory işlevi çağırılır. Bu da mal.dll’in yolunun target.exe içine yazıldığı anlamına gelir. DLL dosyasını çalıştırmak için kernel32.dll’den LoadLibraryA işlevi gereklidir, bu nedenle LoadLibraryA‘in adresini manuel olarak çözer ve bir değişkene depolar.

-Çalıştırma

Son olarak, CreateRemoteThread sanal adres alanında çalışan iş parçacığı oluşturucu çağrılır. Böylece target.exe ile mal.dll de çalıştırılmış olur.

Yukarıdaki örnek, DLL injection yöntemlerinden biridir ancak enjeksiyon farklı yollarla da gerçekleştirilebilmektedir.

Sources:


Yazara ait diğer yazılar

DLL Injection Nedir?
Komut ve Kontrol Sunucusu (Command and Control Server/C2) Nedir?
Botnet Saldırılarında C2 Sunucularından Nasıl Yararlanılır?