操作系统——内核模块的键盘监控
实验环境:
VMware + Ubuntu32位
实验步骤:
1.键盘码与ASII码的对应关系。
在Linux操作系统中,键盘的输入是以键盘码的形式存在的,所以我们必然需要将其转化为可读的字符(串)形式。
于是我们构造数组:
一些不常用的或是不方便表示的输入就使用”\0”来表示。
2.键盘中断程序
叫是叫中断程序,但其实并不是一个中断,只是我们的程序和中断有些相似,也就是只有当键盘出现“按下去”这个动作,这个程序才会正常运行。
这里要注意的是,keyboard_notifier_param这个结构体的定义:
包括了5个变量,vc从备注可以看出指的是按下键盘的VC,down表示的是是否按下,shift表示的是是否按下shift键,ledstate指的应该是led灯的值(大小写提示灯),value则是指keycode键盘码了。
3.读取键盘码,并转化为可读字符
很明显,是将键盘码的值作为二维数组的地址来寻找对应字符串,并使用snprintf函数将结果保存在keybuf中。
4.将keybuf中的字符串保存到临时文件中。
这里要注意的是,这个临时文件的生成方法如下:
可以发现是在驱动装载的时候就立刻生成临时文件夹与"临时文件",而驱动卸载的时候也同时删除了这个文件。这里临时文件的含义其实是一个虚文件系统,这个文件中并不存放字符串,而是在试图读取这个文件内容时,由驱动程序定义,自动触发keyboard_read函数,将缓冲区内存放的字符串显示出来。
生成的文件目录为 /sys/kernel/debug/hizt/keyboardresult ,所以我们最终是直接查看这个文件中的内容来实施键盘监控的。
Keyboard_read函数则是将缓冲区keys_buf中的字符信息读入buffer所指向的区域,也就应该是我们的虚文件系统。
5.编写Makefile
还是比较清晰的,编译生成hztian.ko文件后,将文件加载进内核中。
6.调试
1)编译程序
$ make all
2)加载到内核
$ sudo make load
3)查看当前内核中存在的module
$ lsmod
观察是否出现了一个叫hztian的驱动
4)在命令行用键盘输入
$ hiztnb
5)查看键盘监控程序结果
sudo cat /sys/kernel/debug/hizt/keyboardresult
可以看到我们输入过的命令都有记录,连我粘贴的键盘按键都有记录:
Ctrl+shift+v
6)从内核中清除
$ sudo make unload
7)查看系统日志
$ dmesg
之所以出现日志的变化是因为