基于静态指令流跟踪的导入表修复方法及装置转让专利

申请号 : CN201711395746.7

文献号 : CN108108617B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 康绯熊小兵舒辉光焱卜文娟刘彬林昊徐旭

申请人 : 中国人民解放军战略支援部队信息工程大学

摘要 :

本发明属于网络安全技术领域,特别涉及一种基于静态指令流跟踪的导入表修复方法及装置,该方法实现过程如下:针对脱壳后程序进行静态分析,跟踪其指令流,捕获待指令流到系统动态链接库的跳转点;根据跳转点确定真正的API函数地址;依据真正的API函数地址修正待修复导入表的表项,完成导入表修复。本发明利用静态指令流跟踪技术可以在不动态执行指令的情况下,跟踪程序的指令流,捕获指令流到系统动态链接库的跳转点,从而确定真正的API函数地址,完成导入表的修复,有效解决混淆导入表修复问题,保证脱壳效果及脱壳后PE文件的完整重构,增强网络对恶意代码的防御能力,对网络安全具有重要的指导意义。

权利要求 :

1.一种基于静态指令流跟踪的导入表修复方法,其特征在于,包含如下内容:A)针对脱壳后程序进行静态分析,跟踪其指令流,捕获指令流到系统动态链接库的跳转点;

B)根据跳转点确定真正的API函数地址;

C)依据真正的API函数地址修正待修复导入表的表项,完成导入表修复;

A)中,针对脱壳后程序进行静态分析,通过对导入表中导入项指向的地址进行静态指令流跟踪,逐步记录执行过的指令字节数,直到控制权跳转到动态链接库中,记录此时的跳转目的地址,作为指令流到系统动态链接库的跳转点。

2.根据权利要求1所述的基于静态指令流跟踪的导入表修复方法,其特征在于,A)中,依据预设的导入表伪装深度作为修复的循环判断满足条件,对待修复导入表中满足条件的导入项指针指向地址进行修复处理。

3.根据权利要求2所述的基于静态指令流跟踪的导入表修复方法,其特征在于,A)中,对待修复导入表中满足条件的导入项指针指向地址进行修复处理,包含如下内容:依据导入项指针指向地址判断导入表表项是否需要修复;对需要修复的导入表表项,对其指针指向的内存执行反汇编指令,若反汇编指令有效执行,则进一步判断该反汇编指令是否为跳转指令,若是,则获取其跳转目标地址,并根据该跳转目标地址是否在导入动态链接内存区域来确定指令流到系统动态链接库的跳转点。

4.根据权利要求1所述的基于静态指令流跟踪的导入表修复方法,其特征在于,B)中,依据跳转点及记录的指令字节数,获取真正的API函数地址。

5.根据权利要求4所述的基于静态指令流跟踪的导入表修复方法,其特征在于,C)中,真正的API函数地址,是指:跳转点与记录的指令字节数差值。

6.一种基于静态指令流跟踪的导入表修复装置,其特征在于,基于权利要求1所述的基于静态指令流跟踪的导入表修复方法实现,包含:静态分析模块、真正API函数地址获取模块及导入表项修复模块,其中,静态分析模块,用于针对脱壳后程序进行静态分析,跟踪其指令流,捕获待指令流到系统动态链接库的跳转点;

真正API函数地址获取模块,用于根据跳转点确定真正的API函数地址;

导入表项修复模块,用于依据真正的API函数地址修正导入表的表项,完成导入表修复。

说明书 :

基于静态指令流跟踪的导入表修复方法及装置

技术领域

[0001] 本发明属于网络安全技术领域,特别涉及一种基于静态指令流跟踪的导入表修复方法及装置。

背景技术

