操作系统——内核模块的键盘监控

    技术2022-07-11  86

    操作系统——内核模块的键盘监控

    实验环境:

    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 之所以出现日志的变化是因为

    Processed: 0.020, SQL: 9