Программа для отображения нажатых клавиш на экране linux

Обновлено: 07.07.2024

Я пишу программу, которая отслеживает нажатия клавиш на клавиатуре. Но моя программа может работать на переднем плане или в фоновом режиме. Я слышал, что существует системный вызов, специфичный для ОС, который позволяет программисту отслеживать активность клавиатуры, даже когда программа, выполняющая системный вызов, находится в фоновом режиме. Я новичок в программировании на Ubuntu, поэтому, пожалуйста, кто-нибудь, скажите мне, что это за системный вызов ОС.

Замечания:
Эта программа предназначена исключительно для образовательных целей. Это часть школьного проекта.

Решение

Большинство систем Ubuntu (по крайней мере, настольные для начинающих пользователей Ubuntu) работают X11 сервер окна (как Xorg ). Этот сервер (только) получает необработанные вводы с клавиатуры и мыши. Он обрабатывает их, чтобы доставить События протокола X11 клиентским приложениям (например, вашему браузеру Firefox или вашему emacs редактор, или ваш гном или xterm Терминал).

Вы могли бы потратить свое время (месяцы) на понимание всех из них (возможно, начиная с Freedesktop Вы также можете переключиться на другой проект, возможно, просто написать интересное приложение с графическим интерфейсом, используя Gtk (внутри Гнома) или Qt (в KDE). Все библиотеки графических инструментов Linux построены над библиотекой, взаимодействующей с протоколом X11, обычно Xlib , или же XCB .

Если вы хотите начать изучать программирование на Linux, прочитайте Расширенное программирование Unix а также Расширенное программирование в Linux . После этого потребуется много времени, чтобы понять тайны TTY -и познакомиться с Системные вызовы (2) . Затем ознакомьтесь с графическим инструментарием, таким как Qt или GTK.

Как только вы поймете все концепции в ссылках, которые я вам дал, вы сможете более точно задать свой вопрос. Когда вы повторно зададите свой вопрос в более точных и технических терминах (в частности, объясните, на каком уровне вы хотите контролировать клавиатуру) & мыши), показывая код, который вы экспериментировали, мы сможем (и готовы) ответить вам.

Другие решения

слышал, что есть ОС специфичный системный вызовОт кого ты это слышал? Вы спрашивали их?

Это требует более одного звонка, вам нужно использовать ioctl (может отличаться в Ubuntu), чтобы протолкнуть ваш регистратор в поток терминала. Это не просто и не очень подходит для начинающего проекта. Например, см. script программа.

Существует программа для Linux, которая связывает глобальные горячие клавиши и выполняет предварительно определенные действия при нажатии клавиш. Это называется xbindkeys , Посмотрите в его исходном коде предложение или просто используйте его как есть.

Несколько раз я пытался найти пример кода, который бы позволял отслеживать события нажатия и отжатия клавиш в нашем любимом X-сервере. Важный момент: нужно было, чтобы события клавиатуры отлавливались глобально, а не только в текущем окне. В интернете я находил только беспомощные просьбы дать кусок работающего кода. Но весь код, что в этих обсуждениях выкладывался, работал только в одном окне.

В конце концов я плюнул на все, и задался вопросом: а есть ли вообще в природе простая программа под X11, которая была бы способна глобально отследить нажатия клавиш? Я пробовал xev - он работал только с текущим окном. Мне советовали showkey и screenkey - но оказалось, что эти программы не имеюют отношения к Иксам. Мне снова и снова давали ссылки на код, который ловил события клавиатуры только в своем окне. Я чистал обсуждения, в которых гуру утверждали, что по-другому быть не может, ибо это была бы дыра в безопасности, поэтому требуемого мной функционала в X11 вообще не предусмотрено.

Наконец, я нашел программу xinput, которая без лишних слов просто показывала события нажатия-отжатия клавиш, причем делала это глобально, независимо от того, какое окно в настоящий момент активно.

Пользоваться этой программой надо так. Вначале нужно узнать ID виртуального устройства клавиатуры, с которым нужно работать:

⎡ Virtual core pointer [master pointer (3)]

⎜ ↳ Virtual core XTEST pointer [slave pointer (2)]

⎜ ↳ HID 1241:1177 [slave pointer (2)]

⎜ ↳ SIGMACH1P USB Keykoard [slave pointer (2)]

