重定位表的修复方法、程序脱壳方法及相关装置的制作方法

文档序号:6386032阅读:732来源:国知局
专利名称:重定位表的修复方法、程序脱壳方法及相关装置的制作方法
技术领域
本发明涉及计算机技术领域,尤指一种重定位表的修复方法、程序脱壳方法及相
关装置。
背景技术
加壳是可执行程序资源压缩的简称,是保护文件的常用手段,其原理是利用特殊的算法,对可执行程序里的资源进行压缩、加密。加壳程序可以直接运行,但是不能获取原始程序,要经过脱壳才可以获取。脱壳的过程主要为三步第一步,确定原始程序的入口点(Original Entry Point, OEP);第二步, 修复导入表和重定位表;第三步,将内存中的原始程序写入文件,更改程序的新入口地址为0ΕΡ,这一步通常称为转储(Dump)。修复重定位表是非常关键的步骤。下面介绍重定位表的概念。有的可执行程序,加载到内存中运行时,加载基地址是不固定的,因此可执行程序中有绝对寻址的地方需要加上实际加载基地址与默认加载基地址的差值。假设dll类型的可执行程序的默认加载基地址是0x10000000,它的程序中有如下汇编代码mo V eax,
。该代码表示将地址为0x10001000中的数据传递给eax,也就是将默认加载基地址偏移0x1000后的地址中的数据传递给eax。但是当这个dll类型的可执行程序的实际加载基地址为0x600000000时,这个代码就有问题了,必须改成下面的代码才正确mo V eax,
。在这里需要一个修正偏移,也就是dll类型的可执行程序的默认加载地址和实际加载地址的差值,即0x60002000-0x10001000=0x50000000,这样才能保证寻址正确。因此,这类可执行文件需要一个重定位表,来存放每一个需要修正偏移的项,也称为重定项。操作系统在加载可执行程序时,在发现重定位表后,会解析重定位表,得到每一个重定位项,然后填充差值到每一个需要修正偏移的项。要想对有重定位表的原始程序加壳,所加的壳必须能处理重定位表,原始程序加壳后,新的重定位表是壳自身的重定位表,原始程序需要修正偏移的项不再由操作系统自身来修正,而是由壳来修正。当加壳程序运行到OEP后,此时加壳程序虽然需要修正偏移的项已经被壳修正,但是重定位表却不一定正确,这样即便dump,下次运行时系统仍然不能修正加壳程序需要重定位的数据,导致加壳程序崩溃。所以要想完成脱壳,还必须修复加壳程序对应的原始程序的重定位表。目前,在修复重定位表时,通常会采用特征定位法,根据已知类型壳的特征对加壳程序对应的原始程序的重定位表进行修复,现有的产品有针对具体壳的脱壳脚本或自动脱壳机等。这种方法在修复重定位表时成功率很高,修复得完美,但是一旦已知类型壳升级可能导致特征定位失效,并且对于使用未知类型壳的加壳程序对应的原始程序的重定位表不能使用。因此,现有的重定位表修复方法并不能普遍适用于修复各种加壳程度对应的原始程序的重定位表。

