Antivirüs programları

Merhaba, geçen yazdığım programı test ederken txt dosyası oluşturma sırasında antivirüs programının kendi programımın dosyayı oluşturmasını engellediğini ve benden izin istediğini farkettim. İzin verdikten sonra program erişim engellendiği için hata verdi ama tekrar açtığımda izin verdiğim için antivirüs kendi programımı engellemedi ve dosyayı oluşturdum. Merak ettiğim şu: Antivirüs programları bir dosyanın oluşturulduğunu nasıl anlıyor ve engelliyor ? Programların çalıştırdığı kodları mı izliyorlar ? Ayrıca bunu sadece dosya oluşturma da mı yapabiliyolar yoksa istedikleri herhangi bir işlemi de engelleyebilirler mi ? Ve bunu nasıl yapabiliyorlar ? İşletim sisteminin kendisinin programların yaptığı işlemleri incelemesi veya engelleyebilmesini anlıyorum ama bir programın nasıl yapabildiğini anlamadım.

Isletim sistemine ve antivirus programina bagli.

Isletim sistemi de bir program?

Antivirusun isletim sisteminin bir parcasi haline gelmesi veya gecici olarak yuksek mertebede izin istemesi mumkun.

Belli bir versiyona kadar herhangi bir Windows programi herhangi baska bir Windows programina yuklenebiliyor, hafizasini ve calismasini degistirebiliyor, istedigi her seyi yapabiliyordu bu arada.

DOS gibi isletim sistemlerinde hic bir koruma yok; hatta isletim sistemiyle programlarin arasinda da fark yok.

Linux’teki koruma mekanizmalarinin cogunlugu EUID 0 ise (kullanici root ise) calismiyor.

Doğru, bunu hesaba katmamıştım.

Programın hafızasını ve çalışmasını değiştirebilen Memory.dll diye bir kütüphane vardı C# için. Bu tarz kütüphanelerden mi bahsediyorsunuz yoksa exe dosyaları da mı sayılır ?

Ne versiyonu ?

Evet antivirüs programları, programları izler ve izinlere göre uyarılar verir.

İzinler bu işe yarar.

Konu uzun altta toparlayıp tek parça yazayım.

Hayır full system scan yapmıyorsan kodları izlemez. Realtime korumada ise sadece yüklenen koda yüklenmeden önce bakar. Ama asıl sorduğun kısmı burada virüs imzası aramaktan farklı.

Hayır sadece dosya oluşturma için değil, farklı antivirüs programlarının, farklı kurallar oluşturarak herhangi bir işlemi yapmasını engelleyebilirsin.

Oluşturduğun Rules/kurallar ile yapıyor.

Konu uzun ama özetlemeye çalışayım. İşletim sistemleri ve altında çalışan programlar, event driven( olay güdümlü) olarak çalışır.

Bu şu demek: Bir butona bastığında, bir pencereyi taşıdığında, bir simgeye tıkladığında bir olay(event) oluşturursun. Bu olaylar oluştuğunda bir mesaj gönderilir işletim sistemine, yada işletim sistemi de programlara mesajlar gönderir.

List Of Windows Messages - WineHQ Wiki

Örnek olsun diye bıraktım, microsoft referanslarında daha fazlasını bulabilirsin.

Yani aslında windows, çalıştırdığı programlarla mesajlar alıp vererek haberleşir. Bu mesajlar aslında birer word sayıdır (bazı durumlarda double word).

Bu mesajlar ilgili mesaj kuyruklarında işlenir. Windows programları ve windows işletim sistemi her program için bir mesaj işleme kodu içermek zorundadır.

Using Messages and Message Queues - Win32 apps | Microsoft Docs

HWND hwndMain; 
HWND hwndDlgModeless = NULL; 
MSG msg;
BOOL bRet; 
HACCEL haccel; 
// 
// Perform initialization and create a main window. 
// 
 
while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0)
{ 
    if (bRet == -1)
    {
        // handle the error and possibly exit
    }
    else
    {
        if (hwndDlgModeless == (HWND) NULL || 
                !IsDialogMessage(hwndDlgModeless, &msg) && 
                !TranslateAccelerator(hwndMain, haccel, 
                    &msg)) 
        { 
            TranslateMessage(&msg); 
            DispatchMessage(&msg); 
        }
    } 
} 

Translate ve dispacth message alt yordamları ile windowstan gelen mesajları alırsın. Aynı şekilde işletim sistemine mesaj gönderirsen. O da benzer bir yapı ile programdan işletim sistemine gelen mesajları işler.

Bunları neden anlattım?

Şimdi programın bir dosya oluşturmak istedi, aslında arka planda bir api cağrısı yapar ve dosyanın oluşturulması için bir mesaj gönderir.

İşte antivirüs programları bu mesajlara kanca atar ve olay tetiklendiğinde, windows un varsayılan cevabı yerine kendi yordamlarını eklemene izin verir.

