一种程序链接的编译方法及装置与流程

文档序号:12063441阅读:209来源:国知局
一种程序链接的编译方法及装置与流程

本发明涉及计算机技术领域,尤其涉及一种程序链接的编译方法及装置。



背景技术:

随着信息技术的高速发展,利用广泛开放的网络环境进行通信已经成为时代发展的趋势。网络在提供开发和共享资源的同时,也不可避免的存在安全风险,如果计算机软件系统(操作系统、共享库、中间件、应用程序)存在漏洞,熟悉系统的攻击者就可以通过网络利用这些漏洞来执行恶意代码,并进行非法操作。

对系统进行攻击的一个前提是攻击者对系统尤其是程序的代码地址空间分布有一定的了解,然后才能通过精心构造的代码使得进程执行攻击者预先设置好的攻击代码来控制系统。应对这种攻击,一般采用地址随机化的方法来进行保护。软件代码地址随机化后,攻击者无法将程序的执行流程跳转到预期的地址来执行攻击代码,从而有效的降低攻击者攻击成功的概率。如图1所示为现有技术中随机分配程序地址的过程状态示意图,将输入文件的代码节Func1、Func2、Func3和Func4合并至输出文件的代码节,将输入文件的数据节Var1、Var2、Var3和Var4合并至输出文件的数据节。

传统的地址随机化工作通常在系统层面来完成。系统在启动程序时,将程序中的各个组件(主程序、动态库、堆栈)的基地址进行随机化处理,这样的随机化过程虽然实现简单、额外开销较小,但也存在如下问题:①粒度较粗,组件内部的地址分布仍然是固定的,攻击者仍然可以调用操作系统接口,获得各组件的起始地址,结合暴力破解和相对地址来实施攻击。由于大量的开源代码在商业项目的应用,攻击者可以使用预先编译好的程序来获取这些开源代码组件内部的地址分布。②不够灵活,要么系统内所有的程序均采用地址随机化,要么都不采用地址随机化,无法根据应用程序自身的特点和安全需求来自行开 启该项功能。③随机数的选取由系统决定,部分随机数的生成还与系统时间相关,攻击者在获取了系统的随机数生成规则和系统时间后较容易进行破解。



技术实现要素:

本发明实施例的目的在于提供一种程序链接的编译方法及装置,可以进一步提高程序内函数和变量符号的随机性,从而降低了程序被成功攻击的可能性,提高程序的安全性。

为了实现上述目的,本发明实施例提供一种程序链接的编译方法,所述编译方法包括:

获取待链接文件,依据所述待链接文件中的函数或变量符号,将所述待链接文件中的节进行拆分,获得多个输入节;

对每一所述输入节随机化地分配索引值;

依据每一所述输入节的所述索引值,将相应的函数或变量符号合并至一链接输出文件中。

其中,所述依据所述待链接文件中的函数或变量符号,将所述待链接文件中的节进行拆分,获得多个输入节,具体包括:

读取所述待链接文件中当前所处理节的符号表信息;

依据所述符号表信息,查找当前所处理节的函数或变量符号,依次选定当前所处理节中预设数量的函数或变量符号作为一组,为每一组创建新节,获得与当前所处理节相对应的多个所述输入节。

其中,所述依次选定当前所处理节中预设数量的函数或变量符号作为一组,为每一组创建新节之后,所述方法还包括:

读取所述待链接文件中所有的节信息,判断所述待链接文件中的所有节是否拆分完毕,当未拆分完毕时,则继续读取待链接文件中下一个未处理节的符号表信息,依次选定下一个未处理节中预设数量的函数或变量符号作为一组,为每一组创建新节,获得多个所述输入节;

依次选定每一个未处理节中预设数量的函数或变量符号作为一组,为每一组创建新节,获得多个所述输入节。

其中,所述对每一所述输入节随机化地分配索引值,具体包括:

获取多个随机事件的数值参数,根据所述数值参数,生成随机种子,其中所述随机事件包括:当前编译主机发生中断、当前用户终端输入或者读取当前编译主机的系统时间,相应的,所述数值参数包括:当前编译主机发生中断的次数数值、当前用户终端输入的数值或者所读取的当前编译主机的系统时间数值;

根据所述随机种子生成随机序列;

获取所述待链接文件中拆分后的每一所述输入节,根据所述随机序列为拆分后的每一个所述输入节分配索引值。

其中,所述根据所述随机序列为拆分后的每一个所述输入节分配索引值,具体包括:

为当前所述输入节选定一索引值;

检测为当前所述输入节所选定的索引值是否已经被使用,如果已被使用,再次调用所述随机序列为所述输入节分配一新索引值;

若为当前所述输入节所选定的索引值未被使用,则标记选定的索引值已被使用,并将选定的索引值赋予相应的所述输入节。

其中,所述依据每一所述输入节的所述索引值,将相应的函数或变量符号合并至一链接输出文件中,具体为:

根据所述输入节的索引值确定所述输入节在链接输出文件中的偏移地址,根据所述偏移地址将所述输入节合并至链接输出文件中的一确定位置。

本发明实施例还提供一种程序链接的编译装置,所述编译装置包括:

处理模块,用于获取待链接文件,依据所述待链接文件中的函数或变量符号,将所述待链接文件中的节进行拆分,获得多个输入节;

分配模块,用于对每一所述输入节随机化地分配索引值;

合并模块,用于依据每一所述输入节的所述索引值,将相应的函数或变量符号合并至一链接输出文件中。

其中,所述处理模块包括:

读取子模块,用于读取所述待链接文件中当前所处理节的符号表信息;

创建子模块,用于依据所述符号表信息,查找当前所处理节的函数或变量符号,依次选定当前所处理节中预设数量的函数或变量符号作为一组,为每一 组创建新节,获得与当前所处理节相对应的多个所述输入节。

其中,所述处理模块还包括:

第一处理子模块,用于在所述创建子模块依次选定当前所处理节中预设数量的函数或变量符号作为一组,为每一组创建新节之后,读取所述待链接文件中所有的节信息,判断所述待链接文件中的所有节是否拆分完毕,当未拆分完毕时,则继续读取待链接文件中下一个未处理节的符号表信息,依次选定下一个未处理节中预设数量的函数或变量符号作为一组,为每一组创建新节,获得多个所述输入节;

第二处理子模块,用于依次选定每一个未处理节中预设数量的函数或变量符号作为一组,为每一组创建新节,获得多个所述输入节。

其中,所述分配模块包括:

第一生成子模块,用于获取多个随机事件的数值参数,根据所述数值参数,生成随机种子,其中所述随机事件包括:当前编译主机发生中断、当前用户终端输入或者读取当前编译主机的系统时间,相应的,所述数值参数包括:当前编译主机发生中断的次数数值、当前用户终端输入的数值或者所读取的当前编译主机的系统时间数值;

第二生成子模块,用于根据所述随机种子生成随机序列;

分配子模块,用于获取所述待链接文件中拆分后的每一所述输入节,根据所述随机序列为拆分后的每一个所述输入节分配索引值。

其中,所述分配子模块包括:

选定子单元,用于为当前所述输入节选定一索引值;

第一处理子单元,用于检测为当前所述输入节所选定的索引值是否已经被使用,如果已被使用,再次调用所述随机序列为所述输入节分配一新索引值;

第二处理子单元,用于若为当前所述输入节所选定的索引值未被使用,则标记选定的索引值已被使用,并将选定的索引值赋予相应的所述输入节。

其中,所述合并模块进一步用于:

根据所述输入节的索引值确定所述输入节在链接输出文件中的偏移地址,根据所述偏移地址将所述输入节合并至链接输出文件中的一确定位置。

本发明实施例的上述技术方案的有益效果如下:

通过在待链接文件的各个节中依次选定预设数量的函数或变量符号作为一组,为每一组创建新节,获得多个输入节,根据预先生成的随机序列,为每一个输入节随机化分配索引值,依据索引值将相应的函数或变量符号合并至一链接输出文件中,可以进一步提高程序内函数和变量符号的随机性,从而降低了程序被成功攻击的可能性,提高程序的安全性。

附图说明

图1为现有技术中随机分配程序地址的过程状态示意图;

图2为本发明实施例程序链接的编译方法步骤示意图;

图3为采用本发明实施例的方法后随机分配程序地址的过程状态示意图;

图4为本发明实施例的拆分待链接文件中节的过程示意图;

图5为本发明实施例的随机分配索引的流程示意图;

图6为本发明实施例的程序链接的编译方法整体流程示意图;

图7为本发明实施例的程序链接的编译装置示意图。

具体实施方式

为使本发明要解决的技术问题、技术方案和优点更加清楚,下面将结合附图及具体实施例进行详细描述。

本发明实施例提供一种程序链接的编译方法,如图2所示,所述编译方法包括:

步骤S10、获取待链接文件,依据所述待链接文件中的函数或变量符号,将所述待链接文件中的节进行拆分,获得多个输入节;

步骤S11、对每一所述输入节随机化地分配索引值;

步骤S12、依据每一所述输入节的所述索引值,将相应的函数或变量符号合并至一链接输出文件中。

获取待链接文件后,将待链接文件的各个节进行拆分,获得拆分后的输入节,拆分后获得的输入节中所包含的函数或变量符号的数量小于原节中函数或变量符号的数量,拆分后的输入节中函数或变量符号的数量可以预先设定,输入节中的函数或变量符号的数量越少,拆分所得的输入节的数量越多。输入节 中的函数或变量符号的数量越少,输入节的数量越多时,在对每一输入节随机化地分配索引值时,函数或变量符号的随机性越大,可以降低程序被成功攻击的可能性,进而提高程序的安全性。在获取拆分后的各个输入节后,需要为输入节随机化地分配索引值,然后依据每一输入节的索引值,将相应的函数或变量符号合并至一链接输出文件中。

如图3所示,为采用本发明实施例的方法后随机分配程序地址的过程状态示意图,将输入文件的合并的代码节Func1、Func2拆分成独立的Func1和Func2;将合并的代码节Func3、Func4拆分成独立的Func3和Func4;将输入文件的合并的数据节Var1、Var2拆分成独立的Var1和Var2;将合并的数据节Var3、Var4拆分成独立的Var3和Var4。最后将输入文件中的代码节Func1、Func2、Func3和Func4合并至输出文件的代码节,将输入文件的数据节Var1、Var2、Var3和Var4合并至输出文件的数据节。

通过在待链接文件的各个节中依次选定预设数量的函数或变量符号作为一组,为每一组创建新节,获得多个输入节,根据预先生成的随机序列,为每一个输入节随机化分配索引值,依据索引值将相应的函数或变量符号合并至一链接输出文件中,可以进一步提高程序内函数和变量符号的随机性,从而降低了程序被成功攻击的可能性,提高程序的安全性。

在本发明上述实施例中,步骤S10依据所述待链接文件中的函数或变量符号,将所述待链接文件中的节进行拆分,获得多个输入节,具体包括:

步骤S101、读取所述待链接文件中当前所处理节的符号表信息;

步骤S102、依据所述符号表信息,查找当前所处理节的函数或变量符号,依次选定当前所处理节中预设数量的函数或变量符号作为一组,为每一组创建新节,获得与当前所处理节相对应的多个所述输入节。

具体的,在对待链接文件中的节进行拆分时,首先读取待链接文件中当前正处理节的符号表信息,依据获取的符号表信息,查找到相应的函数或变量符号。然后对当前所处理节进行拆分,在拆分时,按照预先设定的每组中所包含的函数或变量符号的数量对当前所处理节的函数或变量符号进行分组,然后为每一组创建一新节,获得多个输入节。

在本发明上述实施例中,步骤S102依次选定当前所处理节中预设数量的 函数或变量符号作为一组,为每一组创建新节之后,所述方法还包括:

步骤S103、读取所述待链接文件中所有的节信息,判断所述待链接文件中的所有节是否拆分完毕,当未拆分完毕时,则继续读取待链接文件中下一个未处理节的符号表信息,依次选定下一个未处理节中预设数量的函数或变量符号作为一组,为每一组创建新节,获得多个所述输入节;

步骤S104、依次选定每一个未处理节中预设数量的函数或变量符号作为一组,为每一组创建新节,获得多个所述输入节。

具体的,在将当前所处理节拆分为多个输入节后,需要判断待链接文件中的所有的节是否都已经拆分完毕,在判断时需要依据待链接文件中所有的节信息进行判断。如果未拆分完毕,需要读取待链接文件中下一个未处理节的符号表信息,在下一个未处理节中依次选定预设数量的函数或变量符号作为一组,为每一组创建新节,获得多个输入节。当下一个未处理节拆分完毕后,需要继续对待链接文件中剩余的其他未处理节进行拆分,直至将每一个未处理节全部拆分完毕。在拆分过程中,每一组中所包含的函数或变量符号都是预先设置的,可以根据程序的安全性的需求,对每组中所包含的函数或变量符号的数量进行变更,当一组中所包含的函数或变量符号的数量越少,程序内函数和变量符号的随机性越大,程序被成功攻击的可能性就越低,进而可以提高程序的安全性。

如图4所示,为本发明实施例拆分待链接文件中节的过程示意图:

步骤S201、获取所有待链接文件的信息;

步骤S202、判断所有待链接文件是否处理完毕,若处理完毕则结束流程,若未处理完毕,进入下一步骤;

步骤S203、读取待链接文件的节信息和符号表信息;

步骤S204、判断该待链接文件的所有节是否处理完毕;如果处理完毕则返回步骤S202,如果未处理完毕,则进入步骤S205;

步骤S205、查找所有位于该节的符号,这里的符号可以是函数或者变量符号;

步骤S206、判断该节的符号是否处理完毕,若处理完毕,则进入步骤S208删除该节;若未处理完毕,则进入步骤S207为该符号创建一个新节。

在本发明上述实施例中,步骤S11对每一所述输入节随机化地分配索引值, 具体包括:

步骤S110、获取多个随机事件的数值参数,根据所述数值参数,生成随机种子,其中所述随机事件包括:当前编译主机发生中断、当前用户终端输入或者读取当前编译主机的系统时间,相应的,所述数值参数包括:当前编译主机发生中断的次数数值、当前用户终端输入的数值或者所读取的当前编译主机的系统时间数值;

步骤S111、根据所述随机种子生成随机序列;

步骤S112、获取所述待链接文件中拆分后的每一所述输入节,根据所述随机序列为拆分后的每一个所述输入节分配索引值。

具体的,首先获取多个随机事件的数值参数,然后根据获取的数值参数生成随机种子,再根据随机种子生成随机序列。获得随机序列后,根据随机序列为拆分后的每一输入节分配一索引值。具体的,是为输入节中的函数或变量符号分配索引值,输入节中可以包含一个函数或变量符号,也可以包括多个函数或变量符号,需要说明的是,这里的多个函数或变量符号的数量小于待链接文件的节中所包含的函数或变量符号的数量。当输入节中仅包含一个函数或变量符号时,此时待链接文件中的节拆分的最为彻底,一个函数或变量符号对应一索引值,此时程序内函数和变量符号的随机性也相应增大,程序被成功攻击的可能性就会随之降低,进而程序的安全性也相对提高。当输入节中包含三个函数或变量符号时,相对于输入节中仅包含一个函数或变量符号而言,此时程序内函数和变量符号的随机性相应减小,程序被成功攻击的可能性就会随之增加,进而程序的安全性也相对减弱,这时三个函数或变量符号形成的一组,对应一索引值。

在本发明上述实施例中,步骤S112根据所述随机序列为拆分后的每一个所述输入节分配索引值,具体包括:

为当前所述输入节选定一索引值;

检测为当前所述输入节所选定的索引值是否已经被使用,如果已被使用,再次调用所述随机序列为所述输入节分配一新索引值;

若为当前所述输入节所选定的索引值未被使用,则标记选定的索引值已被使用,并将选定的索引值赋予相应的所述输入节。

具体的,首先为当前的输入节选定一索引值,然后对选定的索引值进行检测,判定当前选定的索引值是否已经被使用,如果检测结果表明选定的索引值已经被使用,则需要调用随机序列为当前输入节分配一新的索引值;如果检测结果表明选定的索引值未被使用,则需要对选定的索引值进行标记,表明选定的索引值已经被占用,避免其他输入节对该索引值的占用,并将选定的索引值赋予当前输入节中。

如图5所示,为本发明实施例随机分配索引的流程示意图;

步骤S301、统计所有的输出节的信息;

步骤S302、判断输出节是否处理完毕,若处理完毕则结束流程,否则进入下一步骤;

步骤S303、读取输出节对应的所有输入节的信息,并进行数目统计;

步骤S304、判断所有的输入节是否处理完毕,若处理完毕则返回判断输出节是否处理完毕的步骤S302,若未处理完毕,则进入步骤S305;

步骤S305、生成对应数目的随机数;

步骤S306、选定一随机数,并判断选定的随机数是否已经分配给其他输入节,若分配了,则继续生成新的随机数,若未分配,则进行下一步骤;

步骤S307、将该随机数作为当前输入节的索引,然后返回判断所有输入节是否处理完毕的步骤S304。

在本发明上述实施例中,步骤S12具体为:

根据所述输入节的索引值确定所述输入节在链接输出文件中的偏移地址,根据所述偏移地址将所述输入节合并至链接输出文件中的一确定位置。