⎣ Virtual core keyboard [master keyboard (2)]

↳ Virtual core XTEST keyboard [slave keyboard (3)]

↳ Power Button [slave keyboard (3)]

↳ Power Button [slave keyboard (3)]

↳ SIGMACH1P USB Keykoard [slave keyboard (3)]

В нашем случае, устройство клавиатуры видно как Далее можно ловить события клавиатуры следующей командой:

lkey release 47

Это было то, что нужно. Я выкачал исходники xinput, поковырялся с ними, и сделал минимально работающий пример кода, который глобально перехватывал события клавиатуры. Здесь я его привожу.

Примечание 1: для правильной работы надо узнать и прописать ID виртуального устройства в следующую строку файла mian.cpp:

Примечание 2: компилировать можно командой:

gcc ./main.cpp -lstdc++ -lX11 -lXext -lXi

Примечание 3: для компиляции необходимо будет установить пакет libxi-dev:

apt-get install libxi-dev

Файл main.h

extern int xi_opcode; /* xinput extension op code */

XDeviceInfo* find_device_info( Display *display, char *name, Bool only_extended);

Файл main.cpp

using namespace std;

static int motion_type = INVALID_EVENT_TYPE;
static int button_press_type = INVALID_EVENT_TYPE;
static int button_release_type = INVALID_EVENT_TYPE;
static int key_press_type = INVALID_EVENT_TYPE;
static int key_release_type = INVALID_EVENT_TYPE;
static int proximity_in_type = INVALID_EVENT_TYPE;
static int proximity_out_type = INVALID_EVENT_TYPE;

static int register_events(Display *dpy,
XDeviceInfo *info,
char *dev_name,
Bool handle_proximity)
int number = 0; /* number of events registered */
XEventClass event_list[7];
int i;
XDevice *device;
Window root_win;
unsigned long screen;
XInputClassInfo *ip;

screen = DefaultScreen(dpy);
root_win = RootWindow(dpy, screen);

device = XOpenDevice(dpy, info->id);

if (!device) printf("unable to open device '%s'\n", dev_name);
return 0;
>

if (device->num_classes > 0) for (ip = device->classes, i=0; i<info->num_classes; ip++, i++) switch (ip->input_class) case KeyClass:
DeviceKeyPress(device, key_press_type, event_list[number]); number++;
DeviceKeyRelease(device, key_release_type, event_list[number]); number++;
break;

case ButtonClass:
DeviceButtonPress(device, button_press_type, event_list[number]); number++;
DeviceButtonRelease(device, button_release_type, event_list[number]); number++;
break;

case ValuatorClass:
DeviceMotionNotify(device, motion_type, event_list[number]); number++;
if (handle_proximity) ProximityIn(device, proximity_in_type, event_list[number]); number++;
ProximityOut(device, proximity_out_type, event_list[number]); number++;
>
break;

default:
printf("unknown class\n");
break;
>
>

if (XSelectExtensionEvent(dpy, root_win, event_list, number)) printf("error selecting extended events\n");
return 0;
>
>
return number;
>

static void print_events(Display *dpy)
XEvent Event;

setvbuf(stdout, NULL, _IOLBF, 0);

while(1) XNextEvent(dpy, &Event);

if (Event.type == motion_type) int loop;
XDeviceMotionEvent *motion = (XDeviceMotionEvent *) &Event;

for(loop=0; loop<motion->axes_count; loop++) printf("a[%d]=%d ", motion->first_axis + loop, motion->axis_data[loop]);
>
printf("\n");
> else if ((Event.type == button_press_type) ||
(Event.type == button_release_type)) int loop;
XDeviceButtonEvent *button = (XDeviceButtonEvent *) &Event;

printf("button %s %d ", (Event.type == button_release_type) ? "release" : "press ",
button->button);

for(loop=0; loop<button->axes_count; loop++) printf("a[%d]=%d ", button->first_axis + loop, button->axis_data[loop]);
>
printf("\n");
> else if ((Event.type == key_press_type) ||
(Event.type == key_release_type)) int loop;
XDeviceKeyEvent *key = (XDeviceKeyEvent *) &Event;

printf("key %s %d ", (Event.type == key_release_type) ? "release" : "press ",
key->keycode);

