Я создал кейлоггер на C, который отображает необработанные значения ключей с устройства ввода. Мне интересно, как я могу расшифровать эти значения в символы ascii? Вот мой код на данный момент:
#include <stdio.h>
#include <fcntl.h>
#include <linux/input.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
void INThandler(){
exit(0);
}
int main()
{
char devname[] = "/dev/input/event3";
int device = open(devname, O_RDONLY);
struct input_event ev;
signal(SIGINT, INThandler);
while(1)
{
read(device,&ev, sizeof(ev));
if(ev.type == 1 && ev.value == 1){
printf("Key: %i State: %i\n",ev.code,ev.value);
}
}
}
Пример вывода:
Key: 32 State: 1
Key: 42 State: 1
Key: 29 State: 1
Я знаю, что эти значения являются порядковыми номерами для размещения клавиш на клавиатуре, а не кодами ascii, поэтому существует ли какой-то системный файл, содержащий инструкция по конвертации? Я не хочу выполнять преобразование вручную, потому что оно будет отличаться для всех клавиатурных устройств.
Спасибо, любая помощь приветствуется
Необходимо будет получить контурные карты и использовать его для перевода тех кодов, которые Вы читаете от дескриптора файла до символов ASCII, которые Вы хотите зарегистрировать.
На Ubuntu, можно получить контурную карту с командой dumpkeys
(выполненный как корень) или командой xmodmap -pke
. По некоторым причинам я еще не вполне понимаю, вывод xmodmap
, кажется, имеет смещение. Можно исправить это смещение легко, но я не знаю о том, что является причиной позади него. Возможно, это имеет отношение xmodmap
первоначально записанный для Sun Microsystems и X11 с помощью различных кодов клавиши (поскольку это, кажется, предлагается здесь ), но я просто предполагаю вслух..