具体的,在将相应的函数或变量符号合并至一链接输出文件中时,首先需要确定相应的函数或变量符号所在的输入节所对应的索引值,根据相应的索引值确定输入节在链接输出文件中的偏移地址,然后根据偏移地址,将输入节,确切的说是将输入节中的函数或变量符号合并至链接输出文件中的一确定位置。

如图6所示,为本发明实施例程序链接的编译方法整体流程示意图:

步骤S401、重新拆分待链接文件中的节,保证一个节中只有少量的函数或者变量符号,保证节合入的规则不变;

其中少量的函数或者变量符号,是与原节进行比较而言,拆分后的每个节中所包含的函数或者变量符号的数量小于原节中函数或变量符号的数量,进一步的,拆分后的节中所包含的函数或者变量符号的数量越少,那么程序的安全性也相对提高。

步骤S402、对需要合并到同一个输出节中的所有输入节,建立索引并进行随机化处理;

步骤S403、确定每个输入节的索引后,根据其索引值及所有索引值的排序大小,确认每个输入节在输出节中的偏移;

步骤S404、合并所有输入节到输出节中,结束流程。

本发明实施例提供一种程序链接的编译装置,如图7所示,所述编译装置包括:

处理模块20,用于获取待链接文件,依据所述待链接文件中的函数或变量符号,将所述待链接文件中的节进行拆分,获得多个输入节;

分配模块30,用于对每一所述输入节随机化地分配索引值;

合并模块40,用于依据每一所述输入节的所述索引值,将相应的函数或变量符号合并至一链接输出文件中。

在本发明上述实施例中,所述处理模块20包括:

读取子模块21,用于读取所述待链接文件中当前所处理节的符号表信息;

创建子模块22,用于依据所述符号表信息,查找当前所处理节的函数或变量符号,依次选定当前所处理节中预设数量的函数或变量符号作为一组,为每一组创建新节,获得与当前所处理节相对应的多个所述输入节。

在本发明上述实施例中,所述处理模块20还包括:

第一处理子模块23,用于在所述创建子模块22依次选定当前所处理节中预设数量的函数或变量符号作为一组,为每一组创建新节之后,读取所述待链接文件中所有的节信息,判断所述待链接文件中的所有节是否拆分完毕,当未拆分完毕时,则继续读取待链接文件中下一个未处理节的符号表信息,依次选定下一个未处理节中预设数量的函数或变量符号作为一组,为每一组创建新节,获得多个所述输入节;

第二处理子模块24,用于依次选定每一个未处理节中预设数量的函数或 变量符号作为一组,为每一组创建新节,获得多个所述输入节。

在本发明上述实施例中,所述分配模块30包括:

第一生成子模块31,用于获取多个随机事件的数值参数,根据所述数值参数,生成随机种子,其中所述随机事件包括:当前编译主机发生中断、当前用户终端输入或者读取当前编译主机的系统时间,相应的,所述数值参数包括:当前编译主机发生中断的次数数值、当前用户终端输入的数值或者所读取的当前编译主机的系统时间数值;

第二生成子模块32,用于根据所述随机种子生成随机序列;

分配子模块33,用于获取所述待链接文件中拆分后的每一所述输入节,根据所述随机序列为拆分后的每一个所述输入节分配索引值。

在本发明上述实施例中,所述分配子模块33包括:

选定子单元331,用于为当前所述输入节选定一索引值;

第一处理子单元332,用于检测为当前所述输入节所选定的索引值是否已经被使用,如果已被使用,再次调用所述随机序列为所述输入节分配一新索引值;

第二处理子单元333,用于若为当前所述输入节所选定的索引值未被使用,则标记选定的索引值已被使用,并将选定的索引值赋予相应的所述输入节。

在本发明上述实施例中,所述合并模块40进一步用于:

根据所述输入节的索引值确定所述输入节在链接输出文件中的偏移地址,根据所述偏移地址将所述输入节合并至链接输出文件中的一确定位置。

本发明实施例程序链接的编译方法,通过在待链接文件的各个节中依次选定预设数量的函数或变量符号作为一组,为每一组创建新节,获得多个输入节,根据预先生成的随机序列,为每一个输入节随机化分配索引值,依据索引值将相应的函数或变量符号合并至一链接输出文件中,可以进一步提高程序内函数和变量符号的随机性,从而降低了程序被成功攻击的可能性,提高程序的安全性。

需要说明的是,本发明实施例提供的程序链接的编译装置是应用上述方法的装置,则上述方法的所有实施例均适用于该装置,且均能达到相同或相似的有益效果。

以上所述是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明所述原理的前提下,还可以作出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1