for(loop=0; loop<key->axes_count; loop++) printf("a[%d]=%d ", key->first_axis + loop, key->axis_data[loop]);
>
printf("\n");
> else if ((Event.type == proximity_out_type) ||
(Event.type == proximity_in_type)) int loop;
XProximityNotifyEvent *prox = (XProximityNotifyEvent *) &Event;

printf("proximity %s ", (Event.type == proximity_in_type) ? "in " : "out");

for(loop=0; loop<prox->axes_count; loop++) printf("a[%d]=%d ", prox->first_axis + loop, prox->axis_data[loop]);
>
printf("\n");
>
else printf("what's that %d\n", Event.type);
>
>
>

// Определение версии библиотеки расширений, установленной для X11
int xinput_version(Display *display)
XExtensionVersion *version;
static int vers = -1;

if (vers != -1)
return vers;

version = XGetExtensionVersion(display, INAME);

if (version && (version != (XExtensionVersion*) NoSuchExtension)) vers = version->major_version;
XFree(version);
>

forced_version = getenv("XINPUT_XI2_VERSION");
if (forced_version) if (sscanf(forced_version, "%d.%d", &maj, &min) != 2) fprintf(stderr, "Invalid format of XINPUT_XI2_VERSION "
"environment variable. Need major.minor\n");
exit(1);
>
printf("Overriding XI2 version to: %d.%d\n", maj, min);
>

// Поиск информации об устройстве
XDeviceInfo* find_device_info(Display *display,
char *name,
Bool only_extended)
XDeviceInfo *devices;
XDeviceInfo *found = NULL;
int loop;
int num_devices;
int len = strlen(name);
Bool is_id = True;
XID />
for(loop=0; loop<len; loop++) if (!isdigit(name[loop])) is_id = False;
break;
>
>

devices = XListInputDevices(display, &num_devices);

for(loop=0; loop<num_devices; loop++) if ((!only_extended || (devices[loop].use >= IsXExtensionDevice)) &&
((!is_id && strcmp(devices[loop].name, name) == 0) ||
(is_id && devices[loop].id == id))) if (found) fprintf(stderr,
"Warning: There are multiple devices named '%s'.\n"
"To ensure the correct one is selected, please use "
"the device ID instead.\n\n", name);
return NULL;
> else found = &devices[loop];
>
>
>
return found;
>

int test(Display *display, char *deviceId)
XDeviceInfo *info;

Bool handle_proximity = True;

info = find_device_info(display, deviceId, True);

if(!info)
printf("unable to find device '%s'\n", deviceId);
exit(1);
>
else
if(register_events(display, info, deviceId, handle_proximity))
print_events(display);
else
fprintf(stderr, "no event registered. \n");
exit(1);
>
>

int main()
Display *display;
int event, error;

// Инициируется указатель на текущий дисплей
display = XOpenDisplay(NULL);
if (display == NULL)
printf("Unable to connect to X server\n");
exit(1);
>

// Проверяется наличие расширений
if(!XQueryExtension(display, "XInputExtension", &xi_opcode, &event, &error))
printf("X Input extension not available.\n");
exit(1);
>

// Проверяется версия расширения, она не должна быть нулевой
if(!xinput_version(display))
printf("%s extension not available\n", INAME);
exit(1);
>

Как работает драйвер клавиатуры

Согласись, для того что бы написать
грамотный keylogger нужно знать, каким образом
нажатие клавиши на клавиатуре
регистрируется в системе. Смотри схему:

handle_scancode -> put_queue -> tty_queue -> receive_buf ->
буфер tty_ldisc -> tty_read -> /dev/ttyX -> sys_read ->
процесс пользователя

Сначала, когда вы нажимаете клавишу на
клавиатуре, устройство посылает
соответствующий скан код клавиши
клавиатурному драйверу. Единичное нажатие
может произвести последовательность до
шести кодов. Функция handle_scancode() в
клавиатурном драйвере обрабатывает поток
кодов и конвертирует их (при помощи функции
перевода kbd_translate()) в серию событий типа "клавиша
нажата", "клавиша отпущена".
Каждый баттон имеет свой уникальный код от 1
до 127. Нажатие клавиши генерирует этот код, а
отпускание - этот код + 128 (например когда вы
нажимаете 'a' то на гора выдается код 30, а
когда отпускаете - 158).

