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