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

技术编号:8532570 阅读:337 留言:0更新日期:2013-04-04 15:25
本发明专利技术公开了一种重定位表的修复方法、程序脱壳方法及相关装置,该方法包括:记录运行加壳程序过程中产生的数据改写信息和模块加载信息;在确定加壳程序对应的原始程序的OEP后,将记录的数据改写信息中的改写数据进行组合,并根据模块加载信息和重定位表格式在组合后的改写数据中搜寻待选重定位表;若搜寻到待选重定位表,获取在到达OEP的时刻所有重定位项指向内存地址的数据都存在于内存中、并且包含指向的内存地址最小的重定位项的待选重定位表为所述加壳程序对应的原始程序的重定位表;若搜寻不到,重新建立重定位表。方案可以适用于修复各种加壳程序对应的原始程序的重定位表,方法简单,修复效率高。

【技术实现步骤摘要】

本专利技术涉及计算机
,尤指一种重定位表的修复方法、程序脱壳方法及相关装置
技术介绍
加壳是可执行程序资源压缩的简称,是保护文件的常用手段,其原理是利用特殊的算法,对可执行程序里的资源进行压缩、加密。加壳程序可以直接运行,但是不能获取原始程序,要经过脱壳才可以获取。脱壳的过程主要为三步第一步,确定原始程序的入口点(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的时刻所有重定位项指向内存地址的数据都存在于内存中、并且包含指向的内存地址最小的重定位项的待选重定位表为所述加壳程序对应的原始程序的重定位表;若搜寻不到待选重定位表,根据记录的数据改写信息中包括数据改写执行地址、数据改写地址、改写数据和数据改写时间重新建立所述加壳程序对应的原始程序的重定位表;存储模块,用于在文件中存储到达所述加壳程序对应的原始程序的OE本文档来自技高网
...

【技术保护点】
一种重定位表的修复方法,其特征在于,包括:记录运行加壳程序过程中产生的数据改写信息和模块加载信息,所述数据改写信息包括数据改写执行地址、数据改写地址、改写数据和数据改写时间,所述模块加载信息包括所述加壳程序映射到内存中的基地址和终止地址;在确定所述加壳程序对应的原始程序的入口点OEP后,根据数据改写时间、数据改写地址和设定的组合规则将记录的数据改写信息中的改写数据进行组合,并根据模块加载信息和重定位表格式在组合后的改写数据中搜寻待选重定位表;若搜寻到待选重定位表,获取在到达所述OEP的时刻所有重定位项指向内存地址的数据都存在于内存中、并且包含指向的内存地址最小的重定位项的待选重定位表为所述加壳程序对应的原始程序的重定位表;若搜寻不到待选重定位表,根据记录的数据改写信息中包括数据改写执行地址、数据改写地址、改写数据和数据改写时间重新建立所述加壳程序对应的原始程序的重定位表。

【技术特征摘要】
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 的时刻存在于内存中、并且内存地址最小的导入地址表,将获取的导入地址表对应的待选导入表作为所述加壳程序对应的原始程序的...

【专利技术属性】
技术研发人员:陈锦刘业欣
申请(专利权)人:北京神州绿盟信息安全科技股份有限公司北京神州绿盟科技有限公司
类型:发明
国别省市:

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

1