Дальше код клавиши в соответствии с
картой клавиш конвертится обратно в сам
символ (вообще говоря при этом учитываются
нажатые функциональные клавиши - Shift , AltGr,
Control, Alt, ShiftL, ShiftR, CtrlL и CtrlR, комбинации
активных "модификаторов" - CapsLock
например) и передается по цепочке буферов и
очередей к терминалу.

Драйвер клавиатуры может работать в
четырех режимах:

    scancode (RAW MODE): приложенице получает
    сканкод из потока и дальше обрабатывает
    его собственным драйвером (пример тому - Х11).

Эти режимы в конце концов и определяют,
что приложение получит в результате
нажатия клавиши. (Кстати говоря: режим
работы драйвера клавиатуры можно узнать
или изменить с помощью kbd_mode(). Но
помни! Смена режима может вообще оставить
тебя без клавиатуры!)

Kernel based keylogger

В общем говоря, мы можем перехватить поток
кодов двумя способами: написать обработчик
прерывания клавиатуры или вмешаться в
передачу на одном из описанных выше этапов.

Обработчик прерывания

Гляди как реализуется первый вариант. В
архитектуре Intel для контроллера клавиатуры
выделено первое прерывание. Когда оно
возникает наш обработчик должен прочитать
сканкод и статус клавиатуры. События
клавиатуры можно получить на 0х60 порту (Keyboard
data register), а ее состояние - на 0х64 (Keyboard status
register).

scancode = kbd_read_input();
key_status = kbd_read_status();
log_scancode(scancode);

Этот обработчик канает только для
архитектуры Intel, так что в случае переноса
на другую платформу он работать
естественно не будет. Хотя, честно говоря,
где ты у нас видел другие платформы.

Замена функций

Это начальная функция драйвера
клавиатуры (keyboard.c), она обрабатывает скан
коды, получаемые от клавиатуры:

Мы можем заменить настоящий handle_scancode()
собственной процедурой, которая помимо
всего прочего будет записывать коды клавиш.

10 лучших бесплатных кейлоггеров для ПК

Кейлоггер (англ. Keylogger) – разновидность ПО, которое применяется для отслеживания или логирования всех нажатий клавиш на клавиатуре. Пользователь электронного устройства может даже не подозревать, что любые клики и нажатия записываются, а кейлоггер-то запоминает абсолютно все – вплоть до переписок в соцсетях и чатах. Присутствие такой программы практически невозможно заметить, поскольку она функционирует в фоновом режиме, как составной элемент операционной системы.

Также рекомендуем:

Кейлоггер. Насколько это законно?

У многих подобные программы ассоциируются с незаконной деятельностью и вредоносным ПО. Но, как мы уже писали, несмотря на то, что кейлоггеры можно рассматривать как вторжение в частное пространство, все же это никоим образом не нарушает закон. Родители, к примеру, могут обзавестись таким ПО, чтобы защитить своих детей в интернете, – и выяснить, с кем они общаются в Facebook или Whatsapp. Приложение отслеживает данные на ПК, Mac, iPhone и других устройствах.

Работодатель, в свою очередь, может сделать вывод о том, чем занимаются его сотрудники во время работы. Система выдает детальные онлайн-отчеты о продуктивности персонала.

Еще одно возможное применение кейлоггера – для защиты настроек приватности, паролей и данных, которые могут утеряться, из-за багов в компьютере. Но, с другой стороны, злоумышленник с помощью кейлоггера может получить доступ к частной и конфиденциальной информации, что, конечно же, запрещено законом.

Возможности кейлоггеров, разработанных под Windows и macOS:

  • Фиксируется время, которое ребенок или сотрудник проводит у монитора
  • Составляется список часто используемых приложений и сайтов
  • Отслеживается активность пользователей в онлайн-режиме
  • Анализируется их продуктивность
  • Высвечиваются контакты на телефоне, с которыми пользователь часто поддерживает связь (звонки, SMS, чаты, почта, skype).
  • Отслеживается местонахождения телефона
  • Ведется удаленный онлайн-мониторинг за ПК и телефоном

Существует множество разновидностей и версий подобных систем, поэтому выбирая кейлоггер, составьте список функций, которые не должны присутствовать в вашей программе. Так вы исключите все лишние варианты.