Yani ortalıkta gezen mesajlardan istediğini seçip, istediğin mesajın yaptığını değiştirme izni verebilirsin.

MS Visual Studio kullanıyorsan, araçlar menüsü altında Spy++ aracını kullanabilirsin.

Bu araç ile windows’un o anda aldığı ve verdiği tüm mesajları gerçek zamanlı görebilirsin.

İhtiyacın olursa Spy++ kullanımı için;

Spy++ - Visual Studio (Windows) | Microsoft Docs

Yani windows ve programlar mesajlar yoluyla haberleşir ve bu mesajları alıp değiştirip istediğin farklı sonucu elde edebilirsin.

Peki bunu nasıl yaparsın;

  1. Winhooks:

Hooks - Win32 apps | Microsoft Docs

Bu yöntemde, eğer bir mesaja kanca atarsan, olay tetiklendiğinde yapılacakları bu koda entegre edebilirsin.

  1. Subclassing:

Subclassing Controls - Win32 apps | Microsoft Docs

Burada bir fonksiyona altsınıf olarak tanımlayarak davranışını değiştirebilirsiniz. Mesela, bir dosya yazma olayını miras alır, ardından eğer izin listesinde değilse dosya yazmaz, ama izin listede ise izin veren bir koda bağlayabilirsiniz.

Kullandığım, paranteze aldığım, maddelediğim konuları incelerseniz literatürde daha fazla bilgi bulabilirsiniz.

Yine de anahtar kelime vereyim: event driven, subclassing, windows hook, message que

1 Beğeni

Yani windows ta her yapmak istediğimiz işlemin bir event ve antivirüs programının yaptığı bu eventleri incelemek ve gerekeni değiştirmek değil mi ?
Bahsettiğiniz yöntemlerden biri kanca atmak. Mesela dll çağırmak için rundll32 diye bir program vardı. Burada da eventler için tek bir program var da ona mı kanca atıyor yoksa çalışan tüm programlara mı ?

Evet ama bu olayları izleme ile ilgili kısmı, diğer taraftan dosyalar içinde virüs imzalarını aramak, antivirüs programlarının temel özelliği. Bir ileri seviye ise, heuristic ( buluşsal yada sezgisel de diyebiliriz) yani bunların kombinasyonu şeklinde olabilir.

Bu neye hook yaptığınıza bağlı. Mesela winsock.dll dosyasına kanca atarak, socket bağlantılarını takip edebilirsiniz.

win32.dll dosyasını takip edebilirsiniz, vs.

Bunlar çağırılacak şüpheli API hangi kütüphanede ise ona kanca atarak, api çağrıldığında yakalamaya olanak sağlar.

Mesela;

CreateFileA function (fileapi.h) - Win32 apps | Microsoft Docs

Takip etmek istediğiniz api createfilea() o zaman hangi dll de ise ona kanca atarsınız.

Tahminen kernel32.dll içerisindedir.

Söylediğim gibi konu çok geniş.

Bütün detalar buraya sığmaz. Bazen driver seviyesinde kodlar yazmanız ve takip etmeniz gerekebilir. Hepsi derya deniz. Belki örnekler yaparak anlatmak faydalı olur. Ama burada yeteri kadar vakit harcıyorum, fazlasını kendiniz deneyerek çalışmalısınız.

Yani sadece dll e kanca atarak onu kullanan tüm programları etkilemiş oluyoruz. Kanca atmak sadece çalışan işlemlerde oluyordu diye biliyorum dosyaya nasıl kanca atılıyor ?

Hayır, işletim sistemi dll dosylarına kanca atıyorsun. Bu durumda, bu çağrıyı kim yaparsa yapsın, önemi kalmıyor. Zaten window handle ve process id ile isteği yapan bilgisi elinde oluyor. Yakalayacağın olay tek tek programlara bakmak değil, işletim sistemindeki apileri çağırdığında tetiklemiş oluyorsun.

Teoride dll dosyaları uygulama değildir. Ama bir uygulama bu dll den çağrı yaptığında artık uygulamanın parçasıdır.

Bu da seni şu gerçeğe ulaştırır. Windows’un kendisi de bir uygulamadır. Windows mesajları işlerken, talep ettiğinde sana da mesajın gönderilmesini sağlar.

Hook Functions - Win32 apps | Microsoft Docs

Yani windows’un ana mesaj kuyruğuna senin isteğini de kaydeder ve mesajlara callback fonksiyon olarak ulaşımını sağlar.

Edit:

Windows API Hooking Tutorial (Example with DLL Injection) (apriorit.com)

Bu biraz daha kafanda canlanmasına yardımcı olabilir.

About file system filter drivers - Windows drivers | Microsoft Docs

Sonunda yapılması gerekeni anladım. Hatta python ile yapılmış örnekler de buldum ve aşina olduğum bir dil olduğu için daha kolay anladım. Hepinize teşekkürler.