[0002] 加壳技术是恶意代码编写者经常使用的一项技术。由于被加壳的程序只有在执行时才在内存中被还原,可有效防止研究人员对程序的分析,因此,恶意代码往往会使用加壳技术来规避杀毒软件的查杀,当然,加壳技术本身并没有恶意性,许多良性软件出于版权保护的考量也会使用加壳技术。使用了加壳技术的代码很难被反汇编,若要使用反汇编技术对加壳代码进行分析,首先需要对代码进行脱壳处理,再进行特征提取和行为分析。当前,加壳软件的数量众多,每个加壳软件所使用的算法都不尽相同。虽然静态脱壳技术针对性强、效率高,但是随着加壳技术的迅速发展,未知壳越来越多,人工分析解密工程量大、逆向工作困难、准确率低等问题逐步显现。传统的静态脱壳技术不再具有普适性,脱壳技术的焦点开始转向动态脱壳技术。
[0003] 尽管每种加壳软件的算法各不相同,但他们也有着一些共同特性。所有的加壳软件都会将壳代码放入加壳后的目标程序。壳代码的一般加载过程一般为:首先,壳代码保存原始程序入口点的相关信息;其次,装载在壳代码工作期间所需的必备函数;再次,壳代码将原始程序的数据代码进行解压,并构建原始程序所需的导入函数表;最后,壳代码跳转到原始程序的入口点,并将控制权转交给原始程序。当系统运行被加壳程序时,会首先执行自身的脱壳代码,解压、解密原始数据,随后跳转到原程序代码入口点继续执行。动态脱壳技术正是利用这点,让被加壳程序自己完成脱壳的操作。脱壳程序比较程序入口点处的代码与壳代码,检查程序是否加壳,随后根据壳代码工作时的特征判断程序入口点的位置,然后在入口点处将数据转存成文件格式,最后修复处理文件的导入函数地址表。现有动态脱壳方法一般都能够把脱壳后的内存镜像Dump出来,但大多无法修复导入表,使得脱壳后的代码无法重构成一个完整的PE文件,影响脱壳效果。为了加大脱壳难度,很多壳还加入了导入表混淆策略。为此,如何正确的修复脱壳后PE文件的导入表信息,是脱壳技术研究的重点和难点所在。

发明内容