1. Kickidler | бесплатно/$9 | Win | Mac | Lin


Kickidler — система учета рабочего времени и контроля сотрудников за ПК.

В Kickidler функция кейлоггера интегрирована с записью видео, то есть можно посмотреть историю того, что было на экране пользователя, когда он набирал определенную комбинацию клавиш. Это дает наиболее полную информацию о действиях сотрудника. Также есть фильтр по ключевым словам и выгрузка истории нажатия клавиш в эксель.

Система собирает информацию обо всех нажатиях клавиш во всех программах:

Нажатые клавиши отображаются в режиме реального времени, или в виде отчета. Есть отчет об интенсивности нажатия клавиш, из чего можно узнать, например, печатал ли сотрудник или изредка нажимал на пробел.

Собранную информацию (текст, видео и все нарушения рабочего распорядка) можно просмотреть на единой временной шкале – что абсолютно точно позволит выяснить, чем занимался сотрудник в конкретный момент времени.

Для чего нужен кейлоггер:

  • Предотвращение утечек информации (DLP – Data Leak Prevention)
  • Контроль использования конфиденциальных данных (DLP – Data Loss Protection)
  • Анализ эффективности работы при вводе текста с клавиатуры

Дополнительный функционал: контроль нарушений, запись видео, онлайн-мониторинг, учет эффективности использования рабочего времени.

Kickidler работает на компьютерах с любой операционной системой: Windows, Linux и Mac OS. Есть бесплатная версия программы – до 6 сотрудников.

Какие еще функции есть в Kickidler?

  • Онлайн-мониторинг компьютеров.
  • Видеозапись активности за компьютером.
  • Учет рабочего времени за ПК.
  • Анализ эффективности.
  • Контроль нарушений.
  • Автоматические уведомления о нарушениях.
  • Функция самоконтроля (для удаленных сотрудников).
  • Удаленное управление ПК.

2. Best Free Keylogger | бесплатно/$39 | Win


Best Free Keylogger – это мониторинговый инструмент для ПК, который совершенно незаметен во время работы. Это ПО отслеживает нажатия клавиш, чаты, активность в сети, URL, копируемые тексты, файлы и скриншоты. Одно из лучших решений для наблюдения за детьми, когда родителей нет дома.

  • Запись нажатых клавиш
  • Запись интернет-активности
  • Логирование чатов и паролей
  • Мониторинг буфера обмена
  • Мониторинг приложений
  • Скриншоты
  • Email, FTP, LAN, USB
  • Невидимый режим и защита паролей
  • Незаметен на все 100%
  • Мониторинг расписания
  • Автоматическая очистка логов

3. Windows Keylogger | Бесплатно/USD49 | Win


Windows Keylogger присутствует на компьютерах тысяч пользователей по всему миру.

  • Функция Easy Read позволяет быстро и просто просматривать нажатые клавиши
  • Используется для мониторинга отдельных пользователей в отдельных приложениях
  • Фильтр логов в расширенном поиске
  • Установка даты для автоматического удаления

4. Spyrix Keylogger Free | Бесплатно | Win, Mac & Android


Spyrix Keylogger – бесплатное ПО для логирования клавиш, которое позволяет записывать и отслеживать каждое нажатие, инструмент способен сохранять скриншоты активных программ в установленные временные интервалы – то есть фиксируется все происходящее на экране.

  • Удаленный мониторинг посредством безопасного веб-аккаунта
  • Логирование нажатий клавиш
  • Незаметен для антивирусов
  • Запись разговора по микрофону (в Pro-версии, за $80)
  • Запись видео веб-камеры – (в Pro-версии, за $80)

5. Kidlogger Free | Бесплатно | Win, Mac, Android & iOS


Функция родительского контроля позволяет защитить детей в киберпространстве. Вы можете узнать, с кем беседуют ваши дети по телефону или в сети, а руководитель компании с помощью такого ПО отслеживает активность сотрудников и тем самым дисциплинирует их. Это как личный автоматизированный дневник.

6. Revealer Keylogger Free | Бесплатно | Win