发明内容
本发明实施例提供一种重定位表的修复方法、基于加壳程序的脱壳方法及装置,用以解决现有的重定位表修复方法不能普遍适用于修复各种加壳程序对应的原始程序的重定位表的问题。—种重定位表的修复方法,包括记录运行加壳程序过程中产生的数据改写信息和模块加载信息,所述数据改写信息包括数据改写执行地址、数据改写地址、改写数据和数据改写时间,所述模块加载信息包括所述加壳程序映射到内存中的基地址和终止地址;在确定所述加壳程序对应的原始程序的入口点OEP后,根据数据改写时间、数据改写地址和设定的组合规则将记录的数据改写信息中的改写数据进行组合,并根据模块加载信息和重定位表格式在组合后的改写数据中搜寻待选重定位表;若搜寻到待选重定位表,获取在到达所述OEP的时刻所有重定位项指向内存地址的数据都存在于内存中、并且包含指向的内存地址最小的重定位项的待选重定位表为所述加壳程序对应的原始程序的重定位表;若搜寻不到待选重定位表,根据记录的数据改写信息中包括数据改写执行地址、数据改写地址、改写数据和数据改写时间重新建立所述加壳程序对应的原始程序的重定位表。一种重定位表的修复装置,包括记录单元,用于记录运行加壳程序过程中产生的数据改写信息和模块加载信息,所述数据改写信息包括数据改写执行地址、数据改写地址、改写数据和数据改写时间,所述模块加载信息包括所述加壳程序映射到内存中的基地址和终止地址;搜寻单元,用于在确定所述加壳程序对应的原始程序的入口点OEP后,根据数据改写时间、数据改写地址和设定的组合规则将记录的数据改写信息中的改写数据进行组合,并根据模块加载信息和重定位表格式在组合后的改写数据中搜寻待选重定位表;确定单元,用于若所述搜寻单元搜寻到待选重定位表,获取在到达所述OEP的时刻所有重定位项指向内存地址的数据都存在于内存中、并且包含指向的内存地址最小的重定位项的待选重定位表为所述加壳程序对应的原始程序的重定位表;若所述搜寻单元搜寻不到待选重定位表,根据记录的数据改写信息中包括数据改写执行地址、数据改写地址、改写数据和数据改写时间重新建立所述加壳程序对应的原始程序的重定位表。一种程序脱壳方法,包括记录运行加壳程序过程中产生的数据改写信息和模块加载信息,所述数据改写信息包括数据改写执行地址、数据改写地址、改写数据和数据改写时间,所述模块加载信息包括所述加壳程序映射到内存中的基地址和终止地址;确定所述加壳程序对应的原始程序的入口点OEP ;
修复所述加壳程序对应的原始程序的导入表和重定位表,其中修复重定位表的过程具体包括在确定所述加壳程序对应的原始程序的OEP后,根据数据改写时间、数据改写地址和设定的组合规则将记录的数据改写信息中的改写数据进行组合,并根据模块加载信息和重定位表格式在组合后的改写数据中搜寻待选重定位表;若搜寻到待选重定位表,获取在到达所述OEP的时刻所有重定位项指向内存地址的数据都存在于内存中、并且包含指向的内存地址最小的重定位项的待选重定位表为所述加壳程序对应的原始程序的重定位表;若搜寻不到待选重定位表,根据记录的数据改写信息中包括数据改写执行地址、数据改写地址、改写数据和数据改写时间重新建立所述加壳程序对应的原始程序的重定位表;在文件中存储到达所述加壳程序对应的原始程序的OEP时内存中的原始程序。一种程序脱壳装置,包括记录模块,用于记录运行加壳程序过程中产生的数据改写信息和模块加载信息,所述数据改写信息包括数据改写执行地址、数据改写地址、改写数据和数据改写时间,所述模块加载信息包括所述加壳程序映射到内存中的基地址和终止地址;确定模块,用于确定所述加壳程序对应的原始程序的入口点OEP ;修复模块,用于修复所述加壳程序对应的原始程序的导入表和重定位表,其中修复重定位表的过程具体包括在确定所述加壳程序对应的原始程序的OEP后,根据数据改写时间、数据改写地址和设定的组合规则将记录的数据改写信息中的改写数据进行组合,并根据模块加载信息和重定位表格式在组合后的改写数据中搜寻待选重定位表;若搜寻到待选重定位表,获取在到达所述OEP的时刻所有重定位项指向内存地址的数据都存在于内存中、并且包含指向的内存地址最小的重定位项的待选重定位表为所述加壳程序对应的原始程序的重定位表;若搜寻不到待选重定位表,根据记录的数据改写信息中包括数据改写执行地址、数据改写地址、改写数据和数据改写时间重新建立所述加壳程序对应的原始程序的重定位表;存储模块,用于在文件中存储到达所述加壳程序对应的原始程序的OEP时内存中的原始程序。本发明有益效果如下本发明实施例提供的重定位表的修复方法、基于加壳程序的脱壳方法及装置,通过记录运行加壳程序过程中产生的数据改写信息和模块加载信息,所述数据改写信息包括数据改写执行地址、数据改写地址、改写数据和数据改写时间,所述模块加载信息包括所述加壳程序映射到内存中的基地址和终止地址;在确定所述加壳程序对应的原始程序的入口点OEP后,根据数据改写时间、数据改写地址和设定的组合规则将记录的数据改写信息中的改写数据进行组合,并根据模块加载信息和重定位表格式在组合后的改写数据中搜寻待选重定位表;若搜寻到待选重定位表,获取在到达所述OEP的时刻所有重定位项指向内存地址的数据都存在于内存中、并且包含指向的内存地址最小的重定位项的待选重定位表为所述加壳程序对应的原始程序的重定位表;若搜寻不到待选重定位表,根据记录的数据改写信息中包括数据改写执行地址、数据改写地址、改写数据和数据改写时间重新建立所述加壳程序对应的原始程序的重定位表。该方案可以适用于修复各种加壳程序对应的原始程序的重定位表,方法简单,修复效率高。


