跳转指令数据采集方法、装置、电子设备及存储介质与流程

文档序号:30579270发布日期:2022-06-29 11:14阅读:106来源:国知局
跳转指令数据采集方法、装置、电子设备及存储介质与流程

1.本发明涉及软件逆向工程技术领域,尤其涉及一种跳转指令数据采集方法、装置、电子设备及存储介质。


背景技术:

2.软件逆向工程(software reverse engineering)又称软件反向工程,是指从可运行的程序系统出发,运用解密、反汇编、系统分析、程序理解等多种计算机技术,对软件的结构、流程、算法、代码等进行逆向拆解和分析,推导出软件产品的源代码、设计原理、结构、算法、处理过程、运行方法及相关文档等。通常,人们把对软件进行反向分析的整个过程统称为软件逆向工程,把在这个过程中所采用的技术都统称为软件逆向工程技术。
3.现有的软件逆向工程技术,在获取反汇编跳转指令数据时存在诸多困难,无法较为方便地获取反汇编跳转指令。


技术实现要素:

4.针对现有技术中的问题,本发明实施例提供一种跳转指令数据采集方法、装置、电子设备及存储介质。
5.具体地,本发明实施例提供了以下技术方案:
6.第一方面,本发明实施例提供了一种跳转指令数据采集方法,包括:
7.获取操作系统的内核模块文件;
8.基于交互式反汇编器ida对所述内核模块文件进行反汇编处理,得到反汇编处理结果;
9.基于所述ida自带的idapython工具提供的函数接口对所述反汇编处理结果进行处理,确定与所述内核模块文件对应的跳转指令数据集合;其中,所述跳转指令数据集合包括指令执行顺序流记录、模块内跳转指令多层次记录以及模块间指令跳转记录中的一种或多种。
10.进一步地,基于交互式反汇编器ida对所述内核模块文件进行反汇编处理,得到反汇编处理结果,包括:
11.获取与所述内核模块文件对应的反汇编修复文件;
12.基于ida以及所述反汇编修复文件,对所述内核模块文件进行反汇编处理,得到反汇编处理结果。
13.进一步地,获取与所述内核模块文件对应的反汇编修复文件,包括:
14.若所述操作系统为linux操作系统,则获取与所述内核模块文件对应的反汇编修复文件为system.map文件;
15.若所述操作系统为windows操作系统,则获取与所述内核模块文件对应的反汇编修复文件为pdb符号文件。
16.进一步地,若所述操作系统为linux操作系统且所述反汇编修复文件为
system.map文件,则所述基于ida以及所述反汇编修复文件,对所述内核模块文件进行反汇编处理,得到反汇编处理结果,包括:
17.地址确定步骤,基于system.map文件,确定内核函数的起始地址;
18.第一转换步骤,根据内核函数的起始地址在idat.exe中使用idc.makefunction函数将所述内核模块文件中的代码转换为函数;
19.第二转换步骤,确定通过转换生成的函数之间的间隔,若函数之间的间隔大于预设值,则使用idc.makecode将对应的函数强制转换为代码,并再次使用idc.makefunction函数将转换后的代码转换为函数;
20.重复所述第一转换步骤和所述第二转换步骤,直至生成的函数的总数量不再增加。
21.进一步地,当所述跳转指令数据集合中包含有指令执行顺序流记录时,基于所述ida自带的idapython工具提供的函数接口对所述反汇编处理结果进行处理,确定与所述内核模块文件对应的跳转指令数据集合,包括:
22.基于所述ida自带的idapython工具提供的函数接口对所述反汇编处理结果进行处理,确定所述反汇编处理结果中各函数中包含的跳转指令的起始偏移地址以及所述跳转指令下一条的可能指令的起始偏移地址;
23.根据所述反汇编处理结果中各函数中包含的跳转指令的起始偏移地址以及所述跳转指令下一条的可能指令的起始偏移地址,确定所述内核模块文件的指令执行顺序流记录。
24.进一步地,所述指令执行顺序流记录采用有向无环图dag进行记录。
25.进一步地,
26.当所述跳转指令数据集合中包含有模块内跳转指令多层次记录时,基于所述ida自带的idapython工具提供的函数接口对所述反汇编处理结果进行处理,确定与所述内核模块文件对应的跳转指令数据集合,包括:
27.根据所述内核模块文件生成导出表;其中,所述导出表中记录有所述内核模块文件的所有函数;
28.基于所述ida自带的idapython工具提供的函数接口对所述反汇编处理结果进行处理,确定所述反汇编处理结果中各函数中包含的call跳转指令数据采集指令的目的地址;其中,所述call指令的目的地址=当前call指令地址+操作数数值+call指令长度;
29.判断所述call指令的目的地址是否在所述导出表中,若否,则进行模块间指令跳转记录;
30.若所述call指令的目的地址在所述导出表中,则从函数末尾以倒序方式遍历逐条汇编,若不是跳转指令,则继续向前遍历;若是跳转指令且为返回指令,则记录跳转指令数据;若是跳转指令且为call指令,则重复执行判断所述call指令的目的地址是否在所述导出表中的步骤;若是跳转指令且为jcc指令,则判断所述jcc指令的目的地址是否在函数外部,若是,则重复执行从函数末尾以倒序方式遍历逐条汇编的步骤,以确定所述跳转指令数据集合中包含的模块内跳转指令多层次记录。
31.进一步地,若所述操作系统为linux操作系统,则采用三层跟踪终止的方式记录跳转指令数据;
32.其中,所述三层跟踪终止的方式是指函数内的call指令和jcc指令跟踪进入目的地址所在函数继续记录遍历到的返回指令,直到连续跟踪三层终止。
33.进一步地,当所述跳转指令数据集合中包含有模块间指令跳转记录时,基于所述ida自带的idapython工具提供的函数接口对所述反汇编处理结果进行处理,确定与所述内核模块文件对应的跳转指令数据集合,包括:
34.根据所述内核模块文件生成导出表和返回信息表;其中,所述导出表中记录有所述内核模块文件的所有函数;所述返回信息表中记录有所述内核模块文件中每个函数的可能返回地址;
35.基于所述ida自带的idapython工具提供的函数接口对所述反汇编处理结果进行处理,并借助所述导出表和所述返回信息表,确定所述反汇编处理结果中各函数中包含的跳转指令是否存在模块间跳转,若是,则确定模块间指令跳转记录;
36.其中,所述函数中的跳转指令存在模块间跳转是指:跳转对[[from,id],[to,id]中,[from,id]中的id与[to,id]中的id不同;
[0037]
其中,[from,id]中的id是指跳转对的起始偏移地址from所在的内核模块文件的标识,[to,id]中的id是指跳转对的结束偏移地址to所在的内核模块文件的标识。
[0038]
进一步地,在基于所述ida自带的idapython工具提供的函数接口对所述反汇编处理结果进行处理,并借助所述导出表和所述返回信息表,确定所述反汇编处理结果中各函数中包含的跳转指令是否存在模块间跳转时,获取所述导出表和所述返回信息表的步骤包括:
[0039]
基于固定端口的远程过程调用rpc通信机制,加载所述导出表和所述返回信息表至内存,并通过所述固定端口从所述内存获取所述导出表和所述返回信息表。
[0040]
第二方面,本发明实施例还提供了一种跳转指令数据采集装置,包括:
[0041]
获取模块,用于获取操作系统的内核模块文件;
[0042]
处理模块,用于基于交互式反汇编器ida对所述内核模块文件进行反汇编处理,得到反汇编处理结果;
[0043]
确定模块,用于基于所述ida自带的idapython工具提供的函数接口对所述反汇编处理结果进行处理,确定与所述内核模块文件对应的跳转指令数据集合;其中,所述跳转指令数据集合包括指令执行顺序流记录、模块内跳转指令多层次记录以及模块间指令跳转记录中的一种或多种。
[0044]
第三方面,本发明实施例还提供了一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现如第一方面所述跳转指令数据采集方法的步骤。
[0045]
第四方面,本发明实施例还提供了一种非暂态计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现如第一方面所述跳转指令数据采集方法的步骤。
[0046]
第五方面,本发明实施例还提供了一种计算机程序产品,所计算机程序产品包括有计算机程序,该计算机程序被处理器执行时实现如第一方面所述跳转指令数据采集方法的步骤。
[0047]
由上面技术方案可知,本发明实施例提供的跳转指令数据采集方法、装置、电子设
备及存储介质,获取操作系统的内核模块文件,基于交互式反汇编器ida对所述内核模块文件进行反汇编处理,得到反汇编处理结果,然后基于所述ida自带的idapython工具提供的函数接口对所述反汇编处理结果进行处理,确定与所述内核模块文件对应的跳转指令数据集合;其中,所述跳转指令数据集合包括指令执行顺序流记录、模块内跳转指令多层次记录以及模块间指令跳转记录中的一种或多种。由此可见,本实施例将ida工具创新地应用在跳转指令数据采集中,基于所述ida自带的idapython工具提供的函数接口对所述反汇编处理结果进行处理,确定与所述内核模块文件对应的跳转指令数据集合,从而实现了跳转指令数据的有效和全面采集,本实施例得到的跳转指令数据集合可以为基于指令的系统安全检测的方法提供全面有力数据支撑和参考,并在基于指令的系统安全检测的方法得到了很好的验证。
附图说明
[0048]
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
[0049]
图1为本发明一实施例提供的跳转指令数据采集方法的流程图;
[0050]
图2为本发明一实施例提供的跳转指令数据采集方法的实现原理示意图;
[0051]
图3为本发明一实施例提供的linux内核反编译修复效果图;
[0052]
图4为本发明一实施例提供的指令执行顺序流记录示范汇编程序示意图;
[0053]
图5为本发明一实施例提供的指令执行顺序流记录示范汇编程序的有向无环图(dag)描述图;
[0054]
图6为本发明一实施例提供的模块内跳转指令多层次记录的逻辑图;
[0055]
图7为本发明一实施例提供的指令序列数据库存储格式示意图;
[0056]
图8为本发明一实施例提供的制作指令序列数据库的参数性能图;
[0057]
图9为本发明一实施例提供的跳转指令数据采集装置的结构示意图;
[0058]
图10为本发明一实施例提供的电子设备的结构示意图。
具体实施方式
[0059]
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0060]
需要说明的是,目前针对软件逆向分析的研究较少,尤其是交互式反汇编器ida(interactive disassembler professional)自动化运行在静态指令采集记录中的运用更为稀少,多数发明是利用ida识别恶意指令特征进行的恶意软件分析与归类。本发明中的方法属于在ida工具上的创新和应用,是一种在项目中得到验证可施行性强的独特方法。
[0061]
本技术公开了一种快速收集操作系统所有原始模块文件的反汇编跳转指令序列的方法,适用于x86和x64处理器架构上的linux操作系统和windows操作系统。收集的跳转
指令执行序列数据以一种特定格式的数据库存储,跳转指令执行序列数据包括了跳转指令执行顺序流、模块内跳转指令多层次记录、模块间的跳转指令等数据。本方法形成的跳转指令数据库可以为基于指令的系统安全检测的方法提供全面有力数据支撑和参考,并在基于指令的系统安全检测的方法得到了很好的验证。下面将通过具体实施例对本发明提供的方案进行详细解释和说明。
[0062]
图1示出了本发明实施例提供的跳转指令数据采集方法的流程图。如图1所示,本发明实施例提供的跳转指令数据采集方法包括如下步骤:
[0063]
步骤101:获取操作系统的内核模块文件;
[0064]
步骤102:基于交互式反汇编器ida对所述内核模块文件进行反汇编处理,得到反汇编处理结果;
[0065]
步骤103:基于所述ida自带的idapython工具提供的函数接口对所述反汇编处理结果进行处理,确定与所述内核模块文件对应的跳转指令数据集合;其中,所述跳转指令数据集合包括指令执行顺序流记录、模块内跳转指令多层次记录以及模块间指令跳转记录中的一种或多种。
[0066]
在本实施例中,内核模块文件包括系统内核文件和所有模块文件。例如,对于linux操作系统来说,系统功能主要在内核中实现,/boot目录下的内核vmlinuz需要先解压缩成vmlinux再反编译,内核文件中的nop指令填充函数间隙和text段全是代码决定了内核反编译更宜使用线性扫描算法反编译器。对于windows操作系统来说,内核模块文件除包括系统内核文件和所有模块文件之外,还可以包括hal.dll、kdcom.dll、pshed.dll、bootvid.dll、ci.dll等会被模块依赖的底层dll文件。
[0067]
在本实施例中,在获取操作系统的内核模块文件后,可以基于交互式反汇编器ida对所述内核模块文件进行反汇编处理,得到反汇编处理结果,然后基于所述ida自带的idapython工具提供的函数接口对所述反汇编处理结果进行处理,确定与所述内核模块文件对应的跳转指令数据集合。在本实施例中,所述跳转指令数据集合包括指令执行顺序流记录、模块内跳转指令多层次记录以及模块间指令跳转记录中的一种或多种。由此可见,本实施例提供了一种快速收集操作系统所有原始系统模块的反汇编跳转指令的方法,可以为基于指令序列的系统安全检测提供全面的数据支撑。
[0068]
可以理解的是,目前针对软件逆向分析的研究较少,尤其是交互式反汇编器ida(interactive disassembler professional)自动化运行在静态指令采集记录中的运用更为稀少,多数发明是利用ida识别恶意指令特征进行的恶意软件分析与归类。本实施例中的方法属于在ida工具上的创新和应用,是一种在项目中得到验证可施行性强的独特方法。也即本实施例将ida工具创新地应用在跳转指令数据采集中,实现了跳转指令数据的有效和全面采集,本实施例得到的跳转指令数据集合可以为基于指令的系统安全检测的方法提供全面有力数据支撑和参考,并在基于指令的系统安全检测的方法得到了很好的验证。
[0069]
可以理解的是,在本实施例中,基于所述ida自带的idapython脚本工具提供的函数接口对所述反汇编处理结果进行处理,能够自动筛选指令类型,记录指令执行顺序流,记录模块内多层次跳转指令,记录模块间指令跳转等并输出至json文件。由此可见,本实施例最终可以形成记录有指令执行顺序流,模块内多层次跳转指令,模块间指令跳转的json文件,从而可以为基于指令的系统安全检测的方法提供全面有力数据支撑和参考,并在基于
指令的系统安全检测的方法得到了很好的验证。
[0070]
由上面技术方案可知,本发明实施例提供的跳转指令数据采集方法,获取操作系统的内核模块文件,基于交互式反汇编器ida对所述内核模块文件进行反汇编处理,得到反汇编处理结果,然后基于所述ida自带的idapython工具提供的函数接口对所述反汇编处理结果进行处理,确定与所述内核模块文件对应的跳转指令数据集合;其中,所述跳转指令数据集合包括指令执行顺序流记录、模块内跳转指令多层次记录以及模块间指令跳转记录中的一种或多种。由此可见,本实施例将ida工具创新地应用在跳转指令数据采集中,基于所述ida自带的idapython工具提供的函数接口对所述反汇编处理结果进行处理,确定与所述内核模块文件对应的跳转指令数据集合,从而实现了跳转指令数据的有效和全面采集,本实施例得到的跳转指令数据集合可以为基于指令的系统安全检测的方法提供全面有力数据支撑和参考,并在基于指令的系统安全检测的方法得到了很好的验证。
[0071]
基于上述实施例的内容,在本实施例中,基于交互式反汇编器ida对所述内核模块文件进行反汇编处理,得到反汇编处理结果,包括:
[0072]
获取与所述内核模块文件对应的反汇编修复文件;
[0073]
基于ida以及所述反汇编修复文件,对所述内核模块文件进行反汇编处理,得到反汇编处理结果。
[0074]
在本实施例中,如图2所示,若所述操作系统为linux操作系统,则获取与所述内核模块文件对应的反汇编修复文件为system.map文件;若所述操作系统为windows操作系统,则获取与所述内核模块文件对应的反汇编修复文件为pdb符号文件。
[0075]
在本实施例中,可以理解的是,对于linux操作系统,一般情况下,ida的递归下降算法会对内核的反编译出现代码识别为未知数据的错误,但可以根据system.map文件转化出所有内核函数地址,依照此表和函数间隙特点,在ida反编译的基础上多次执行修复程序,可以大幅度提高函数的数量和准确性。对于windows操作系统,微软官网提供多数windows模块文件的pdb符号文件,pdb文件对反编译精准度有较大帮助,此外,windows模块文件函数的分支chunk存在会被识别为红色代码的可能性,使用ida的fix up功能即可有效修复此种问题。
[0076]
基于上述实施例的内容,在本实施例中,若所述操作系统为linux操作系统且所述反汇编修复文件为system.map文件,则所述基于ida以及所述反汇编修复文件,对所述内核模块文件进行反汇编处理,得到反汇编处理结果,包括:
[0077]
地址确定步骤,基于system.map文件,确定内核函数的起始地址;
[0078]
第一转换步骤,根据内核函数的起始地址在idat.exe中使用idc.makefunction函数将所述内核模块文件中的代码转换为函数;
[0079]
第二转换步骤,确定通过转换生成的函数之间的间隔,若函数之间的间隔大于预设值,则使用idc.makecode将对应的函数强制转换为代码,并再次使用idc.makefunction函数将转换后的代码转换为函数;
[0080]
重复所述第一转换步骤和所述第二转换步骤,直至生成的函数的总数量不再增加。
[0081]
在本实施例中,linux系统在linux内核text段中函数数量较多,属于纯代码区段,多数函数开头字节被nop指令多种形式的机器码替换,ida在解析内核函数时,会根据递归
下降算法区分代码和数据,在大量的函数数据中稍微出错,后续识别就会出现数据块和红色代码块等异常解析问题。对于linux开源系统,可以在linux系统上导出内核的map表,根据此表获得内核函数的起始地址和大小,以此可以展开对内核反编译解析的优化,优化过程分为以下步骤:
[0082]
s1、根据内核函数地址在idat.exe中使用idc.makefunction函数自动生成函数;
[0083]
s2、计算函数之间的间隔,如果函数之间的间隔大于预设值,则使用idc.makecode强制转换为代码,之后再使用idc.makefunction转换为函数;
[0084]
s3、重复上述s1和s2两个步骤,直至函数的总数量不再增加为止。
[0085]
在本实施例中,需要说明的是,在一种实现方式下,所述预设值可以根据需要进行设定,如可以为15~20之前,例如为16。此外,在其他实现方式下,所述预设值可以为函数的大小,这里函数的大小可以理解为函数包含的行数。这里函数的大小可以通过system.map文件确定。可以理解的是,当所述预设值为函数的大小时,则上述步骤s2的方案变为:如果两个函数之间的间隔大于函数大小,则使用idc.makecode强制转换为代码,之后再使用idc.makefunction转换为函数,需要说明的是,通过这种处理方式,将函数的大小作为判断是否进行代码强制转换的判断依据,能够有效提高未被识别的函数的修复率。
[0086]
参见图3所示的内核修复效果示意图可知,多版本linux系统内核文件经过第一次修复,解析的函数数量远超过了ida原本识别的函数数量,也是函数数量增长最多的一次修复。在第二次修复后,仍会有小幅度增长,这对指令序列信息收集的精细程度有重要意义。第三次修复后,函数增长数量比较少。
[0087]
基于上述实施例的内容,在本实施例中,当所述跳转指令数据集合中包含有指令执行顺序流记录时,基于所述ida自带的idapython工具提供的函数接口对所述反汇编处理结果进行处理,确定与所述内核模块文件对应的跳转指令数据集合,包括:
[0088]
基于所述ida自带的idapython工具提供的函数接口对所述反汇编处理结果进行处理,确定所述反汇编处理结果中各函数中包含的跳转指令的起始偏移地址以及所述跳转指令下一条的可能指令的起始偏移地址;
[0089]
根据所述反汇编处理结果中各函数中包含的跳转指令的起始偏移地址以及所述跳转指令下一条的可能指令的起始偏移地址,确定所述内核模块文件的指令执行顺序流记录。
[0090]
在本实施例中,本方法中记录了指令执行顺序流,其中用有向无环图dag(directed acyclic graph)描述函数可能的执行流。dag的出度或者入度来描述函数可能的执行情况。图4指令执行顺序流的示范汇编程序用dag描述的图片形式如图5,也即指令执行顺序流记录可以采用有向无环图dag进行记录。如果用dag的出度来描述:
[0091]
"dag":{"55db8e":[55dbeb,55dc91],"55db9a":[55dba5,55dbeb,55dc91],"55dba5":[55dcb7],"55dbeb":[55dcb7],"55dc91":[55dca7],"55dca7":[0],"55dcb7":[55dca7]}
[0092]
其中,"55db8e":[55dbeb,55dc91]:"55db8e":表示当前跳转指令的from_offset,[55dbeb,55dc91],表示下一条可能指令的from_offset。
[0093]
以此类推,记录函数内跳转指令的执行顺序。例如2代表的跳转指令执行完以后,只可能执行3,4,5代表的跳转指令,不可能从2直接到7。返回指令将作为dag的出口,如图5
中的6,将记录为"55dca7":[0]。
[0094]
基于上述实施例的内容,在本实施例中,当所述跳转指令数据集合中包含有模块内跳转指令多层次记录时,基于所述ida自带的idapython工具提供的函数接口对所述反汇编处理结果进行处理,确定与所述内核模块文件对应的跳转指令数据集合,包括:
[0095]
根据所述内核模块文件生成导出表;其中,所述导出表中记录有所述内核模块文件的所有函数;
[0096]
基于所述ida自带的idapython工具提供的函数接口对所述反汇编处理结果进行处理,确定所述反汇编处理结果中各函数中包含的call跳转指令数据采集指令的目的地址;其中,所述call指令的目的地址=当前call指令地址+操作数数值+call指令长度;
[0097]
判断所述call指令的目的地址是否在所述导出表中,若否,则进行模块间指令跳转记录;
[0098]
若所述call指令的目的地址在所述导出表中,则从函数末尾以倒序方式遍历逐条汇编,若不是跳转指令,则继续向前遍历;若是跳转指令且为返回指令,则记录跳转指令数据;若是跳转指令且为call指令,则重复执行判断所述call指令的目的地址是否在所述导出表中的步骤;若是跳转指令且为jcc指令,则判断所述jcc指令的目的地址是否在函数外部,若是,则重复执行从函数末尾以倒序方式遍历逐条汇编的步骤,以确定所述跳转指令数据集合中包含的模块内跳转指令多层次记录。
[0099]
在本实施例中,汇编指令类型可以使用intel汇编语法。对于windows,地址是指相对于模块基址的相对偏移地址;对于linux系统,地址是指相对于text代码段第一个函数地址的相对偏移地址。
[0100]
在本实施例中,跳转指令具有call、jcc和返回指令(ret、retn、retf、iret指令)三种类型。三种类型有不同的表现形式和机器码。跳转指令分为直接跳转和间接跳转,下表1所示即是间接跳转指令的操作数类型和汇编形式,间接跳转的目的地址需要动态运行才可以得到,可以利用其他方法补充目的地址,本实施例中在jxx项中记录间接跳转汇编指令。
[0101]
表1
[0102][0103][0104]
在本实施例中,把每一个jcc跳转指令,ret指令都视为一个from,to跳转对,call指令绝大部分都是两个from,to跳转对,个别call指令跳转到noet函数中(noret函数指函数中没有返回指令,以call、jmp结尾),是不会在noret属性函数中返回的。此种情况使用了方法中的模块内跳转指令多层次记录进行补充。from,to对的表现形式是[[from,id],[to,id]],这是描述跳转指令的基本数据单元。其中id是为每个模块事先分配好的独一无二的id,若[from,id]的id和[to,id]的id一样,则表明该跳转是本模块内的跳转。若[from,id]
的id和[to,id]的id不一样,则表明该跳转属于模块间的跳转,例如call函数调用了其他模块的导出函数。
[0105]
在本实施例中,jxx中间接跳转指令因目的地址需动态运行中获取得到,在[[from,id],[to,id]]不存在to项,以“xxx”替代to地址记录。
[0106]
在本实施例中,在确定模块内跳转指令多层次记录时,将依赖导出表,因此下面先介绍下导出表的生成过程:
[0107]
对于内核模块需要使用特定的哈希值算法来保证唯一性,并使用id标识排序,模块的导出函数统一记录到导出表中。除此之外,导出表记录所有内核以及模块的基本信息,供后续程序处理参考和引用。同时导出表可以作为一个操作系统所有模块文件的指令数据库的字典。
[0108]
由此可见,在生成导出表时,需要对内核模块的二进制文件标记id、计算哈希值、记录每个模块的导出函数地址和名称,形成导出表文件。
[0109]
正如上面所述,函数具有noret属性(即函数内没有返回指令,以call和jmp指令结尾),则有必要进行模块内跳转指令的多层次记录。linux系统中noret属性函数较多,假设函数在调用过程中可能途径n个noret函数,也就是说只有当查找返回指令的深度m》中间函数个数n时,call指令调用才能找到所有可能的返回指令。在本实施例中,如图6所示,具体逻辑如下:
[0110]
call指令的目的地址=当前call指令地址+操作数数值+call指令长度,依此取到call指令的目的地址。
[0111]
如果目的地址不是模块内函数,则表明调用的函数在外部模块中,则进行模块间指令跳转记录,此方法将在下述实施例关于模块间指令跳转记录部分进行介绍。
[0112]
如果目的地址是模块内函数,在目的地址函数中从函数末尾以倒序方式遍历逐条汇编,若不是跳转指令,则继续向前遍历;若是跳转指令且为返回指令则记录[[from,id],[to,id]]数据;若跳转指令是call指令,继续获取指令的目的地址,重复上述步骤;若跳转指令是jcc指令,判断该跳转的目的地址是否在函数外部,如果在函数外部,重复上述步骤。
[0113]
需要说明的是,在单纯的静态分析上做查找深度增加是需要消耗一定性能的,具体n的设定和实际效果需要测试才能确定。
[0114]
在一种实现方式中,若所述操作系统为linux操作系统,则采用三层跟踪终止的方式记录跳转指令数据;
[0115]
其中,所述三层跟踪终止的方式是指函数内的call指令和jcc指令跟踪进入目的地址所在函数继续记录遍历到的返回指令,直到连续跟踪三层终止。
[0116]
在本实现方式下,对于linux系统模块文件默认采用三层次记录返回地址方法,即函数内call和jcc指令会跟踪进入目的地址所在函数,继续记录遇到的返回指令,直到连续跟踪了三层终止。该方法可以有效解决linux系统中部分noret属性的函数的跟踪记录问题,提高指令序列数据库的全面性。
[0117]
基于上述实施例的内容,在本实施例中,当所述跳转指令数据集合中包含有模块间指令跳转记录时,基于所述ida自带的idapython工具提供的函数接口对所述反汇编处理结果进行处理,确定与所述内核模块文件对应的跳转指令数据集合,包括:
[0118]
根据所述内核模块文件生成导出表和返回信息表;其中,所述导出表中记录有所
述内核模块文件的所有函数;所述返回信息表中记录有所述内核模块文件中每个函数的可能返回地址;
[0119]
基于所述ida自带的idapython工具提供的函数接口对所述反汇编处理结果进行处理,并借助所述导出表和所述返回信息表,确定所述反汇编处理结果中各函数中包含的跳转指令是否存在模块间跳转,若是,则确定模块间指令跳转记录;
[0120]
其中,所述函数中的跳转指令存在模块间跳转是指:跳转对[[from,id],[to,id]中,[from,id]中的id与[to,id]中的id不同;
[0121]
其中,[from,id]中的id是指跳转对的起始偏移地址from所在的内核模块文件的标识,[to,id]中的id是指跳转对的结束偏移地址to所在的内核模块文件的标识。
[0122]
在本实施例中,在确定模块间指令跳转记录时,将依赖导出表和模块的返回信息表。下面先介绍下导出表和返回信息表的生成过程:
[0123]
对于内核模块需要使用特定的哈希值算法来保证唯一性,并使用id标识排序,模块的导出函数统一记录到导出表中。除此之外,导出表记录所有内核以及模块的基本信息,供后续程序处理参考和引用。同时导出表可以作为一个操作系统所有模块文件的指令数据库的字典。操作系统的内核和模块的二进制文件应通过idapython先记录二进制文件内每个函数的可能返回地址,形成一个返回信息表,该表用于模块间调用函数时查询被调用函数的可能返回地址。
[0124]
在本实施例中,from,to对的表现形式是[[from,id],[to,id]],这是描述跳转指令的基本数据单元。其中id是为每个模块事先分配好的独一无二的id,若[from,id]的id和[to,id]的id一样,则表明该跳转是本模块内的跳转。若[from,id]的id和[to,id]的id不一样,则表明该跳转属于模块间的跳转,例如call函数调用了其他模块的导出函数。
[0125]
在本实施例中,需要说明的是,ida反编译模块文件属于单模块操作,每次模块生成指令数据算法必须访问导出表内容和全部模块的函数返回点信息,以构建出一种伪动态得到的数据信息。使用远程过程调用rpc(remote procedure call)通信机制可以避免重复读取相同内存,实现模块间的信息结合,提高指令序列数据库的生成速度。主机开启固定端口的rpc通信server端服务器,并加载导出表和返回信息表的内容到内存,idat64.exe每次处理模块都会以相同端口的cilent客户端与服务器端建立连接并获取数据。当模块内call指令调用其他模块的导出函数时,idat64.exe无需重复加载导出表和返回信息表,直接通过服务器端查询这两块内存中需要的数据信息。由此可见,在基于所述ida自带的idapython工具提供的函数接口对所述反汇编处理结果进行处理,并借助所述导出表和所述返回信息表,确定所述反汇编处理结果中各函数中包含的跳转指令是否存在模块间跳转时,获取所述导出表和所述返回信息表的步骤包括:基于固定端口的远程过程调用rpc通信机制,加载所述导出表和所述返回信息表至内存,并通过所述固定端口从所述内存获取所述导出表和所述返回信息表。
[0126]
在本实施例中,可以理解的是,采集得到的跳转指令数据集合(也可以称作跳转指令执行序列数据集合)以一种特定格式的数据库存储,跳转指令数据集合中包括了跳转指令执行顺序流、模块内跳转指令多层次记录、模块间的跳转指令等数据。下面结合图7介绍一下本实施例中,跳转指令数据集合的最终输出格式,如图7所示,任何一个系统模块文件在idapython中都会记录函数的地址及大小,以函数为单位记录模块内跳转指令call、jcc,
模块间跳转指令,函数的执行流顺序dag、以及函数所有可能的返回地址。可以理解的是,在本实施例中,idapython主要实现内核修复、指令执行顺序流记录、模块间指令跳转记录方法、模块内跳转指令多层次记录等多种算法。由此可见,本实施例公开了一种快速收集操作系统所有原始模块文件的反汇编跳转指令序列的方法,适用于x86和x64处理器架构上的linux操作系统和windows操作系统,收集的跳转指令执行序列数据以一种特定格式的数据库存储,跳转指令执行序列数据包括了跳转指令执行顺序流、模块内跳转指令多层次记录、模块间的跳转指令等数据。本实施例形成的跳转指令数据库可以为基于指令的系统安全检测的方法提供全面有力数据支撑和参考,并在基于指令的系统安全检测的方法得到了很好的验证。
[0127]
本实施例提供的方法在具体实现时,首先获取原始操作系统的内核和模块二进制文件,然后经过处理形成导出表和返回信息表文件,再使用ida反编译器的无界面版本idat64.exe和idat.exe执行idapython程序批量反编译处理文件数据,idapython中有反汇编优化、指令类型筛选和指令执行流记录、模块间指令跳转记录等多种复杂算法处理,最终以单个模块文件对应单个json文件形成目录树数据库。图8示意了制作指令序列数据库的参数性能图。
[0128]
可以理解的是,本实施例提供了一种快速收集操作系统所有原始系统模块的反汇编跳转指令的方法,可以基于如下装置实现,该装置包括:
[0129]
收集模块:获取主机原始操作系统版本的内核模块二进制文件;
[0130]
制作导出表和返回信息表模块:对二进制文件标记id、计算哈希值、记录每个模块的导出函数地址和名称,形成导出表文件。记录模块内所有函数的返回地址形成返回信息表文件;
[0131]
补充修复模块:对于windows操作系统,需要获取二进制文件的pdb文件;对于linux操作系统,需要先根据linux内核的system.map修复内核的反编译效果;
[0132]
数据处理模块:执行批处理模块的idapython脚本,筛选指令类型,记录指令执行顺序流,记录模块内多层次跳转指令,记录模块间指令跳转等并输出至json文件。
[0133]
由此可见,本实施例最终形成了记录有指令执行顺序流,模块内多层次跳转指令,模块间指令跳转的json文件,从而可以为基于指令的系统安全检测的方法提供全面有力数据支撑和参考,并在基于指令的系统安全检测的方法得到了很好的验证。
[0134]
图9示出了本发明实施例提供的跳转指令数据采集装置的结构示意图。如图9所示,本实施例提供的跳转指令数据采集装置,包括:获取模块21、处理模块22和确定模块23,其中:
[0135]
获取模块21,用于获取操作系统的内核模块文件;
[0136]
处理模块22,用于基于交互式反汇编器ida对所述内核模块文件进行反汇编处理,得到反汇编处理结果;
[0137]
确定模块23,用于基于所述ida自带的idapython工具提供的函数接口对所述反汇编处理结果进行处理,确定与所述内核模块文件对应的跳转指令数据集合;其中,所述跳转指令数据集合包括指令执行顺序流记录、模块内跳转指令多层次记录以及模块间指令跳转记录中的一种或多种。
[0138]
由于本发明实施例提供的跳转指令数据采集装置,可以用于执行上述实施例所述
的跳转指令数据采集方法,其工作原理和有益效果类似,故此处不再详述,具体内容可参见上述实施例的介绍。
[0139]
在本实施例中,需要说明的是,本发明实施例的装置中的各个模块可以集成于一体,也可以分离部署。上述模块可以合并为一个模块,也可以进一步拆分成多个子模块。
[0140]
基于相同的发明构思,本发明又一实施例提供了一种电子设备,参见图10,所述电子设备具体包括如下内容:处理器301、存储器302、通信接口303和通信总线304;
[0141]
其中,所述处理器301、存储器302、通信接口303通过所述通信总线304完成相互间的通信;
[0142]
所述处理器301用于调用所述存储器302中的计算机程序,所述处理器执行所述计算机程序时实现上述跳转指令数据采集方法的全部步骤,例如,所述处理器执行所述计算机程序时实现下述过程:获取操作系统的内核模块文件;基于交互式反汇编器ida对所述内核模块文件进行反汇编处理,得到反汇编处理结果;基于所述ida自带的idapython工具提供的函数接口对所述反汇编处理结果进行处理,确定与所述内核模块文件对应的跳转指令数据集合;其中,所述跳转指令数据集合包括指令执行顺序流记录、模块内跳转指令多层次记录以及模块间指令跳转记录中的一种或多种。
[0143]
可以理解的是,所述计算机程序可以执行的细化功能和扩展功能可参照上面实施例的描述。
[0144]
基于相同的发明构思,本发明又一实施例提供了一种非暂态计算机可读存储介质,该非暂态计算机可读存储介质上存储有计算机程序,该计算机程序被处理器执行时实现上述跳转指令数据采集方法的全部步骤,例如,所述处理器执行所述计算机程序时实现下述过程:获取操作系统的内核模块文件;基于交互式反汇编器ida对所述内核模块文件进行反汇编处理,得到反汇编处理结果;基于所述ida自带的idapython工具提供的函数接口对所述反汇编处理结果进行处理,确定与所述内核模块文件对应的跳转指令数据集合;其中,所述跳转指令数据集合包括指令执行顺序流记录、模块内跳转指令多层次记录以及模块间指令跳转记录中的一种或多种。
[0145]
可以理解的是,所述计算机程序可以执行的细化功能和扩展功能可参照上面实施例的描述。
[0146]
基于相同的发明构思,本发明又一实施例提供了一种计算机程序产品,所计算机程序产品包括有计算机程序,该计算机程序被处理器执行时实现上述关联应用启动控制方法的全部步骤,例如,所述处理器执行所述计算机程序时实现下述过程:获取操作系统的内核模块文件;基于交互式反汇编器ida对所述内核模块文件进行反汇编处理,得到反汇编处理结果;基于所述ida自带的idapython工具提供的函数接口对所述反汇编处理结果进行处理,确定与所述内核模块文件对应的跳转指令数据集合;其中,所述跳转指令数据集合包括指令执行顺序流记录、模块内跳转指令多层次记录以及模块间指令跳转记录中的一种或多种。
[0147]
可以理解的是,所述计算机程序可以执行的细化功能和扩展功能可参照上面实施例的描述。
[0148]
此外,上述的存储器中的逻辑指令可以通过软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明
的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(rom,read-only memory)、随机存取存储器(ram,random access memory)、磁碟或者光盘等各种可以存储程序代码的介质。
[0149]
以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本发明实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。
[0150]
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如rom/ram、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分所述的跳转指令数据采集方法。
[0151]
此外,在本发明中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个
……”
限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
[0152]
此外,在本发明中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本发明的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不必须针对的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任一个或多个实施例或示例中以合适的方式结合。此外,在不相互矛盾的情况下,本领域的技术人员可以将本说明书中描述的不同实施例或示例以及不同实施例或示例的特征进行结合和组合。
[0153]
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1