[0004] 针对现有技术中的不足,本发明提供一种基于静态指令流跟踪的导入表修复方法及装置,对脱壳后的程序导入表项进行修复还原,进而重构完整的PE文件,保证加壳程序的脱壳效果,具有普适性。
[0005] 按照本发明所提供的设计方案,一种基于静态指令流跟踪的导入表修复方法,包含如下内容:
[0006] A)针对脱壳后程序进行静态分析,跟踪其指令流,捕获待指令流到系统动态链接库的跳转点;
[0007] B)根据跳转点确定真正的API函数地址;
[0008] C)依据真正的API函数地址修正待修复导入表的表项,完成导入表修复。
[0009] 上述的,A)中,针对脱壳后程序进行静态分析,通过对导入表中导入项指向的地址进行静态指令流跟踪,逐步记录执行过的指令字节数,直到控制权跳转到动态链接库中,记录此时的跳转目的地址,作为指令流到系统动态链接库的跳转点。
[0010] 优选的,A)中,依据预设的导入表伪装深度作为修复的循环判断满足条件,对待修复导入表中满足条件的导入项指针指向地址进行修复处理。
[0011] 更进一步,A)中,对待修复导入表中满足条件的导入项指针指向地址进行修复处理,包含如下内容:
[0012] 依据导入项指针指向地址判断导入表表项是否需要修复;对需要修复的导入表表项,对其指针指向的内存执行反汇编指令,若反汇编指令有效执行,则进一步判断该反汇编指令是否为跳转指令,若是,则获取其跳转目标地址,并根据该跳转目标地址是否在导入动态链接内存区域来确定指令流到系统动态链接库的跳转点。
[0013] 上述的,B)中,依据跳转点及记录的指令字节数,获取真正的API函数地址。
[0014] 优选的,C)中,真正的API函数地址,是指:跳转点与记录的指令字节数差值。
[0015] 一种基于静态指令流跟踪的导入表修复装置,包含:静态分析模块、真正API函数地址获取模块及导入表项修复模块,其中,
[0016] 静态分析模块,用于针对脱壳后程序进行静态分析,跟踪其指令流,捕获待指令流到系统动态链接库的跳转点;
[0017] 真正API函数地址获取模块,用于根据跳转点确定真正的API函数地址;
[0018] 导入表项修复模块,用于依据真正的API函数地址修正导入表的表项,完成导入表修复。
[0019] 本发明的有益效果:
[0020] 本发明利用静态指令流跟踪技术可以在不动态执行指令的情况下,跟踪程序的指令流,捕获指令流到系统动态链接库的跳转点,从而确定真正的API函数地址,完成导入表的修复,有效解决混淆导入表修复问题,保证脱壳效果及脱壳后PE文件的完整重构,增强网络对恶意代码的防御能力,对网络安全具有重要的指导意义。附图说明:
[0021] 图1为实施例中的导入表混淆实例;
[0022] 图2为实施例中基于静态指令流跟踪的导入表修复方法流程图;
[0023] 图3为实施例中基于静态指令流跟踪的导入表修复装置示意图。具体实施方式:
[0024] 为使本发明的目的、技术方案和优点更加清楚、明白,下面结合附图和技术方案对本发明作进一步详细的说明。
[0025] 现有动态脱壳方法中大多无法修复导入表,使得脱壳后的代码无法重构成一个完整的PE文件,影响脱壳效果。为了加大脱壳难度,进一步加大程序保护力度,有些高级壳采用了导入API模糊化技术,很多壳加入导入表混淆策略。为了使得传统基于API函数地址匹配的导入表修复技术无法准确地获取完整的目标代码导入表信息。如下图1所示,壳编写者在调用一个API函数时,会将API函数的部分指令拷贝到程序空间中执行,然后跳转到API函数中执行,这使得我们找到的导入表中存储的API函数地址出现错误。为此,在对加壳程序进行脱壳处理后,为了重构一个完整可正确执行的PE文件,需要对导入表进行修正。在该示例中,导入表项0x04000012位置存储的API函数地址应修正为0x75000000。为此,本发明实施例提供一一种基于静态指令流跟踪的导入表修复方法,包含如下内容:
[0026] 101)针对脱壳后程序进行静态分析,跟踪其指令流,捕获待指令流到系统动态链接库的跳转点;
[0027] 102)根据跳转点确定真正的API函数地址;
[0028] 103)依据真正的API函数地址修正待修复导入表的表项,完成导入表修复。
[0029] PE文件的导入表存储的应是该文件在动态执行过程中使用的所有API函数地址信息,导入表模糊化处理后,导入表项存储的函数地址可能是错误的。但不管怎么模糊化,在调用API函数时,都会跳转到系统动态链接库地址空间中,只是在跳转前,会执行一些用于混淆的指令序列。针对脱壳后程序进行静态分析,通过对导入表中导入项指向的地址进行静态指令流跟踪,逐步记录执行过的指令字节数,直到控制权跳转到动态链接库中,记录此时的跳转目的地址,作为指令流到系统动态链接库的跳转点。利用静态指令流跟踪技术,可以在不动态执行指令的情况下,跟踪程序的指令流,捕获指令流到系统动态链接库的跳转点,从而确定真正的API函数地址,完成导入表的修复。从加壳软件对导入表的常用混淆机理入手,有效解决了混淆导入表的自动、快速、准确修复问题,对于脱壳后PE文件的完整重构具有重要作用。
[0030] 依据预设的导入表伪装深度作为修复的循环判断满足条件,对待修复导入表中满足条件的导入项指针指向地址进行修复处理。对待修复导入表中满足条件的导入项指针指向地址进行修复处理,包含如下内容:
[0031] 依据导入项指针指向地址判断导入表表项是否需要修复;对需要修复的导入表表项,对其指针指向的内存执行反汇编指令,若反汇编指令有效执行,则进一步判断该反汇编指令是否为跳转指令,若是,则获取其跳转目标地址,并根据该跳转目标地址是否在导入动态链接内存区域来确定指令流到系统动态链接库的跳转点。
[0032] 依据跳转点及记录的指令字节数,获取真正的API函数地址。真正的API函数地址,是指:跳转点与记录的指令字节数差值。
[0033] 针对以上的方法实施例,导入表修复算法描述如下:
[0034]
[0035]
[0036] 基于静态指令流跟踪的导入表修复核心思想是对导入项指向的地址进行静态指令流跟踪,逐步记录执行过的指令字节数insDelta,直到程序控制权跳转到动态链接库中,此时的跳转目的地址与insDelta的差值即为真实的导入函数地址,将其修正到导入项中即可。
[0037] 基于上述方法的实施例,本发明还一种基于静态指令流跟踪的导入表修复装置,参见图3所示,包含:静态分析模块201、真正API函数地址获取模块202及导入表项修复模块203,其中,
[0038] 静态分析模块201,用于针对脱壳后程序进行静态分析,跟踪其指令流,捕获待指令流到系统动态链接库的跳转点;
[0039] 真正API函数地址获取模块202,用于根据跳转点确定真正的API函数地址;
[0040] 导入表项修复模块203,用于依据真正的API函数地址修正导入表的表项,完成导入表修复。
[0041] 本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
[0042] 本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/
[0043] 或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其它可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
[0044] 这些计算机程序指令也可存储在能引导计算机或其它可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
[0045] 这些计算机程序指令也可装载到计算机或其它可编程数据处理设备上,使得在计算机或其它可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其它可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
[0046] 对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本申请。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本申请的精神或范围的情况下,在其它实施例中实现。因此,本申请将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。