图1为本发明实施例中重定位的修复方法的流程图;图2为本发明实施例中的原始程序加壳及运行时占用的内存空间的示意图;图3为本发明实施例中重定位的修复装置的结构示意图;图4为本发明实施例中程序脱壳方法的流程图;图5为本发明实施例中确定OEP的流程图;图6为本发明实施例中的可执行程序的结构示意图;图7为本发明实施例中修复导入表的流程图;图8为本发明实施例中的导入表的结构示意图;图9本发明实施例中程序脱壳装置的结构示意图。
具体实施例方式针对现有的重定位表修复方法不能普遍适用于修复各种加壳程序对应的原始程序的重定位表的问题,本发明实施例提供的重定位表的修复方法,该方法的流程如图1所示,执行步骤如下S10:记录运行加壳程序过程中产生的数据改写信息和模块加载信息,数据改写信息包括数据改写执行地址、数据改写地址、改写数据和数据改写时间,模块加载信息包括加壳程序映射到内存中的基地址和终止地址。可以使用虚拟机或者调试器等运行加壳程序,并记录运行过程中产生的数据改写信息和模块加载信息。Sll :在确定加壳程序对应的原始程序的OEP后,根据数据改写时间、数据改写地址和设定的组合规则将记录的数据改写信息中的改写数据进行组合。S12:根据模块加载信息和重定位表格式在组合后的改写数据中搜寻待选重定位表,若搜寻到待选重定位表,执行S13 ;若搜寻不到待选重定位表,执行S14。S13 :获取在到达OEP的时刻所有重定位项指向内存地址的数据都存在于内存中、并且包含指向的内存地址最小的重定位项的待选重定位表为加壳程序对应的原始程序的重定位表。这种情况是重定位表未完全破坏的情况,也就是说壳在还原原始程序过程中,原始程序的的重定位表会在某一时刻出现在内存地址的数据中,甚至在一开始加壳程序就保留原始程序的重定位表在可执行程序中。壳解析原始程序的重定位表,然后修正原始程序需要重定位的数据之后,可以选择清除或者不清除这份重定位表。由于重定位表会在内存地址的数据中出现,所以如果那时将重定位表的数据保存起来,然后在到达OEP后,将保存的重定位表数据填充回去,并更新可执行程序的头部指向的重定位表地址,则成功实现了重定位表的修复,dump后再次运行,可执行程序就能自动解析重定位表。如果搜寻到多个待选重定位表,可以对搜寻到的待选重定位表进行筛选,如图2所示,在到达OEP的时刻所有重定位项指向内存地址的数据都存在于内存中、并且包含指向的内存地址最小的重定位项的待选重定位表为加壳程序对应的原始程序的重定位表。S14:根据记录的数据改写信息中包括数据改写执行地址、数据改写地址、改写数据和数据改写时间重新建立加壳程序对应的原始程序的重定位表。这种情况是壳可以在一开始就完全破坏掉原始程序的重定位表,用自定义的格式来保存原始程序重定位表,当原始程序还原后,解析自定义格式去修正原始程序需要重定位的数据,这样,任何时刻内存地址的数据中都不可能有原始程序的重定位表出现。虽然重定位表完全破坏的情况,不会在某一时刻内存地址的数据中完全重现,但是到达OEP时,需要重定位的数据肯定已经被壳修正,所以,如果能找到这些数据的数据改写地址,就可以根据重定位表结构,重新建立一个新的重定位表,脱壳后,系统以后运行都使用的是新的重定位表,系统都可以根据新重定位表解析每一个重定位项,修正需要重定位的数据。该方案可以适用于修复各种加壳程序对应的原始程序的重定位表,方法简单,修复效率高。具体的,上述Sll中的根据数据改写时间、数据改写地址和设定的组合规则将记录的数据改写信息中的改写数据进行组合,具体包括在记录的数据改写信息中,将数据改写时间连续且数据改写地址连续的数据改写信息所对应的改写数据进行组合;和/或,在记录的数据改写信息中,将数据改写时间连续、至少两个连续的数据改写地址循环的数据改写信息所对应的改写数据进行组合。加壳程序运行过程中,会产生大量的数据改写信息,这些数据改写信息有些是相关的,对于获取重定位表是有贡献的,有些则是离散的,不会对获取重定位表有贡献,由于重定位表往往会出现在连续大块被改写的内存地址中,因此第一种方案,可以获取数据改写信息连续、并且数据改写地址连续的数据改写信肩、O下面以两个具体实例来说明例一在Tl、T2、T3、T4、T5、T6这六个连续的时刻记录的数据改写信息如下表所示,Al、A2、A3、B1、B2、B3表示在相应的内存地址写的数据
权利要求
1.一种重定位表的修复方法,其特征在于,包括记录运行加壳程序过程中产生的数据改写信息和模块加载信息,所述数据改写信息包括数据改写执行地址、数据改写地址、改写数据和数据改写时间,所述模块加载信息包括所述加壳程序映射到内存中的基地址和终止地址;在确定所述加壳程序对应的原始程序的入口点OEP后,根据数据改写时间、数据改写地址和设定的组合规则将记录的数据改写信息中的改写数据进行组合,并根据模块加载信息和重定位表格式在组合后的改写数据中搜寻待选重定位表;若搜寻到待选重定位表,获取在到达所述OEP的时刻所有重定位项指向内存地址的数据都存在于内存中、并且包含指向的内存地址最小的重定位项的待选重定位表为所述加壳程序对应的原始程序的重定位表;若搜寻不到待选重定位表,根据记录的数据改写信息中包括数据改写执行地址、数据改写地址、改写数据和数据改写时间重新建立所述加壳程序对应的原始程序的重定位表。
2.如权利要求1所述的方法,其特征在于,根据数据改写时间、数据改写地址和设定的组合规则将记录的数据改写信息中的改写数据进行组合,具体包括在记录的数据改写信息中,将数据改写时间连续且数据改写地址连续的数据改写信息所对应的改写数据进行组合;和/或,在记录的数据改写信息中,将数据改写时间连续、至少两个连续的数据改写地址循环的数据改写信息所对应的改写数据进行组合。
3.如权利要求1所述的方法,其特征在于,根据模块加载信息和重定位表格式在组合后的改写数据中搜寻待选重定位表,具体包括在所有改写数据的组合中搜寻符合下列条件的待选重定位表所有重定位块的头部包括基地址和地址长度都落入所述模块加载信息中包括的基地址和终止地址范围内,并且地址长度为偶数;每个重定位块包含至少两个重定位项;每个重定位项指向的数据改写地址在到达所述OEP的时刻之前最后两次的改写数据的差值等于所述加壳程序的默认加载基地址与所述加壳程序映射到内存中的基地址之差;写入重定位项中的内存地址顺序排列。
4.如权利要求1所述的方法,其特征在于,根据记录的数据改写信息中包括数据改写执行地址、数据改写地址、改写数据和数据改写时间重新建立所述加壳程序对应的原始程序的重定位表,具体包括计算记录的数据改写信息中每个数据改写地址到达所述OEP的时刻之前最后两次的改写数据的差值;获取计算的差值等于所述加壳程序的默认加载基地址与所述加壳程序映射到内存中的基地址之差的数据改写地址;将获取的数据改写地址中对应的数据改写执行地址相同的数据改写地址分为一组; 从所有分组中选取到达所述OEP的时刻之前最后两次数据改写的数据改写地址顺序排列、且包含的数据改写地址最多的分组;根据选取的分组中每条数据改写信息中包括的数据改写地址生成对应的重定位项;将内存中的原始程序写入文件后,在所述文件末尾添加一个节,在该节中组合生成的重定位项得到重定位表,并修改所述文件头部的重定位信息指向得到的重定位表。
5.一种重定位表的修复装置,其特征在于,包括记录单元,用于记录运行加壳程序过程中产生的数据改写信息和模块加载信息,所述数据改写信息包括数据改写执行地址、数据改写地址、改写数据和数据改写时间,所述模块加载信息包括所述加壳程序映射到内存中的基地址和终止地址;搜寻单元,用于在确定所述加壳程序对应的原始程序的入口点OEP后,根据数据改写时间、数据改写地址和设定的组合规则将记录的数据改写信息中的改写数据进行组合,并根据模块加载信息和重定位表格式在组合后的改写数据中搜寻待选重定位表;确定单元,用于若所述搜寻单元搜寻到待选重定位表,获取在到达所述OEP的时刻所有重定位项指向内存地址的数据都存在于内存中、并且包含指向的内存地址最小的重定位项的待选重定位表为所述加壳程序对应的原始程序的重定位表;若所述搜寻单元搜寻不到待选重定位表,根据记录的数据改写信息中包括数据改写执行地址、数据改写地址、改写数据和数据改写时间重新建立所述加壳程序对应的原始程序的重定位表。
6.如权利要求5所述的装置,其特征在于,所述搜寻单元,具体用于在记录的数据改写信息中,将数据改写时间连续且数据改写地址连续的数据改写信息所对应的改写数据进行组合;和/或,在记录的数据改写信息中,将数据改写时间连续、至少两个连续的数据改写地址循环的数据改写信息所对应的改写数据进行组合。
7.如权利要求5所述的装置,其特征在于,所述搜寻单元,具体用于在所有改写数据的组合中搜寻符合下列条件的待选重定位表所有重定位块的头部包括基地址和地址长度都落入所述模块加载信息中包括的基地址和终止地址范围内,并且地址长度为偶数;每个重定位块包含至少两个重定位项;每个重定位项指向的数据改写地址在到达所述OEP的时刻之前最后两次的改写数据的差值等于所述加壳程序的默认加载基地址与所述加壳程序映射到内存中的基地址之差;写入重定位项中的内存地址顺序排列。
8.如权利要求5所述的装置,其特征在于,所述确定单元,具体用于计算记录的数据改写信息中每个数据改写地址到达所述OEP的时刻之前最后两次的改写数据的差值;获取计算的差值等于所述加壳程序的默认加载基地址与所述加壳程序映射到内存中的基地址之差的数据改写地址;将获取的数据改写地址中对应的数据改写执行地址相同的数据改写地址分为一组; 从所有分组中选取到达所述OEP的时刻之前最后两次数据改写的数据改写地址顺序排列、且包含的数据改写地址最多的分组;根据选取的分组中每条数据改写信息中包括的数据改写地址生成对应的重定位项; 将内存中的原始程序写入文件后,在所述文件末尾添加一个节,在该节中组合生成的重定位项得到重定位表,并修改所述文件头部的重定位信息指向得到的重定位表。
9.一种程序脱壳方法,其特征在于,包括记录运行加壳程序过程中产生的数据改写信息和模块加载信息,所述数据改写信息包括数据改写执行地址、数据改写地址、改写数据和数据改写时间,所述模块加载信息包括所述加壳程序映射到内存中的基地址和终止地址;确定所述加壳程序对应的原始程序的入口点OEP ;修复所述加壳程序对应的原始程序的导入表和重定位表,其中修复重定位表的过程具体包括在确定所述加壳程序对应的原始程序的OEP后,根据数据改写时间、数据改写地址和设定的组合规则将记录的数据改写信息中的改写数据进行组合,并根据模块加载信息和重定位表格式在组合后的改写数据中搜寻待选重定位表;若搜寻到待选重定位表,获取在到达所述OEP的时刻所有重定位项指向内存地址的数据都存在于内存中、并且包含指向的内存地址最小的重定位项的待选重定位表为所述加壳程序对应的原始程序的重定位表;若搜寻不到待选重定位表,根据记录的数据改写信息中包括数据改写执行地址、数据改写地址、改写数据和数据改写时间重新建立所述加壳程序对应的原始程序的重定位表;在文件中存储到达所述加壳程序对应的原始程序的OEP时内存中的原始程序。
10.如权利要求9所述的方法,其特征在于,根据数据改写时间、数据改写地址和设定的组合规则将记录的数据改写信息中的改写数据进行组合,具体包括在记录的数据改写信息中,将数据改写时间连续且数据改写地址连续的数据改写信息所对应的改写数据进行组合;和/或,在记录的数据改写信息中,将数据改写时间连续、至少两个连续的数据改写地址循环的数据改写信息所对应的改写数据进行组合。
11.如权利要求9所述的方法,其特征在于,根据模块加载信息和重定位表格式在组合后的改写数据中搜寻待选重定位表,具体包括在所有改写数据的组合中搜寻符合下列条件的待选重定位表所有重定位块的头部包括基地址和地址长度都落入所述模块加载信息中包括的基地址和终止地址范围内,并且地址长度为偶数;每个重定位块包含至少两个重定位项;每个重定位项指向的数据改写地址在到达所述OEP的时刻之前最后两次的改写数据的差值等于所述加壳程序的默认加载基地址与所述加壳程序映射到内存中的基地址之差;写入重定位项中的内存地址顺序排列。
12.如权利要求9所述的方法,其特征在于,根据记录的数据改写信息中包括数据改写执行地址、数据改写地址、改写数据和数据改写时间重新建立所述加壳程序对应的原始程序的重定位表,具体包括计算记录的数据改写信息中每个数据改写地址到达所述OEP的时刻之前最后两次的改写数据的差值;获取计算的差值等于所述加壳程序的默认加载基地址与所述加壳程序映射到内存中的基地址之差的数据改写地址;将获取的数据改写地址中对应的数据改写执行地址相同的数据改写地址分为一组; 从所有分组中选取到达所述OEP的时刻之前最后两次数据改写的数据改写地址顺序排列、且包含的数据改写地址最多的分组;根据选取的分组中每条数据改写信息中包括的数据改写地址生成对应的重定位项; 将内存中的原始程序写入文件后,在所述文件末尾添加一个节,在该节中组合生成的重定位项得到重定位表,并修改所述文件头部的重定位信息指向得到的重定位表。
13.如权利要求9所述的方法,其特征在于,确定所述加壳程序对应的原始程序的OEP, 具体包括根据记录的数据改写信息确定所述加壳程序运行过程中进入后直到结束没有离开的内存区域;获取记录每条数据改写信息后所述内存区域中每个内存地址的数据,并根据获取的数据计算在对应的数据改写信息中包括的数据改写时间的所述内存区域的熵值;获取熵值开始大于等于设定阈值的数据改写时间对应的数据改写地址为所述加壳程序对应的原始程序的OEP。
14.如权利要求13所述的方法,其特征在于,根据记录的数据改写信息确定所述加壳程序运行过程中进入后直到结束没有离开的内存区域,具体包括遍历记录的数据改写信息,获取在连续的数据改写时间对应的时间长度内,数据改写地址连续且连续的数据改写地址对应的内存地址范围大于等于设定长度的内存地址范围作为待选内存区域;根据所述数据改写信息中包括的数据改写执行地址,确定所述加壳程序运行过程中进入后直到结束没有离开的最后一个待选内存区域作为所述内存区域。
15.如权利要求13所述的方法,其特征在于,还包括记录所述加壳程序运行过程中产生的模块加载信息,所述模块加载信息包括所述加壳程序映射到内存中的基地址和结束地址;以及根据记录的数据改写信息和模块加载信息确定所述加壳程序运行过程中进入后直到结束没有离开的内存区域。
16.如权利要求15所述的方法,其特征在于,根据记录的数据改写信息和模块加载信息确定所述加壳程序运行过程中进入后直到结束没有离开的内存区域,具体包括获取所述加壳程序运行过程中最后一条数据改写信息中包括的数据改写地址;将所述基地址与获取的最后一条数据改写信息中包括的数据改写地址之间的内存地址范围作为所述内存区域。
17.如权利要求13所述的方法,其特征在于,根据记录的数据改写信息和模块加载信息确定所述加壳程序运行过程中进入后直到结束没有离开的内存区域,具体包括若所述模块加载信息中包括加壳程序对应的原始程序的资源节,确定所述资源节映射到内存中的最小内存地址;将所述基地址与所述最小内存地址之间的内存地址范围作为所述内存区域。
18.如权利要求13-17任一所述的方法,其特征在于,根据获取的数据计算在对应的数据改写信息中包括的数据改写时间的所述内存区域的熵值,具体包括确定内存地址中的数据可能的种类;根据获取的数据统计确定出的每种数据出现的次数,以及获取的数据的总个数;用每种数据出现的次数除以获取的数据的总个数得到对应数据出现的频率,计算得到的频率的均值;计算得到的频率的方差,所述方差作为在对应的数据改写信息中包括的数据改写时间的所述内存区域的熵值。
19.如权利要求9所述的方法,其特征在于,修复所述加壳程序对应的原始程序的导入表,具体包括记录运行加壳程序过程中产生的数据改写信息和模块加载信息,所述数据改写信息包括数据改写执行地址、数据改写地址、改写数据和数据改写时间,所述模块加载信息包括所述加壳程序映射到内存中的基地址和结束地址;在确定所述加壳程序对应的原始程序的入口点OEP后,根据数据改写时间、数据改写地址和设定的组合规则将记录的数据改写信息中的改写数据进行组合,并根据模块加载信息和导入表格式在组合后的改写数据中搜寻待选导入表;若搜寻到待选导入表,确定每个待选导入表对应的导入地址表,获取在到达所述OEP 的时刻存在于内存中、并且内存地址最小的导入地址表,将获取的导入地址表对应的待选导入表作为所述加壳程序对应的原始程序的导入表;若搜寻不到待选导入表,根据记录的数据改写信息中包括数据改写执行地址、数据改写地址、改写数据和数据改写时间重新建立所述加壳程序对应的原始程序的导入表。
20.如权利要求19所述的方法,其特征在于,根据数据改写时间、数据改写地址和设定的组合规则将记录的数据改写信息中的改写数据进行组合,具体包括在记录的数据改写信息中,将数据改写时间连续且数据改写地址连续的数据改写信息所对应的改写数据进行组合;和/或,在记录的数据改写信息中,将数据改写时间连续、至少两个连续的数据改写地址循环的数据改写信息所对应的改写数据进行组合。
21.如权利要求19所述的方法,其特征在于,所述模块加载信息还包括加载模块的名称,根据模块加载信息和导入表格式在组合后的改写数据中搜寻待选导入表,具体包括在所有改写数据的组合中搜寻符合下列条件的待选导入表大小大于等于第一设定字节;原始第一存根OFT指向的内存地址不为零,且落入所述模块加载信息中包括的基地址和结束地址范围内;OFT指向的内存地址为零,第一存根FT指向的内存地址不为零且落入所述模块加载信息中包括的基地址和结束地址范围内;模块名称虚拟地址偏移Name RVA与所述基地址的和指向的内存地址落入所述模块加载信息中包括的基地址和结束地址范围内,且Name RVA与所述基地址的和指向的内存地址中的模块包含在所述模块加载信息包括的加载模块的名称中;OFT和FT指向的内存地址中的函数包含在所述模块加载信息包括的加载模块对应的函数中。
22.如权利要求19所述的方法,其特征在于,所述数据改写信息还包括改写长度,根据记录的数据改写信息重新建立所述加壳程序对应的原始程序的导入表,具体包括在到达所述OEP的时刻之前记录的数据改写信息中,获取改写数据为函数地址、改写长度为第二设定字节的数据改写信息;将获取的数据改写信息中包括的数据改写执行地址相同的数据改写信息分为一组;从所有分组中选取数据改写地址顺序排列、且包含的数据改写地址最多的分组,选取的分组中的数据改写信息中的改写数据指向的函数包含在所述模块加载信息包括的加载模块对应的函数中,选取的分组中的数据改写信息中的改写数据指向的函数中归属于同一加载模块的相邻;根据选取的分组中每条数据改写信息中包括的改写数据,确定所述加壳程序对应的原始程度的导入地址表;从确定的导入地址表中获取运行所述加壳程序对应的原始程序时所需的函数库及每个函数库中的函数;根据获取的函数库及每个函数库的函数重新建立所述加壳程序对应的原始程序的导入表。
23.如权利要求19所述的方法,其特征在于,还包括记录运行加壳程序过程中产生的代码块信息,所述代码块信息包括代码块的起始地址和结束地址;根据记录的代码块信息重新建立所述加壳程序对应的原始程序的导入表。
24.如权利要求23所述的方法,其特征在于,根据记录的代码块信息重新建立所述加壳程序对应的原始程序的导入表,具体包括在到达所述OEP的时刻之后记录的代码块信息中,获取调用第一个函数的内存地址;根据获取的内存地址,确定所述加壳程序对应的原始程度的导入地址表;从确定的导入地址表中获取运行所述加壳程序对应的原始程序时所需的函数库及每个函数库中的函数;根据获取的函数库及每个函数库的函数重新建立所述加壳程序对应的原始程序的导入表。
25.一种程序脱壳装置,其特征在于,包括记录模块,用于记录运行加壳程序过程中产生的数据改写信息和模块加载信息,所述数据改写信息包括数据改写执行地址、数据改写地址、改写数据和数据改写时间,所述模块加载信息包括所述加壳程序映射到内存中的基地址和终止地址;确定模块,用于确定所述加壳程序对应的原始程序的入口点OEP ;修复模块,用于修复所述加壳程序对应的原始程序的导入表和重定位表,其中修复重定位表的过程具体包括在确定所述加壳程序对应的原始程序的OEP后,根据数据改写时间、数据改写地址和设定的组合规则将记录的数据改写信息中的改写数据进行组合,并根据模块加载信息和重定位表格式在组合后的改写数据中搜寻待选重定位表;若搜寻到待选重定位表,获取在到达所述OEP的时刻所有重定位项指向内存地址的数据都存在于内存中、并且包含指向的内存地址最小的重定位项的待选重定位表为所述加壳程序对应的原始程序的重定位表;若搜寻不到待选重定位表,根据记录的数据改写信息中包括数据改写执行地址、数据改写地址、改写数据和数据改写时间重新建立所述加壳程序对应的原始程序的重定位表;存储模块,用于在文件中存储到达所述加壳程序对应的原始程序的OEP时内存中的原始程序。
26.如权利要求25所述的装置,其特征在于,所述修复模块,具体用于在记录的数据改写信息中,将数据改写时间连续且数据改写地址连续的数据改写信息所对应的改写数据进行组合;和/或,在记录的数据改写信息中,将数据改写时间连续、至少两个连续的数据改写地址循环的数据改写信息所对应的改写数据进行组合。
27.如权利要求25所述的装置,其特征在于,所述修复模块,具体用于在所有改写数据的组合中搜寻符合下列条件的待选重定位表所有重定位块的头部包括基地址和地址长度都落入所述模块加载信息中包括的基地址和终止地址范围内,并且地址长度为偶数;每个重定位块包含至少两个重定位项;每个重定位项指向的数据改写地址在到达所述OEP的时刻之前最后两次的改写数据的差值等于所述加壳程序的默认加载基地址与所述加壳程序映射到内存中的基地址之差;写入重定位项中的内存地址顺序排列。
28.如权利要求25所述的装置,其特征在于,所述修复模块,具体用于计算记录的数据改写信息中每个数据改写地址到达所述OEP的时刻之前最后两次的改写数据的差值;获取计算的差值等于所述加壳程序的默认加载基地址与所述加壳程序映射到内存中的基地址之差的数据改写地址;将获取的数据改写地址中对应的数据改写执行地址相同的数据改写地址分为一组; 从所有分组中选取到达所述OEP的时刻之前最后两次数据改写的数据改写地址顺序排列、且包含的数据改写地址最多的分组;根据选取的分组中每条数据改写信息中包括的数据改写地址生成对应的重定位项; 将内存中的原始程序写入文件后,在所述文件末尾添加一个节,在该节中组合生成的重定位项得到重定位表,并修改所述文件头部的重定位信息指向得到的重定位表。
29.如权利要求25所述的装置,其特征在于,所述确定模块,具体用于根据记录的数据改写信息确定所述加壳程序运行过程中进入后直到结束没有离开的内存区域;获取记录每条数据改写信息后所述内存区域中每个内存地址的数据,并根据获取的数据计算在对应的数据改写信息中包括的数据改写时间的所述内存区域的熵值;获取熵值开始大于等于设定阈值的数据改写时间对应的数据改写地址为所述加壳程序对应的原始程序的0ΕΡ。
30.如权利要求29所述的装置,其特征在于,所述确定模块,具体用于遍历记录的数据改写信息,获取在连续的数据改写时间对应的时间长度内,数据改写地址连续且连续的数据改写地址对应的内存地址范围大于等于设定长度的内存地址范围作为待选内存区域;根据所述数据改写信息中包括的数据改写执行地址,确定所述加壳程序运行过程中进入后直到结束没有离开的最后一个待选内存区域作为所述内存区域。
31.如权利要求29所述的装置,其特征在于,所述确定模块,还用于记录所述加壳程序运行过程中产生的模块加载信息,所述模块加载信息包括所述加壳程序映射到内存中的基地址和结束地址;以及根据记录的数据改写信息和模块加载信息确定所述加壳程序运行过程中进入后直到结束没有离开的内存区域。
32.如权利要求31所述的装置,其特征在于,所述确定模块,具体用于获取所述加壳程序运行过程中最后一条数据改写信息中包括的数据改写地址;将所述基地址与获取的最后一条数据改写信息中包括的数据改写地址之间的内存地址范围作为所述内存区域。
33.如权利要求29所述的装置,其特征在于,所述确定模块,具体用于若所述模块加载信息中包括加壳程序对应的原始程序的资源节,确定所述资源节映射到内存中的最小内存地址;将所述基地址与所述最小内存地址之间的内存地址范围作为所述内存区域。
34.如权利要求29-33任一所述的装置,其特征在于,所述确定模块,具体用于确定内存地址中的数据可能的种类;根据获取的数据统计确定出的每种数据出现的次数,以及获取的数据的总个数;用每种数据出现的次数除以获取的数据的总个数得到对应数据出现的频率,计算得到的频率的均值;计算得到的频率的方差,所述方差作为在对应的数据改写信息中包括的数据改写时间的所述内存区域的熵值。
35.如权利要求25所述的装置,其特征在于,所述修复模块,具体用于记录运行加壳程序过程中产生的数据改写信息和模块加载信息,所述数据改写信息包括数据改写执行地址、数据改写地址、改写数据和数据改写时间,所述模块加载信息包括所述加壳程序映射到内存中的基地址和结束地址;在确定所述加壳程序对应的原始程序的入口点OEP后,根据数据改写时间、数据改写地址和设定的组合规则将记录的数据改写信息中的改写数据进行组合,并根据模块加载信息和导入表格式在组合后的改写数据中搜寻待选导入表;若搜寻到待选导入表,确定每个待选导入表对应的导入地址表,获取在到达所述OEP 的时刻存在于内存中、并且内存地址最小的导入地址表,将获取的导入地址表对应的待选导入表作为所述加壳程序对应的原始程序的导入表;若搜寻不到待选导入表,根据记录的数据改写信息中包括数据改写执行地址、数据改写地址、改写数据和数据改写时间重新建立所述加壳程序对应的原始程序的导入表。
36.如权利要求35所述的装置,其特征在于,所述修复模块,具体用于在记录的数据改写信息中,将数据改写时间连续且数据改写地址连续的数据改写信息所对应的改写数据进行组合;和/或,在记录的数据改写信息中,将数据改写时间连续、至少两个连续的数据改写地址循环的数据改写信息所对应的改写数据进行组合。
37.如权利要求35所述的装置,其特征在于,所述修复模块,具体用于在所有改写数据的组合中搜寻符合下列条件的待选导入表大小大于等于第一设定字节;原始第一存根OFT指向的内存地址不为零,且落入所述模块加载信息中包括的基地址和结束地址范围内;OFT指向的内存地址为零,第一存根FT指向的内存地址不为零且落入所述模块加载信息中包括的基地址和结束地址范围内;模块名称虚拟地址偏移Name RVA与所述基地址的和指向的内存地址落入所述模块加载信息中包括的基地址和结束地址范围内,且Name RVA与所述基地址的和指向的内存地址中的模块包含在所述模块加载信息包括的加载模块的名称中;OFT和FT指向的内存地址中的函数包含在所述模块加载信息包括的加载模块对应的函数中。
38.如权利要求35所述的装置,其特征在于,所述修复模块,具体用于在到达所述OEP的时刻之前记录的数据改写信息中,获取改写数据为函数地址、改写长度为第二设定字节的数据改写信息;将获取的数据改写信息中包括的数据改写执行地址相同的数据改写信息分为一组; 从所有分组中选取数据改写地址顺序排列、且包含的数据改写地址最多的分组,选取的分组中的数据改写信息中的改写数据指向的函数包含在所述模块加载信息包括的加载模块对应的函数中,选取的分组中的数据改写信息中的改写数据指向的函数中归属于同一加载模块的相邻;根据选取的分组中每条数据改写信息中包括的改写数据,确定所述加壳程序对应的原始程度的导入地址表;从确定的导入地址表中获取运行所述加壳程序对应的原始程序时所需的函数库及每个函数库中的函数;根据获取的函数库及每个函数库的函数重新建立所述加壳程序对应的原始程序的导入表。
39.如权利要求35所述的装置,其特征在于,所述修复模块,还用于记录运行加壳程序过程中产生的代码块信息,所述代码块信息包括代码块的起始地址和结束地址;根据记录的代码块信息重新建立所述加壳程序对应的原始程序的导入表。
40.如权利要求39所述的装置,其特征在于,所述修复模块,具体用于在到达所述OEP的时刻之后记录的代码块信息中,获取调用第一个函数的内存地址; 根据获取的内存地址,确定所述加壳程序对应的原始程度的导入地址表;从确定的导入地址表中获取运行所述加壳程序对应的原始程序时所需的函数库及每个函数库中的函数;根据获取的函数库及每个函数库的函数重新建立所述加壳程序对应的原始程序的导入表。
全文摘要
本发明公开了一种重定位表的修复方法、程序脱壳方法及相关装置,该方法包括记录运行加壳程序过程中产生的数据改写信息和模块加载信息;在确定加壳程序对应的原始程序的OEP后,将记录的数据改写信息中的改写数据进行组合,并根据模块加载信息和重定位表格式在组合后的改写数据中搜寻待选重定位表;若搜寻到待选重定位表,获取在到达OEP的时刻所有重定位项指向内存地址的数据都存在于内存中、并且包含指向的内存地址最小的重定位项的待选重定位表为所述加壳程序对应的原始程序的重定位表;若搜寻不到,重新建立重定位表。方案可以适用于修复各种加壳程序对应的原始程序的重定位表,方法简单,修复效率高。
文档编号G06F9/44GK103019739SQ20121058772
公开日2013年4月3日 申请日期2012年12月28日 优先权日2012年12月28日
发明者陈锦, 刘业欣 申请人:北京神州绿盟信息安全科技股份有限公司, 北京神州绿盟科技有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1