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

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

实验环境:

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
在这里插入图片描述
之所以出现日志的变化是因为

在这里插入图片描述

热门文章

暂无图片
编程学习 ·

数据结构学习笔记-队列长度的计算

1.通用计算公式:l=(rear-front+n)%n其中:l为当前队列的长度rear为队列尾指针front为队列头指针n为队列可容纳的元素总数(即队列大小)2.公式解析队列中存在一种特殊情况:循环队列,一般定义循环队列的头指针front和尾指针rear均指向队列下标为0的位置,此时front=rear&…
暂无图片
编程学习 ·

Guns V4.0中的代码生成的使用

Guns V4.0的生成代码功能1.创建需要用的表,并在数据库中生成2.点击Guns中的代码生成3.运行生成的sql4.权限配置5.End 1.创建需要用的表,并在数据库中生成 创建自己的表 DROP TABLE IF EXISTS `book`; CREATE TABLE `book` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 主键…
暂无图片
编程学习 ·

Qt QTreeWidget的级联选中

在使用QTreeWidget显示文件树时,需要对树的节点做一些功能的限制:勾选某一节点时,该节点的子项自动全部选中 子项部分勾选时,父节点状态为部分勾选 子项全部勾选时,父节点自动设置勾选首先,查看了Qt文档,发现竟然没有提供这个功能,所以自己写了一个简单的例子。 先看效…
暂无图片
编程学习 ·

【图像处理】A Skinned Multi-Person Linear Model(SMPL)浅解析

【图像处理】A Skinned Multi-Person Linear Model(SMPL)浅解析SMPL的原理结语 SMPL的原理首先,博主不做3D建模的工作(尽管这项工作真的很酷),学习blender也仅是出于兴趣,因此,这篇博文中对SMPL模型的理解会有部分不足,内容仅供参考。《SMPL: A Skinned Multi-Person …
暂无图片
编程学习 ·

云原生已来,只是分布不均

作者 | 右京 阿里云交付专家 **导读:**云原生是什么?相信不同的人有不同的认识和解读。本文结合大家的各种讨论及项目实践经验,从交付的角度,分享阿里交付专家对云原生的理解,阐述如何构建云原生应用,云原生有哪些关键技术,以及关于云原生落地的思考。 前言 Internet 改…
暂无图片
编程学习 ·

C语言判断大小端

大小端介绍 中央处理器(CPU:CentralProcessingUnit)和微处理器(MCU:MicrocontrollerUnit)中的存储单元都有存储单元,用来存放程序代码中申请的变量(存在栈区),CPU/MCU的最小存储单元是一1个字节(1Byte)即8bit。 C语言中有多种变量类型如:char(8bit)、short(16bit)、…
暂无图片
编程学习 ·

自定义注解,并通过注解进行数据库建表

1、自定义注解 1.1、这个注解用来指定表名 // An highlighted block package test.annotation;import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;@Target(…
暂无图片
编程学习 ·

C#读取csv数据隔行读取异常问题

##CSV隔行读取 读取代码 StreamReader sd = new StreamReader(SavePath, Encoding.Default); sting stringLine=""; while (sd.ReadLine()!=NULL)//此处已读取一行,但未赋值{stringLine = sd.ReadLine(); }应修改为 while (sd.Peek()>0)//此处已读取一行,但未赋…
暂无图片
编程学习 ·

代码优化

也许有人会感觉CR没有什么卵用,只要我代码实现了功能,我完成了开发任务,我就OK了,为啥还要CR??但是CR真的是有必要的,你不仅可以发现自己代码中的不足之处,待优化点,简洁明了的代码易读别人接手也会很快。1. 比如在vue项目中只有某一个组件用某一个特别长的常量对象,…
暂无图片
编程学习 ·

【Java】--CyclicBarrier的介绍及应用

CyclicBarrier 简介 CyclicBarrier是java.util.concurrent包下的一个类,CyclicBarrier的字面意思是 可循环(Cyclic) 使用的 屏障(Barrier) 。 CyclicBarrier能让一组线程到达一个屏障(也可叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会打开,所有被屏障拦截的线…
暂无图片
编程学习 ·

数的范围

给定一个按照升序排列的长度为n的整数数组,以及 q 个查询。 对于每个查询,返回一个元素k的起始位置和终止位置(位置从0开始计数)。 如果数组中不存在该元素,则返回“-1 -1”。 输入格式 第一行包含整数n和q,表示数组长度和询问个数。 第二行包含n个整数(均在1~10000范围…
暂无图片
编程学习 ·

技术人员的赚钱之道:开篇

摘要:大多数技术人员有一个天然的短板,就是把太多的精力放在技术本身上,容易忽略了周边的人,容易忽略了身边的赚钱机会,随着技术的更新迭代,随着年龄的增长,便逐渐远离时代,逐渐丧失原本拥有的优势。但同时技术人员也有自身一个天然的强项:踏踏实实做事,有一技之长。…
暂无图片
编程学习 ·

PCA(1):基础知识介绍

PCA算法思路:首先利用样本集及特征构建一个样本矩阵,然后利用样本矩阵计算得到一个协方差矩阵,再计算协方差矩阵的特征值和特征向量,保留特征值前k个大的对应的特征向量作为新的维度方向,再将原始样本数据转换到新的空间维度。(他非常巧妙地利用协方差矩阵来计算出样本集…
暂无图片
编程学习 ·

操作系统复习概要

题型:选择题 11题*2分 基本概念以及数据结构 名词解释 5题*3分 解答题 5题*5分 问答与计算题 12 13 13 分5 6 9 11非标准试题1了解:计算机系统的状态——CPU用户态,系统态,状态、概念以及引入原因用户态:一些内存区域受到保护;特权指令不能执行 系统态:受保护的内存区域…
暂无图片
编程学习 ·

AS5245磁性角度传感器

官网:https://ams.com/zh/angle-position-on-axis 1.无接触0-360绝对角度输出 2.冗余设计,提高稳定性 3.12位分辨率 4.可编程零位标定 5.磁铁对齐检测和电源检测 6.带有z轴方向磁铁强度输出(红黄绿三种模式) 7.角度输出类型:SSI,PWM,ABI 8.耐温:-40-150 9供电:3.3v/5v一…
暂无图片
编程学习 ·

Python+爬虫 学习笔记

requests模块requests模块是python中原生的一款基于网络请求的模块,功能非常强大,简单便捷,效率极高。作用:模拟浏览器发请求。编码流程:指定url——发起请求——获取响应数据——持久化存储基于requests模块的get请求:#爬取搜狗首页的页面数据 import requestsif __name…
暂无图片
编程学习 ·

计算机知识(持续更新中)

1.windows系统下,可在终端使用命令行生成指定大小的文件: (1)运行→cmd→进入终端页面 (2)进入需要存放生成文件的目录中,例如进入E盘,则输入e:(3)然后输入fsutil file createnew 文件名+类型 字节大小,其中1k=1024字节。 例如:fsutil file createnew test.txt 51…