|
Welcome,
Guest
|
|
Günümüzde bilgi sızdırmanın en yaygın yöntemlerinden biri de ekran görüntüsü almaktır. Bu açıdan ekran görüntüsünün korunması kredi kartı numarası, adres, resim gibi kişisel bilgilerin korunmasında çok önemlidir. Bu yöntemle bilgisayarda o an görüntülenen tüm bilgiler elde edilebilir. Bir bilgisayarın ekran görüntüsü çeşitli yollarla elde edilebilir. "Print Scrn" tuşu ve FastStone gibi üçüncü parti yazılımlar bunlardan başlıcalarıdır. Ayrıca bir çok işletim sistemi bu işlem için çeşitli arayüzler ve fonksiyonlar sağlamaktadır.
Yukarıda belirtildiği gibi bir bilgisayarın ekran görüntüsünü elde etmenin bir çok yöntemi vardır. Bu yüzden ekran görüntüsünü korumak oldukça zor bir durumdur. Bu yazıda Windows platformunda en yaygın iki ekran görüntüsü alma yöntemi ele alınacak ve bu yöntemlerle oluşabilecek veri sızdırmalarını engelleme amacı ile veri analizi grubunun yaptığı çalışmalardan bahsedilecektir. Bu yöntemler "print screen engelleme" ve "sistem çağrısı dinleme" yöntemleridir. Sistem Çağrıları Bir proses, ek kaynak veya bilgisayarın çevre birimlerini kullanabilmek için sistem çağrıları ile işletim sistemine talepte bulunur. Üçüncü parti ekran görüntüsü alan yazılımların bir çoğu Windows API'yi (WinApi) kullanmaktadır. WinApi tüm Windows sürümlerinde bulunan uygulama geliştirme arayüzüdür. Bu arayüz geliştiriciye bir çok kolaylık sunmaktır. Üçüncü parti ekran görüntüsü alan yazılımların bir çoğu bu arayüzün sağladığı GetDesktopWindow fonksiyonunu kullanmaktır. Bu fonksiyon masaüstü penceresine ait handle'ı (Handle, sistemde bulanan bir nesneye işaret eden adres olarak tanımlanabilir) geri döndürmektedir. Windows görsel arayüzünde herbir bileşen (butonlar, metin kutuları vs) birer pencere nesnesi olarak görülür. Bundan dolayı tüm görsellerin çiziminin üstüne yapıldığı masaüstü olarak adlandırılan alanda bir penceredir. Ekran görüntüsünün alınabilmesi için bu pencereye ulaşılması gerekmektedir. Bu pencereye erişim yukarıda da belirtildiği gibi GetDesktopWindow fonksiyonu ile sağlanmaktadır. Bu yöntemi engellemek için yapılan çalışmalarda dll enjeksiyonu yöntemi kullanılmıştır. Bu yöntemle yapılan GetDesktopWindow çağrılarında araya girmeye çalışılmıştır. EasyHook adı verilen bir kütüphane aracılığı ile bu işlem gerçekleştirilmiştir. Uygulama .NET platformunda geliştirilmiştir. Uygulamaya dll enjekte edilecek prosesin ID'si girdi olarak verilir. Bu aşamadan sonra belirtilen prosese ilgili dll enjekte edilir. Bu dll GetDesktopWindow çağrılarının işletim sistemi yerine uygulamaya iletilmesini sağlar. Bu aşamada çağrı işletim sistemine aynen iletilir ya da çağrı düşürülerek prosese boş sonuç gönderilir. Geliştirilen uygulamada prosese boş sonuç döndürülmüştür. resim-1.jpg Şekil 1. FastStone'un normal çalışması resim-2.jpg Şekil 2. FastStone'un engellenmiş hali Yukarıda görüldüğü gibi Şekil 1'de FastStone normal çalışırken, dll enjeksiyonu sonrası ekran görüntüsü almaya çalıştığında Şekil 2'deki gibi bir durum ortaya çıkmaktadır. Aşağıda da benzer bir uygulama olan GreenShot programının ekran görüntüleri verilmiştir. resim-3.jpg Şekil 3. GreenShot programının normal çalışması resim-4.jpg Şekil 4. GreenShot programının engellenmiş hali Bu çalışmada ekran görüntüsünün alınması tamamen engellenmiştir ancak sistem çağrısında araya girildikten sonra ekranda o an görüntülenenler tespit edilerek ekrana müdahale edildikten sonra sistemin normal çalışmasına izin verilebilir. Bu yöntem "Print Screen" tuşu ile ekran görüntüsü almayı engelleme yönteminde kullanılmıştır. Sistem çağrılarının engelleme çalışmaları şu anki durumu ile ekran görüntüsünü zararlı yazılımlara karşı korumak için yeterli değildir. Çünkü sistem çağrısında araya girme işlemi sadece proses bazlı yani sadece belirlenen bir prosese yapılmaktadır. Bu durumda yapılan tüm GetDesktopWindow çağrıları tespit edilmemektedir. Bu yöntem ile ekran görüntüsünü korumak için "user32.dll" kütüphanesinde bulunan GetDesktopWindow fonksiyonuna yapılan tüm çağrılar tespit edilmelidir. Print Screen Print screen fonksiyonu windows işletim sistemlerinde bilinen en yaygın ekran görüntüsü alma yöntemidir. Standart kullanıcıların neredeyse tamamı bu fonksiyon ile ekran görüntüsü almaktadır. Bu fonksiyonun engellenmesi için üç aşamalı bir yöntem kullanılmıştır. Bunlar: Print Screen fonksiyonunun kullanıldığından haberdar olunabilmesi ve duraklatılması O anda açık olan pencerelerden varsa gizli olan alanın belirlenmesi Varsa gizli alanın karartılması ve modifiye edilmiş yeni görüntünün Clipboarda konulması. Keyboard Hook Birinci aşamayı gerçekleştirmek için için "Print Screen" tuşunu dinleyen bir Global Keyboard Hook kullanıldı. "Print Screen" tuşunu dinleyen Global Keyboard Hook oluşturmak için win32.dll kütüphanesinin SetWindowsHook fonksiyonu kullanılır. Aşağıda bu işlemi yapacak örnek kod parçası verilmiştir. [DllImport("user32.dll", SetLastError = true)] static extern IntPtr SetWindowsHookEx(HookType hookType, HookProc lpfn, IntPtr hMod, uint dwThreadId); IntPtr hModule = GetModuleHandle(module.ModuleName); hHook = SetWindowsHookEx(HookType.WH_KEYBOARD_LL, hook, hModule, 0); Pencereler ve Z-order Print Screen talebini birinci aşamada yakaladıktan sonra ikinci aşamada, o anda bilgisayarda açık olan uygulamalardan gizli bilgi içerenlerin kullanıcıya görünür kısımları hesaplanmalıdır. Bu işlem için ise gizli olan pencerenin tüm alanından onun üzerinde yer alan (z-order değeri daha düşük) pencerelerin alanlarını çıkararak gizli alan hesaplanır. Bu aşamada yine user32.dll kütüphanesinden GetWindowRect, GetWindow ve IsWindowVisible fonksiyonları kullanılır. Örnek kod şu şekildedir: foreach (var proc in procList) { RECT secretRECT = new RECT(); RECT tempRECT = new RECT(); GetWindowRect(proc.MainWindowHandle, out secretRECT); Region secretRegion = new Region(rectToRectangle(secretRECT)); IntPtr prevWindows = GetWindow(proc.MainWindowHandle, (uint)GetWindow_Cmd.GW_HWNDPREV); while (!prevWindows.ToInt32().Equals(0)) { if (IsWindowVisible(prevWindows)) { GetWindowRect(prevWindows, out tempRECT); secretRegion.Exclude(rectToRectangle(tempRECT)); } prevWindows = GetWindow(prevWindows, (uint)GetWindow_Cmd.GW_HWNDPREV); } rgnToPaint.Union(secretRegion); } Yapay Print Screen ve Son Ürün Son aşamada gizli alan hesaplandıktan sonra gizli bilgilerden arındırılmış imajı oluşturup clipboarda kopyalanmalı. Öncelikle yapay olarak ekran görüntüsünü almak için Graphics sınıfının CopyFromScreen fonksiyonunu kullanılır. Daha sonra önceden belirlenen alan yine Graphics sınıfının FillRegion fonksiyonu ile siyaha boyanır. Son olarak ise Clipboard.SetImage fonksiyonu ile gizli bilgiden arındırılmış imaj clipboarda kopyalanır. Aşağıda örnek kod parçası ve bu işlemlerden sonra oluşturulan bir Print Screen görüntüsünü bulunmaktadır. resim-5.jpg Şekil 5. Print screen alınmamış ekran görüntüsü graphics.CopyFromScreen(new Point(screen.Bounds.Left,screen.Bounds.Top), new Point(0, 0), screen.Bounds.Size); graphics.FillRegion(Brushes.Black, rgnToPaint); bmp.Save(tempDir + DateTime.Now.ToFileTime() + ".jpg", ImageFormat.Jpeg); Clipboard.SetImage(Image.FromHbitmap(bmp.GetHbitmap())); resim-6.jpg Şekil 6. Gizli bilgi karartılmış ekran görüntüsü Sonuç olarak yukarıda iki farklı ekran görüntüsü alma yöntemi ve bu yöntemleri engellemek için yapılan çalışmalara yer verilmiştir. Bu çalışmalar ekran görüntüsünün zararlı yazılımlara karşı korunmasında yeterli değildir. |
|
|
Please Log in or Create an account to join the conversation. |
