一种基于内联函数分析的内核函数动态定位方法技术

技术编号:36165944 阅读:18 留言:0更新日期:2022-12-31 20:15
本发明专利技术公开了一种基于内联函数分析的内核函数动态定位方法,通过分析已有内核版本的源代码为未导出内核函数建立内核函数依赖库及内联函数特征库,在内核模块加载过程中对于存在内联函数代码的未导出内核函数采用内联函数代码动态构建未导出内核函数的代码区域,对于不存在内联函数代码的未导出内核函数则根据内核函数依赖库迭代查找未导出内核函数的内核地址,从而在不修改内核代码、不依赖内核函数的情况下实现了运行时的未导出内核函数的内核地址的动态获取。数的内核地址的动态获取。

【技术实现步骤摘要】
一种基于内联函数分析的内核函数动态定位方法


[0001]本专利技术属于计算机
,具体涉及一种基于内联函数分析的内核函数动态定位方法。

技术介绍

[0002]Linux内核用来管理软件发出的数据I/O(输入与输出)要求,将这些要求转译为数据处理的指令,交由中央处理器(CPU)及计算机中其他电子组件进行处理,是操作系统中最基本的部分。内核函数一般指内核支持函数,又称例程,是指只能在内核模式下调用的例程或子程序,目的是保证内核支持函数不被用户程序破坏。
[0003]编写Linux内核模块时往往需要使用其他模块提供的内核函数,从Linux 2.6版本内核开始引入了导出符号的机制,只有在内核中使用EXPORT_SYMBOL或EXPORT_SYMBOL_GPL导出的符号才能在内核模块中被直接使用。由于Linux系统版本间的差异性等问题,并不是所有内核函数都存在与之对应的导出符号,例如,在3.8.0版本的内核中内核函数do_page_fault就未被导出,这就会导致内核模块加载失败。
[0004]现有的获取Linux内核未导出符号的方式主要包括:修改Linux内核、使用kallsyms_lookup_name读取、读取/boot/System.map

<kernel

version>后再使用内核模块参数传入内核模块及读取/proc/kallsyms后再使用内核模块参数传入内核模块等,然而,由于某些内核文件不支持被修改或是依赖的函数本身也未被导出等问题,在内核模块运行过程中上述方法的有效性均存在一定的局限。

技术实现思路

[0005]有鉴于此,本专利技术提供了一种基于内联函数分析的内核函数动态定位方法,能够实现运行时的未导出内核函数内核地址的动态获取。
[0006]本专利技术提供的一种基于内联函数分析的内核函数动态定位方法,具体包括以下步骤:步骤1、根据Linux内核版本源代码,建立未导出内核函数的内核函数依赖库,对于存在内联可能的未导出内核函数建立内联函数特征库,其中,内核函数依赖库保存由多个具有调用关系的函数节点组成的、起点为已导出内核函数且终点为未导出内核函数的函数调用关系,函数节点采用函数名及被调用位次表示,被调用位次是指该函数节点在上级函数节点中第一次被调用时在上级函数节点的所有函数调用中的排序;内联函数特征库保存与未导出内核函数相关的内联函数代码;步骤2、加载包含未导出内核函数的内核模块,查找内联函数特征库,若存在未导出内核函数的记录且记录为二元组,则执行步骤3;若存在未导出内核函数的记录且记录为四元组,则获取所有包含未导出内核函数的四元组执行步骤4;若不存在未导出内核函数的记录,则执行步骤5;步骤3、将内联函数代码的长度记为CodeLength;动态申请大小为MemoryLength字
节、起始地址为CodeAddress的内存,且将该内存的权限设置为可读写与可执行,其中,MemoryLength的取值为CodeLength与设定偏移量之和;在CodeAddress地址处写入与函数入口初始化操作相关的二进制代码,该二进制代码的长度为FunctionEntryCodeLength,执行函数入口的初始化操作,再将内联函数代码复制到CodeAddress+FunctionEntryCodeLength地址处,在内联函数代码后写入函数返回指令;将CodeAddress作为未导出内核函数的内核地址,结束本流程;步骤4、获取四元组中的已导出内核函数的内核地址,采用所有四元组中的内联函数代码逐一与已导出内核函数的当前二进制代码进行代码匹配,选取具有最高相似度的内联函数代码作为未导出内核函数的内联函数代码,执行步骤3;步骤5、查找内核函数依赖库得到未导出内核函数相关的函数调用关系,从函数调用关系中起点位置的已导出内核函数的内核地址处开始执行反编译,再根据函数节点中的调用位次依次获取下级函数节点的内核地址,直至获取未导出内核函数的内核地址,结束本流程。
[0007]进一步地,所述步骤1中所述函数调用关系为:采用有向图表示,有向图中的节点表示函数节点,有向图中的有向边表示函数间的调用关系。
[0008]进一步地,所述步骤1中所述对于存在内联可能的未导出内核函数建立内联函数特征库的过程,包括以下步骤:步骤1.1、在Linux内核版本源代码中,若存在已导出内核函数对未导出内核函数的调用,则执行步骤1.2;若调用未导出内核函数的内核函数为未导出内核函数,则执行步骤1.5;步骤1.2、选取编译优化选项,编译调用了未导出内核函数的已导出内核函数所在的代码文件得到目标文件;步骤1.3、对步骤1.2中得到的目标文件进行反编译,确定未导出内核函数的调用处是否为调用语句,如果是则执行步骤1.4;如果不是则获取未导出内核函数的内联函数代码,将由未导出内核函数、已导出内核函数、编译优化选项及内联函数代码组成的四元组作为内联函数特征保存到内联函数特征库中,执行步骤1.4;步骤1.4、若未遍历编译优化选项,则更换编译优化选项执行步骤1.2;否则结束当前流程;步骤1.5、选取编译优化选项,编译调用了未导出内核函数的内核函数所在的代码文件生成目标文件;步骤1.6、对步骤1.5中得到的目标文件进行反编译,确定未导出内核函数的调用处是否为调用语句,如果是则执行步骤1.7;如果不是则获取未导出内核函数的内联函数代码,将由未导出内核函数及内联函数代码组成的二元组作为内联函数特征保存到内联函数特征库中,执行步骤1.7;步骤1.7、若未遍历编译优化选项,则更换编译优化选项执行步骤1.5;否则结束当前流程。
[0009]进一步地,所述步骤3中所述将CodeAddress作为未导出内核函数的内核地址之后将CodeAddress地址对应内存的权限设置为可读与可执行。
[0010]进一步地,所述步骤3中的所述设定偏移量为256字节。
[0011]进一步地,所述编译优化选项为:
“‑
O”、
“‑
O1”、
“‑
O2”、
“‑
O3”或
“‑
Ofast”。
[0012]有益效果:本专利技术通过分析已有内核版本的源代码为未导出内核函数建立内核函数依赖库及内联函数特征库,在内核模块加载过程中对于存在内联函数代码的未导出内核函数采用内联函数代码动态构建未导出内核函数的代码区域,对于不存在内联函数代码的未导出内核函数则根据内核函数依赖库迭代查找未导出内核函数的内核地址,从而在不修改内核代码、不依赖内核函数的情况下实现了运行时的未导出内核函数的内核地址的动态获取。
具体实施方式
[0013]下面列举实施例,对本专利技术进行详细描述。
[0014]本专利技术提供的一种基于内联函数分析的内核函数动态定位方法,包括以下步骤:步骤1、确定需要使用的未导出内核函数,根据已公开的Linux内核版本源代码,建立未导出内核函数的内核函数依赖库,对于存在内联可能的未导出内核函数建立内联函数特征库,其本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种基于内联函数分析的内核函数动态定位方法,其特征在于,具体包括以下步骤:步骤1、根据Linux内核版本源代码,建立未导出内核函数的内核函数依赖库,对于存在内联可能的未导出内核函数建立内联函数特征库,其中,内核函数依赖库保存由多个具有调用关系的函数节点组成的、起点为已导出内核函数且终点为未导出内核函数的函数调用关系,函数节点采用函数名及被调用位次表示,被调用位次是指该函数节点在上级函数节点中第一次被调用时在上级函数节点的所有函数调用中的排序;内联函数特征库保存与未导出内核函数相关的内联函数代码;步骤2、加载包含未导出内核函数的内核模块,查找内联函数特征库,若存在未导出内核函数的记录且记录为二元组,则执行步骤3;若存在未导出内核函数的记录且记录为四元组,则获取所有包含未导出内核函数的四元组执行步骤4;若不存在未导出内核函数的记录,则执行步骤5;步骤3、将内联函数代码的长度记为CodeLength;动态申请大小为MemoryLength字节、起始地址为CodeAddress的内存,且将该内存的权限设置为可读写与可执行,其中,MemoryLength的取值为CodeLength与设定偏移量之和;在CodeAddress地址处写入与函数入口初始化操作相关的二进制代码,该二进制代码的长度为FunctionEntryCodeLength,执行函数入口的初始化操作,再将内联函数代码复制到CodeAddress+FunctionEntryCodeLength地址处,在内联函数代码后写入函数返回指令;将CodeAddress作为未导出内核函数的内核地址,结束本流程;步骤4、获取四元组中的已导出内核函数的内核地址,采用所有四元组中的内联函数代码逐一与已导出内核函数的当前二进制代码进行代码匹配,选取具有最高相似度的内联函数代码作为未导出内核函数的内联函数代码,执行步骤3;步骤5、查找内核函数依赖库得到未导出内核函数相关的函数调用关系,从函数调用关系中起点位置的已导出内核函数的内核地址处开始执行反编译,再根据函数节点中的调用位次依次获取下级函数节点的内核地址,直至获取未导出内核函数的内核地址,结束本流程。2.根据权利要求1所述的内核函数动态定位方法,其特征在于,所述步骤1中所述函数调用关系为:采用...

【专利技术属性】
技术研发人员:温研
申请(专利权)人:北京麟卓信息科技有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1