`
totoxian
  • 浏览: 1030581 次
  • 性别: Icon_minigender_2
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

linux内核模块的版本检查机制

 
阅读更多

linux内核对插入的内核模块进行严格的版本检查,即使一个小版本号不一致也会导致加载的不成功,这完全是为了内核本身运行安全。由于linux内核的发布是基于版本号的,而所有的内核模块的开发必须依赖内核头文件--其使用的内核导出符号均在头文件中,该头文件肯定属于一个特定版本的源码树,因此模块也就间接依赖了该版本的源码树。那么到底为何内核对模块的版本检查如此严格呢?因为每当一个新的版本发布,可能导致接口的改变,如果不严格检查版本则可能导致内核crash,然而如果旧版本的模块难道没有任何办法载入到新版本的内核中吗?不是的!只要它使用的接口在两个版本间没有改变即可,这是通过一个非常有意思的机制实现的,这就是单独接口符号的crc校验机制。其实windows的ddk编译的驱动要想载入内核而不发生意外,接口的一致性也是必要的,只是ddk的编译环境为开发者屏蔽了很多版本方面的信息,第一,ddk自带了头文件并且windows的内核无法单独进行下载,它是和操作系统一起被发行的;第二,操作系统的内核,库,ddk是由微软统一管理的。因此,我们会觉得ddk编译出的驱动对系统版本没有要求,其实这是不对的,在ddk的Build Environments中,不是也有版本之分别吗?只是它的版本没有linux那么多罢了!
首先要知道,内核中只要是EXPORT的符号,都会有一个crc校验码,这些校验码保存在内核映像中,这些校验码用于和载入内核的模块中包含的crc校验码作比较。模块编译的过程中,genksyms这个程序起了很大的作用,其实编译模块最终的结果--一个ko文件并不仅仅是你的模块源代码c文件经过编译器和链接器处理过后的结果,而是被genksyms插入了一些额外的数据,就是这些数据作为版本控制的依据起了很大的作用。简单来说就是genksyms分析模块源代码文件(编译预处理后的),将其中使用的函数,变量等抽出来,然后再为这些函数,变量中的每一个生成一个crc校验码,生成校验码输入就是函数的名称,参数类型以及变量的名称,类型等,然后这些crc校验和被写入一个.mod.c文件中,最终编译器和链接器将这个.mod.c文件和源代码文件一起编译和链接,最终生成的ko中就包含了这些由genksyms生成的crc校验和。
当模块加载的时候,内核会逐一的抽出ko模块中的每一个符号以及其对应的crc校验码,然后和内核本身保存的该符号的crc校验码做比较,只要有一个符号的crc校验码不同就说明该模块的版本不正确,因为如果该模块确实是在当前内核版本下编译的,那么其符号的crc校验码将会和内核本身相应符号的crc校验码一致,毕竟它们的算法一样,输入信息也一样。
以上的这种机制可以被用作一种动态的版本控制,比如动态链接库的版本控制,这样可以减轻库混乱带来的危害,我们需要作的仅仅是为每一个动态库生成一个类似.mod.c的文件,姑且称为.version.c,这个文件中包含所有引用接口的crc校验码以及引用接口本身,然后修改动态库的加载机制,增加版本检查相关的逻辑,也就是一个crc比对的逻辑。

分享到:
评论

相关推荐

    突破Linux内核模块校验机制

    突破Linux内核模块校验机制 突破Linux内核模块校验机制

    Linux内核可装载模块对设备驱动的影响

    本文针对2.6内核里模块机制的改变对编写设备驱动程序的影响,从内核模块的编译、装载时的版本检查、初始化与退出、模块使用计数、输出内核符号、命令行输入参数、许可证声明等方面比较了2.4与2.6内核的区别;...

    边干边学——LINUX内核指导

    第1章 了解Linux内核 1. 1 Linux内核 1. 2 查看Linux内核状况 1. 3 编程序检查系统状况 1. 4 Linux编程环境 第2章 shell 2. 1 she11 2. 2 实现一个简单的shell程序 2. 3 shell编程 第3章 内核时钟 3. 1 关于时钟和...

    边干边学Linux__第二版_doc格式

    9.6 了解Linux内核的启动 9.7 应用grub配置启动文件 9.8 编写制作Linux启动盘的shell脚本程序 9.9 Linux源程序的目录分布 9.10 学习Linux的常用工具 9.11 查看Linux内核状况 9.12 编程序检查系统状况 9.13 Linux编程...

    linux系统漏洞加固

    5.1 检查是否使用PAM认证模块禁止wheel组之外的用户su为root(高危) 5.2 检查是否设置命令行界面超时退出(高危) 5.3 检查是否关闭不必要的服务和端口(高危) 5.4 检查是否关闭系统信任机制(高危) 5.5 检查...

    RED HAT LINUX 6大全

    本书全面系统地介绍了Red Hat Linux 6。全书共分为五个部分,包括35章和四个附录。第一部分为Red Hat Linux的介绍和安装;第二部分为服务配置;第三部分为系统管理;第四部分为Linux编程;第五部分为附录。本书内容...

    基于Linux 的防火墙技术研究

    内核模块有三种办法与进程打交道:首先 是系统调用;第二种办法是通过设备文件;第三个办法便是使用proc 文件系统。netfilter 采用了第 一种修改系统调用的办法。ipables 在应用层调用setsockopt 进入内核,然后调用...

    安卓java发送qq邮件完整源码-Hyperledger-Fabric-v0.6:Hyperledgerfabric0.6代码解析

    1、docker要求Linux内核版本不低于 3.10 检查Linux的内核版本,如果内核版本太低,升级内核 查看内核的版本命令 uname -a 2、根据不同的Ubuntu版本安装docker 查看Ubuntu版本命令 lsb_release -a 3、对于16.04的...

    集群好书《高性能Linux服务器构建实战》 试读章节下载

    13.4.7 配置hangcheck-timer内核模块 13.4.8 配置系统安全设置 13.4.9 创建Oracle用户和组 13.4.10 设置Oracle用户环境变量 13.4.11 配置节点间SSH信任 13.4.12 配置共享存储系统 13.4.13 安装Oracle ...

    discuz!6.1GBK 版本论坛系统

    从创立之初即以提高产品效率为突破口,随着编译模板,语法生成内核,数据缓存和自动更新机制等独创或独有技术的应用,和坚固的数据结构及最少化数据库查询设计,使得 Discuz! 可以在极为繁忙的服务器环境下快速稳定...

    C/C++笔试题(附答案,华为面试题系列)

    Linux 支持内核级的多线程 13.C++中什么数据分配在栈或堆中,New分配数据是在近堆还是远堆中? 答:栈: 存放局部变量,函数调用参数,函数返回值,函数返回地址。由系统管理 堆: 程序运行时动态申请,new 和 malloc...

    Ubuntu权威指南(2/2)

    4.4 文件的安全保护机制 101 4.4.1 显示文件的访问权限 102 4.4.2 修改文件的访问权限 103 4.4.3 设置文件的访问权限 104 4.4.4 其他访问权限设置 106 第5章 文件和目录操作 107 5.1 创建文件 108 5.2 显示文件列表 ...

    Ubuntu权威指南(1/2)

    4.4 文件的安全保护机制 101 4.4.1 显示文件的访问权限 102 4.4.2 修改文件的访问权限 103 4.4.3 设置文件的访问权限 104 4.4.4 其他访问权限设置 106 第5章 文件和目录操作 107 5.1 创建文件 108 5.2 显示文件列表 ...

    UbuntuChina12

    4.4 文件的安全保护机制 101 4.4.1 显示文件的访问权限 102 4.4.2 修改文件的访问权限 103 4.4.3 设置文件的访问权限 104 4.4.4 其他访问权限设置 106 第5章 文件和目录操作 107 5.1 创建文件 108 5.2 显示文件列表 ...

    vc++ 应用源码包_1

    Linux内核完全注释附 MFC+消息循环贴图---金山毒霸界面 自绘控件实现。 MFCDemo DirectUI移植到MFC中实现。 MFCHtml 调用脚本 MFC使用COM加载WMI服务,另类获取系统服务详细 大家都知道,现在流行的检测硬件软件视...

    vc++ 应用源码包_2

    Linux内核完全注释附 MFC+消息循环贴图---金山毒霸界面 自绘控件实现。 MFCDemo DirectUI移植到MFC中实现。 MFCHtml 调用脚本 MFC使用COM加载WMI服务,另类获取系统服务详细 大家都知道,现在流行的检测硬件软件视...

    vc++ 应用源码包_6

    Linux内核完全注释附 MFC+消息循环贴图---金山毒霸界面 自绘控件实现。 MFCDemo DirectUI移植到MFC中实现。 MFCHtml 调用脚本 MFC使用COM加载WMI服务,另类获取系统服务详细 大家都知道,现在流行的检测硬件软件视...

    vc++ 应用源码包_5

    Linux内核完全注释附 MFC+消息循环贴图---金山毒霸界面 自绘控件实现。 MFCDemo DirectUI移植到MFC中实现。 MFCHtml 调用脚本 MFC使用COM加载WMI服务,另类获取系统服务详细 大家都知道,现在流行的检测硬件软件视...

    vc++ 应用源码包_3

    Linux内核完全注释附 MFC+消息循环贴图---金山毒霸界面 自绘控件实现。 MFCDemo DirectUI移植到MFC中实现。 MFCHtml 调用脚本 MFC使用COM加载WMI服务,另类获取系统服务详细 大家都知道,现在流行的检测硬件软件视...

Global site tag (gtag.js) - Google Analytics