本发明专利技术公开了一种获取Linux内核中数据结构偏移的方法和装置。本方法为:对于给定的包含目标Linux内核文件的N个Linux源代码版本,对每一版本的所有函数进行静态源代码分析,获取所有包含指定结构体S的指定域f的引用并且不是显式声明为内联函数的函数,并计算每一所述函数关于所述指定结构体S和所述指定域f的特征,生成一函数列表;然后依据函数声明求取N个函数列表的交集,生成跨版本的通用函数列表;然后将复杂性最低的稳定函数的部分特征作为引用向量;利用所述引用向量对目标内核文件进行分析,获得引用向量对应的函数的汇编代码中对于初始结构体S的所有域引用;依据所述引用向量中的特征获得对应的域引用确定偏移量。用向量中的特征获得对应的域引用确定偏移量。用向量中的特征获得对应的域引用确定偏移量。
【技术实现步骤摘要】
一种获取Linux内核中数据结构偏移的方法和装置
[0001]本专利技术涉及数据结构偏移获取技术,具体是通过统计多版本Linux源代码中指定结构体的指定域的通用引用函数,然后提取该函数中关于该指定结构体的指定域的特征,从而得到一种在Linux内核二进制文件中获得该域偏移值的一种特征,进而实现针对Linux操作系统内核的二进制文件指定结构体的指定域的偏移的获取。
技术介绍
[0002]内存取证和虚拟机自省技术往往都需要使用内存分析的方法获取内存中一些数据结构的地址和值,这涉及到内核中一些数据结构的关联关系,这些关联关系是以“结构体
‑
域”的形式体现的。图1展示了一个关联关系的示例,如图1(a)所示,其中task_struct结构体属于Linux内核的进程控制块(PCB)的一部分,作为进程描述符包含了进程的控制信息,如域comm[TASK_COMM_LEN]表示进程名,域pid表示进程的PID,域mm表示进程的内存描述符等。类似的,mm_struct是进程的内存描述符,域pgd是进程的页全局目录(Page Global Directory),域mmap是进程虚拟地址范围等。在源代码中,这些域以“结构体
‑
>域”或者“结构体.域”的形式进行引用,而将源代码进行编译后,在汇编代码中这种关联关系以“结构体起始地址+偏移”进行寻址和取值,如mov reg2,[reg1+offset],其中reg1保存了结构体的起始地址,偏移offset是一个立即数,在编译过程中直接写入到汇编代码中。以task_struct结构体中的域mm以及域comm[TASK_COMM_LEN]和mm_struct结构体中的域pgd为例,图1(b)描述了这种数据偏移关系。在汇编代码中,对于task_struct结构体,域mm指针相对于结构体task_struct起始地址的偏移为x,域comm[TASK_COMM_LEN]相对于结构体task_struct起始地址的偏移为y,而对于mm_struct结构体,即task_struct中的域mm,其域pgd相对于结构体mm_struct的起始地址的偏移为z。图1(c)描述了这种数据关系的内存布局。
[0003]一个域相对于结构体的偏移在编译后的Linux内核中是固定的,在内存取证和虚拟机自省技术中,依赖某些域在结构体中的偏移进行关联结构体的推断,从而获取运行时操作系统中的语义信息,然而对于Linux操作系统的不同内核二进制文件,这些偏移值是不同的。具体由以下几个原因导致:
[0004](1)不同Linux版本中数据结构调整带来的偏移不同;
[0005](2)同一个Linux版本中使用不同的config文件带来的不同数据成员,进而导致偏移不同;
[0006](3)不同版本的编译工具链的不同编译特性导致数据结构重排或者内存对齐带来的偏移不同。
[0007]当前主流的搜集数据结构的方法是在待分析的操作系统中运行一个定制的内核驱动程序,这个内核驱动程序可以输出所需要的偏移值。但是这种方法需要目标操作系统中的驱动编译环境,并且以root权限执行,对于缺乏这种条件的目标操作系统,如一些限制shell功能且缺乏源代码支持的虚拟网络设备,这种方法无法适用,往往应用逆向分析这种高度依赖人工的方法,局限也是显而易见的。
技术实现思路
[0008]为克服当前主流搜集数据结构的方法需要依赖源代码或者驱动编译及运行环境的局限性,本专利技术提供了一种获取Linux内核中数据结构偏移的方法,对于一个指定结构体指定域,通过分析多版本Linux源代码中的函数对该域的引用情况,获得对于该域的一个或者多个跨版本的引用向量,该引用向量包含了该域在一个通用函数中的代码特征。依据这个代码特征,使用静态二进制分析的方法从给定的Linux内核二进制文件中提取该域的偏移值。
[0009]本专利技术获取Linux内核中数据结构偏移的方法,包括以下步骤:
[0010]1.选定源代码版本1到源代码版本N,其中包含目标Linux内核文件的版本。
[0011]2.对于每个版本的所有函数进行静态源代码分析,对于所有包含了指定结构体指定域的引用,并且不是显式声明为inline(即内联函数)的函数,形成该版本源代码的包含了指定域引用的函数列表,并计算该函数列表中每个函数的关于指定结构体和指定域的一些特征,最终共获得N个版本的函数列表。
[0012]3.对于这些版本的函数列表,依据函数声明求取交集,从而获得一个跨版本通用的函数列表,其中所有函数在不同版本中都具有相同的声明,而且都具有对指定结构体指定域的引用。比如版本1存在符合条件的函数a,b,c;版本2存在函数a,d,e;版本N存在函数a,e,f;那么取交集之后的函数列表包含函数a,即跨版本通用的函数列表。
[0013]4.对于通用函数列表中的每个函数,筛选出在版本1到版本N中稳定的函数。
[0014]5.对于通用函数列表中的每个稳定函数,我们计算函数对于指定域引用的复杂性。
[0015]6.选择复杂性最低的函数,抽取部分特征作为引用向量,从而对于一个指定结构体的指定域,我们获得了一个从版本1到版本N都通用的引用向量。
[0016]7.注意,在步骤3中,对于某些域,如果Linux版本跨度较大,那么可能出现函数列表交集为空的情况,对于这种情况,我们会将Linux版本拆开,从而对于一个指定域,获取多个引用向量,这些引用向量会覆盖给定的版本1到版本N。
[0017]8.利用引用向量对于一个给定的Linux内核文件,进行静态二进制分析,首先确定Linux内核中引用向量对应的函数,本专利技术使用函数名确定函数的起始地址和结束地址,从而利用反汇编工具获得该函数的汇编代码。
[0018]9.利用函数的汇编代码建立数据流图。
[0019]10.根据引用向量确定初始结构体所在的寄存器作为源,以此源开始进行前向切片,获取初始结构体影响到的所有语句,其中包含该初始结构体的所有域引用所在的语句。
[0020]11.对前向切片的结果进行分析,依据引用向量中的特征获得目标Linux内核中指定结构体的指定域在内核中的偏移量。
[0021]本专利技术还提出了一种获取Linux内核中数据结构偏移的装置,如图5所示,包括多版本静态源代码分析模块和静态二进制代码分析模块。对于指定结构体指定域,我们使用多版本静态源代码分析模块输出对于该域的引用向量。对于一个给定的Linux内核文件,静态二进制分析模块利用该引用向量解析该域在这个内核文件中的偏移值。
[0022]本专利技术具有以下的优点和贡献:
[0023]1.无需依赖内核源代码以及编译和运行环境,对于一些受限的,仅能获取Linux内
核文件的环境,我们也可以获取到一些指定结构体指定域的偏移,从而用于后续的内存取证或者虚拟机自省等。
[0024]2.本专利技术是一种轻量级的方法,借助静态源代码分析和静态二进制分析,可以非常方便地获取Linux本文档来自技高网...
【技术保护点】
【技术特征摘要】
1.一种获取Linux内核中数据结构偏移的方法,其步骤包括:1)获取N个Linux源代码版本,其中包含目标Linux内核文件的Linux源代码版本;2)对于每一所述Linux源代码版本的所有函数进行静态源代码分析,获取所有包含指定结构体S的指定域f的引用并且不是显式声明为内联函数inline的函数,并计算每一所述函数关于所述指定结构体S和所述指定域f的特征,生成对应Linux源代码版本的函数列表;所述函数列表中包括若干个所述函数及其对应的特征;3)根据该N个Linux源代码版本所对应的函数列表,依据函数声明求取N个所述函数列表的交集,生成跨版本的通用函数列表;4)根据所述通用函数列表中的每个函数对应的特征,确定所述函数是否为稳定函数;5)计算每个所述稳定函数对于所述指定域f的引用的复杂性;将复杂性最低的稳定函数的部分特征作为引用向量;6)利用所述引用向量对所述目标Linux内核文件进行静态二进制分析,确定所述目标Linux内核中所述引用向量对应的函数,获取该函数的汇编代码;7)根据所述汇编代码建立数据流图;8)根据所述引用向量确定初始结构体所在的寄存器作为源,以此源开始进行前向切片,获取初始结构体影响到的所有语句;9)对前向切片的结果进行分析,获得所述汇编代码中对于指定结构体S的所有域引用;然后依据所述引用向量中的特征获得对应的域引用确定所述目标Linux内核中所述指定结构体S的指定域f在内核中的偏移量。2.根据权利要求1所述的方法,其特征在于,所述特征包括S_order:指定结构体S作为函数的参数的顺序;S_ref:指定结构体S在函数中全部的域引用次数;S_inline:函数中指定结构体S作为参数的内联函数的调用数量;S_macro:函数中指定结构体S作为参数的宏定义数量;f_order:指定域f在指定结构体S的全部域引用的顺序;scale:函数的大小。3.根据权利要求2所述的方法,其特征在于,确定所述函数是否为稳定函数的方法为:通过对比每个版本Linux中同一函数的特征f_order,S_order,S_inline和S_macro的取值是否相同,如果相同则所述函数为稳定函数。4.根据权利要求3所述的方法,其特征在于,根据公式scale*f_order*(S_ref+S_inline+S_macro)计算每个所述稳定函数对于所述指定域f的引用的复杂性。5.根据权利要求3所述的方法,其特征在于,所述稳定函数的部分特征包括函数名、S_order,S_ref和f_order。6.根据权利要求3所述的方法,其特征在于,根据所述引用向量中的S_order成员获得初始结构体:如果S_o...
【专利技术属性】
技术研发人员:张禹,邹燕燕,孙俭,钟楠宇,刘宝旭,霍玮,
申请(专利权)人:中国科学院信息工程研究所,
类型:发明
国别省市:
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。