Revealer Keylogger Free – эффективный кейлоггер под Windows. Программа активируется при запуске операционной системы, она скрыта от глаз пользователей и защищена паролем. Но основной инструментарий – скриншоты и уведомления на почту – в бесплатной версии недоступен. Также программа не фиксирует IP-адреса.

  • Ведётся мониторинг переписки по Skype, Facebook, MSN, AOL, ICQ, AIM, GTalk и пр
  • Инструмент Keystroke Recorder записывает текст, пароли и переписку
  • Функция Password Protection не позволит сторонним людям получить доступ к программе
  • Функция скриншотов (в Pro-версии за $50)

7. Refog Free Keylogger | Бесплатно | Win


Основное преимущество Refog Free Keylogger перед конкурентами в том, что это очень простая и удобная в использовании программа. У большинства шпионских разработок слишком много функций, и технически не подкованным людям сложно в них разобраться. Но эту программу очень легко настроить, к тому же она бесплатная. Список всего того, что перехватывается логируется и записывается, настолько большой, что нет смысла все это перечислять.

Вот лишь некоторые из функций:

8. Ardamax Keylogger | $49 | Win

Ardamax Keylogger – небольшой, простой в использовании кейлоггер, который фиксирует любую активность пользователей и сохраняет данные в лог-файле. Лог-файл можно просмотреть в формате текстового документа или веб-страницы. Этот инструмент будете сообщать о любой активности на ПК в ваше отсутствие.

  • Запись нажатых клавиш: под этим подразумевается учет всех нажатий, набранных паролей, в т.ч. скрытых символов
  • История посещений сайтов. Фиксируются все открытые сайты во всех браузерах
  • Запись веб-камеры. Периодически делаются скриншоты и сохраняются в логе
  • Отправка логов на почту. Кейлоггер может в установленное время отсылать на почту записанные логи, что очень удобно для удаленного мониторинга
  • Запись по микрофону. Запись голоса по микрофону с сжатием аудиофайла в режиме реального времени
  • Визуальное наблюдение. Периодически делаются скриншоты, и файлы сохраняются в логе
  • Мониторинг чатов. Ardamax Keylogger разработан для записи и мониторинга обоих участников разговора в таких чатах, как AIM, Windows Live Messenger, ICQ, Skype, Yahoo Messenger, Google Talk, Miranda и QiP

9. Actual Keylogger | $60 | Win


Actual Keylogger – программа, которая отслеживает активность на компьютере и позволяет узнать, что другие пользователи делают в ваше отсутствие. Это ПО мониторит открытые или закрытые программы, посещаемые веб-сайты и все нажатия клавиш, делает скриншоты и копирует контент в буфер.

  • Информация о запущенных и закрытых приложениях
  • Логирование нажатых клавиш
  • Любая активность, связанная с печатью документов
  • История веб-сайтов в браузерах
  • Скриншоты экрана в установленное время
  • Зашифрованные файлы любой активности

10. Iwantsoft Free Keylogger | Win


Iwantsoft Free Keylogger целенаправленно отслеживает любую активность на компьютере: фиксируются нажатия клавиш, контент в буфере системы, логируется активность в программах, отслеживается история сайтов в браузерах, есть функция скриншотов – чтобы сделать вывод о продуктивности сотрудников. Программа подходит для использования как на работе, так и дома. Родители с ее помощью могут узнать о потенциальных угрозах для своих детей, а для работодателей это возможность обезопасить себя от информационных утечек.

  • Работа в фоновом режиме – кейлоггер все время остается невидимым для пользователей, и только установщик программы может нажать специальное сочетание клавиш и вписать пароль, чтобы кейлоггер вновь был заметен
  • Фильтры и уведомления – блокируются все нежелательные приложения и сайты. Вы можете получать моментальные уведомления на почту, когда пользователь вписывает специфические ключевые фразы

Почему стоит установить программу-кейлоггер?

Компьютеры используются для развлечения, образования и коммуникации, но в руках злоумышленников они превращаются в опасный инструмент. Например, люди с недобрыми намерениями могут общаться с детьми в интернете.

В свою очередь, сотрудники компаний могут копировать секретную информацию, торговые секреты, ноу-хау, или же просто бездействовать в то время, когда от них ожидают напряженной работы. Кейлоггер своевременно сообщит обо всех этих событиях. В частности, такие программы очень удобны для отслеживания работы фрилансеров.

Читайте также: