CN104021023A - 一种突破内核模块版本控制解决方法 - Google Patents
一种突破内核模块版本控制解决方法 Download PDFInfo
- Publication number
- CN104021023A CN104021023A CN201410284719.2A CN201410284719A CN104021023A CN 104021023 A CN104021023 A CN 104021023A CN 201410284719 A CN201410284719 A CN 201410284719A CN 104021023 A CN104021023 A CN 104021023A
- Authority
- CN
- China
- Prior art keywords
- file
- kernel module
- elf
- kernel
- module
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Landscapes
- Stored Programmes (AREA)
Abstract
本发明提供一种突破内核模块版本控制解决方法,根据要加载内核模块的环境修改elf内核模块的header信息,其具体实现过程为:首先打开elf文件,通过mmap将其映射到内存中,通过索引index搜索segment结构中的函数符号表,查找“__versions”的字段,该字段包括所有引用函数的符号表的值,并通过修改为当前内核symvers中的值,来使模块合法化。该一种突破内核模块版本控制解决方法和现有技术相比,支持多个版本,跳出内核检测带来的局限性,突破其限制,实用性强,适用范围广泛,易于推广。
Description
技术领域
本发明涉及计算机技术领域,具体的说是一种突破内核模块版本控制解决方法。
背景技术
随着Linux的蓬勃发展和普及,深入开发内核技术人员越来越多,使Linux内核技术发展很快,升级很快,Linux内核版本很多, 2个小内核版本中内核函数的定义可能都不一样,为了确保不一致的驱动程序导致kernel oops,开发者加入了模块验证机制。它在加载内核模块的时候对模块进行校验,如果模块与主机的一些环境不一致,就会加载不成功,这就极大局限了驱动模块的通用性,而且每一次内核版本不一致都要从新编译,这是一个非常琐碎的事情,这样反而带来了***功能升级的局限性。
面对Linux未来美好的前景,很多公司加入了开发Linux的项目或产品,面对于商业公司,他们都有以二进制方式出售产品,但是客户的环境***。例如:Linux 2.6.32 kernel内核版本,就有几个升级版本,如果我们想把模块添加到所有的2.6.32 版本上,我们必须要在所有版本上进行编译,这样才能添加成功,因为校验的初衷就是某些数据结构和某些函数发生变化,而进行的校验的,但是我们开发的模块不依赖或者所依赖的数据结构和函数都是确定的,没有发生变化,我们就应该去掉繁琐的编译,这样达到一次编译,支持多个版本,我们就应该跳出内核检测带来的局限性,突破这样的限制,使我们的驱动和应用层一样,具有更好的平台支持性,打破因为客户环境小小的差异带来的产品局限性。基于此,现提供一种突破内核模块版本控制解决方法。
发明内容
本发明的技术任务是解决现有技术的不足,提供一种实用性强、突破内核模块版本控制解决方法。
本发明的技术方案是按以下方式实现的,该一种突破内核模块版本控制解决方法,根据要加载内核模块的环境修改elf内核模块的header信息,其具体实现过程为:
首先打开elf文件,通过mmap将其映射到内存中,通过索引index搜索segment结构中的函数符号表,查找“__versions”的字段,该字段包括所有引用函数的符号表的值,并通过修改为当前内核symvers中的值,来使模块合法化。
所述解决过程的详细步骤为:
一、获取当前***对应运行的symvers文件,打开symvers文件;
二、打开当前驱动elf文件,mmap映射到内存中;
三、校验文件的合法性;
四、查找内核模块头header中的__versions的地址;
五、将所有引用函数的crc的值通过查找symvers进行更新;
六、替换完成,保存文件,关闭操作;
七、insmod 加载模块。
所述步骤三中校验文件的合法性的步骤为:
检测驱动elf文件格式,是否是驱动文件;
检测驱动elf文件,是64bit还是32bit。
本发明与现有技术相比所产生的有益效果是:
本发明的一种突破内核模块版本控制解决方法不用从新编译内核模块来达到内核模块的成功,实现一次编译,保证***稳定;通过symvers动态更新模块的“__versions”的字段的函数值,来突破内核加载时的检测;支持多个版本,跳出内核检测带来的局限性,突破其限制,实用性强,适用范围广泛,易于推广。
附图说明
附图1是本发明的实现示意图。
具体实施方式
下面结合附图对本发明的一种突破内核模块版本控制解决方法作以下详细说明。
本发明的目的在于提供突破内核模块版本控制解决方法,根据新内核中的函数信息更新内核模块中elf的header的函数符号表值来实现。基于此,如附图1所示,现提供一种突破内核模块版本控制解决方法,根据要加载内核模块的环境修改elf内核模块的header信息,即获取当前运行的***符号表;将驱动elf文件打开,更新为新的符号文件。
在开发的模块不依赖或者所依赖的数据结构和函数都是确定的,没有发生变化前提下,我们就应该去掉繁琐的编译,这样达到一次编译,支持多个版本,我们就应该跳出内核检测带来的局限性,突破这样的限制。基于此,本方法的具体实现过程为:
首先打开elf文件,通过mmap将其映射到内存中,通过索引index搜索segment结构中的函数符号表,查找“__versions”的字段,该字段包括所有引用函数的符号表的值,并通过修改为当前内核symvers中的值,来使模块合法化。
所述解决过程的详细步骤为:
1)获取当前运行的symvers,如:/boot/symvers-2.6.18-92.el5PAE。
2)将驱动elf文件打开,mmap映射到内存中。
3)检测驱动elf文件格式,是否是驱动文件。
4)检测驱动elf文件,是64bit还是32bit。
5)查找内核模块头header中的__versions的地址。
6)将所有引用函数的crc的值通过查找symvers进行更新。
7)替换完成,保存文件,关闭操作。
8)insmod 加载模块。
实施例:
在实际应用中,模块版本结构如下所示:
struct modversion_info
{
unsigned long crc;
char name[MODULE_NAME_LEN];
}。
elf数据结构采用32位bit时:
typedef struct
{
unsigned char e_ident[EI_NIDENT]; /* Magic number and other info */
Elf32_Half e_type; /* Object file type */
Elf32_Half e_machine; /* Architecture */
Elf32_Word e_version; /* Object file version */
Elf32_Addr e_entry; /* Entry point virtual address */
Elf32_Off e_phoff; /* Program header table file offset */
Elf32_Off e_shoff; /* Section header table file offset */
Elf32_Word e_flags; /* Processor-specific flags */
Elf32_Half e_ehsize; /* ELF header size in bytes */
Elf32_Half e_phentsize; /* Program header table entry size */
Elf32_Half e_phnum; /* Program header table entry count */
Elf32_Half e_shentsize; /* Section header table entry size */
Elf32_Half e_shnum; /* Section header table entry count */
Elf32_Half e_shstrndx; /* Section header string table index */
} Elf32_Ehdr;
elf数据结构采用64位bit时:
typedef struct
{
unsigned char e_ident[EI_NIDENT]; /* Magic number and other info */
Elf64_Half e_type; /* Object file type */
Elf64_Half e_machine; /* Architecture */
Elf64_Word e_version; /* Object file version */
Elf64_Addr e_entry; /* Entry point virtual address */
Elf64_Off e_phoff; /* Program header table file offset */
Elf64_Off e_shoff; /* Section header table file offset */
Elf64_Word e_flags; /* Processor-specific flags */
Elf64_Half e_ehsize; /* ELF header size in bytes */
Elf64_Half e_phentsize; /* Program header table entry size */
Elf64_Half e_phnum; /* Program header table entry count */
Elf64_Half e_shentsize; /* Section header table entry size */
Elf64_Half e_shnum; /* Section header table entry count */
Elf64_Half e_shstrndx; /* Section header string table index */
} Elf64_Ehdr。
以上实施方式仅用于说明本发明,而并非对本发明的限制,有关技术领域的普通技术人员,在不脱离本发明的精神和范围的情况下,还可以做出各种变化和变型,因此所有等同的技术方案也属于本发明的范畴,本发明的专利保护范围应由权利要求限定。
Claims (3)
1.一种突破内核模块版本控制解决方法,其特征在于根据要加载内核模块的环境修改elf内核模块的header信息,其具体实现过程为:
首先打开elf文件,通过mmap将其映射到内存中,通过索引index搜索segment结构中的函数符号表,查找“__versions”的字段,该字段包括所有引用函数的符号表的值,并通过修改为当前内核symvers中的值,来使模块合法化。
2.根据权利要求1所述的一种突破内核模块版本控制解决方法,其特征在于:所述解决过程的详细步骤为:
一、获取当前***对应运行的symvers文件,打开symvers文件;
二、打开当前驱动elf文件,mmap映射到内存中;
三、校验文件的合法性;
四、查找内核模块头header中的__versions的地址;
五、将所有引用函数的crc的值通过查找symvers进行更新;
六、替换完成,保存文件,关闭操作;
七、insmod 加载模块。
3.根据权利要求2所述的一种突破内核模块版本控制解决方法,其特征在于:所述步骤三中校验文件的合法性的步骤为:
检测驱动elf文件格式,是否是驱动文件;
检测驱动elf文件,是64bit还是32bit。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410284719.2A CN104021023A (zh) | 2014-06-24 | 2014-06-24 | 一种突破内核模块版本控制解决方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410284719.2A CN104021023A (zh) | 2014-06-24 | 2014-06-24 | 一种突破内核模块版本控制解决方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN104021023A true CN104021023A (zh) | 2014-09-03 |
Family
ID=51437795
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410284719.2A Pending CN104021023A (zh) | 2014-06-24 | 2014-06-24 | 一种突破内核模块版本控制解决方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104021023A (zh) |
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105183530A (zh) * | 2015-11-03 | 2015-12-23 | 浪潮(北京)电子信息产业有限公司 | 基于k-unix内核的模块加载方法及*** |
WO2016091071A1 (zh) * | 2014-12-11 | 2016-06-16 | 北京奇虎科技有限公司 | 加载Linux内核驱动的方法及装置 |
WO2016091078A1 (zh) * | 2014-12-11 | 2016-06-16 | 北京奇虎科技有限公司 | 在Linux驱动中绑定内核符号的方法及装置 |
CN105893085A (zh) * | 2016-03-30 | 2016-08-24 | 百度在线网络技术(北京)有限公司 | 内核模块加载方法和装置 |
CN110569068A (zh) * | 2018-06-06 | 2019-12-13 | 南通研祥智能科技有限公司 | 一种Linux驱动加载程序的方法及装置 |
CN112363726A (zh) * | 2020-11-10 | 2021-02-12 | 北京麟卓信息科技有限公司 | 一种内核模块的跨内核版本编译方法及*** |
WO2022183573A1 (zh) * | 2021-03-02 | 2022-09-09 | 长沙景嘉微电子股份有限公司 | 支持多内核版本的驱动安装包生成方法、安装方法及装置 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1650264A (zh) * | 2002-04-17 | 2005-08-03 | 计算机联合思想公司 | 用于修改一个内核模块以便在多个内核版本上运行的设备和方法 |
CN103559449A (zh) * | 2013-11-15 | 2014-02-05 | 华为技术有限公司 | 一种代码改动的检测方法及装置 |
US8745442B1 (en) * | 2011-04-28 | 2014-06-03 | Open Invention Network, Llc | System and method for hybrid kernel- and user-space checkpointing |
-
2014
- 2014-06-24 CN CN201410284719.2A patent/CN104021023A/zh active Pending
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1650264A (zh) * | 2002-04-17 | 2005-08-03 | 计算机联合思想公司 | 用于修改一个内核模块以便在多个内核版本上运行的设备和方法 |
US8745442B1 (en) * | 2011-04-28 | 2014-06-03 | Open Invention Network, Llc | System and method for hybrid kernel- and user-space checkpointing |
CN103559449A (zh) * | 2013-11-15 | 2014-02-05 | 华为技术有限公司 | 一种代码改动的检测方法及装置 |
Non-Patent Citations (1)
Title |
---|
WZT: ""突破linux内核模块验证"", 《CHINAUNIX网站》 * |
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2016091071A1 (zh) * | 2014-12-11 | 2016-06-16 | 北京奇虎科技有限公司 | 加载Linux内核驱动的方法及装置 |
WO2016091078A1 (zh) * | 2014-12-11 | 2016-06-16 | 北京奇虎科技有限公司 | 在Linux驱动中绑定内核符号的方法及装置 |
CN105183530A (zh) * | 2015-11-03 | 2015-12-23 | 浪潮(北京)电子信息产业有限公司 | 基于k-unix内核的模块加载方法及*** |
CN105893085A (zh) * | 2016-03-30 | 2016-08-24 | 百度在线网络技术(北京)有限公司 | 内核模块加载方法和装置 |
CN110569068A (zh) * | 2018-06-06 | 2019-12-13 | 南通研祥智能科技有限公司 | 一种Linux驱动加载程序的方法及装置 |
CN112363726A (zh) * | 2020-11-10 | 2021-02-12 | 北京麟卓信息科技有限公司 | 一种内核模块的跨内核版本编译方法及*** |
WO2022183573A1 (zh) * | 2021-03-02 | 2022-09-09 | 长沙景嘉微电子股份有限公司 | 支持多内核版本的驱动安装包生成方法、安装方法及装置 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN104021023A (zh) | 一种突破内核模块版本控制解决方法 | |
CN107729083B (zh) | 一种加载驱动程序的方法及嵌入式设备 | |
US8725702B1 (en) | Systems and methods for repairing system files | |
CN103797436B (zh) | 用于计算装置的动态电力优化 | |
US9311119B2 (en) | Reconfiguring virtual machines | |
US9244679B1 (en) | Systems and methods for automatically identifying changes in deliverable files | |
TWI715762B (zh) | 虛擬機器創建方法和裝置 | |
CN105335137A (zh) | 用于处理源文件的方法和装置 | |
CN105453037A (zh) | 维持用于更新的已知相关性 | |
CN107346284B (zh) | 一种应用程序的检测方法及检测装置 | |
CN105760184A (zh) | 一种加载组件的方法和装置 | |
CN104516678A (zh) | 用于数据存储的方法和设备 | |
CN104079613A (zh) | 用于多租户间共享应用程序对象的方法和*** | |
US20120246632A1 (en) | Device Flags | |
US9032401B2 (en) | Virtual computer system having a first virtual computer that executes a protected process, a second virtual computer that executes an unprotected process, and a hypervisor that controls the first and second virtual computers | |
CN108279947A (zh) | 金融自助设备sp安装包适配的方法及装置 | |
CN102331945A (zh) | 基于电子商店的应用程序管理方法 | |
US10346157B2 (en) | Patch infrastructure for ROM firmware | |
US8938722B2 (en) | Identifying errors using context based class names | |
CN103440146A (zh) | 一种基于云存储的更新bios的方法 | |
US8793661B1 (en) | Programmer specified conditions for raising exceptions and handling errors detected within programming code | |
US11416614B2 (en) | Statistical detection of firmware-level compromises | |
US20130198716A1 (en) | Configuration file compatibility | |
CN103577200A (zh) | 更新服务器的方法 | |
CN105550050A (zh) | 硬件通信的方法及装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
WD01 | Invention patent application deemed withdrawn after publication |
Application publication date: 20140903 |
|
WD01 | Invention patent application deemed withdrawn after publication |