首页 / 一种生成随机布局程序的方法及装置

一种生成随机布局程序的方法及装置有效专利 发明

技术领域

[0001] 本发明涉及计算机软件系统安全领域,特别涉及一种生成随机布局程序的方法及装置。

相关背景技术

[0002] 当前,计算机系统中越来越多的使用开源软件,这在降低计算机系统软件成本的同时,也引入了很多安全隐患。
[0003] 软件系统都有缺陷,但开源软件的缺陷更容易成为安全漏洞,其原因在于,攻击者可以通过开放的源代码了解到程序的关键逻辑和内存布局,从程序逻辑上,攻击者可以获得缓冲区溢出等漏洞的攻击点,再根据已知的内存布局,攻击者就能够通过伪造数据来控制被攻击的系统。图1是现有技术提供的未进行布局随机化的编译过程示意图,如图1所示,代码中的变量和函数相对分布被原样体现在了生成的程序中,容易受到攻击。
[0004] 修复所有漏洞是不现实的,但是通过将程序的内存布局进行随机化,可以阻断许多危险的攻击,并大大增加其余攻击的难度。
[0005] 目前常见的内存布局随机化方法是通过加载器来实现的基地址随机化,这种方法虽然实现简单,但是由于程序内部的相对内存布局固定,难以对缓冲区溢出等危险攻击进行有效的阻断。
[0006] 另外,对应用程序加密或进行代码混淆也可以提供一定的安全防护,但是这类技术通常具有较大的性能开销,并且在程序故障时存在难以调试和定位的问题。

具体实施方式

[0036] 以下结合附图对本发明的优选实施例进行详细说明,应当理解,以下所说明的优选实施例仅用于说明和解释本发明,并不用于限定本发明。
[0037] 图2是本发明实施例提供的生成随机布局程序的方法流程图,如图2所示,步骤包括:
[0038] 步骤S101:对于需要进行随机布局的程序,生成用来对所述程序进行随机布局的随机数。
[0039] 步骤S102:构建所述程序的函数信息块和/或变量信息块。
[0040] 具体地说,按照所述程序的输入顺序,从所述程序中依次获取函数,并将所获取的每个函数作为一个函数信息块进行缓存;和/或按照所述程序的输入顺序,从所述程序中依次获取全局变量,并将所获取的每个全局变量作为一个全局变量信息块进行缓存。
[0041] 步骤S103:利用所生成的随机数,对所述函数信息块和/或所述变量信息块的位置进行调整,形成随机布局程序。
[0042] 具体地说,为所缓存的每个函数信息块获取一个随机数,并按照随机数的大小,对每个函数信息块的位置进行排序;和/或为所缓存的每个变量信息块获取一个随机数,并按照随机数的大小,对每个变量信息块的位置进行排序。
[0043] 在程序编译期间,可以在编译器中采用本发明所述的方法,图3是本发明实施例提供的进行布局随机化的编译过程示意图,如图3所示,在编译器输出汇编文件之前,利用布局随机化装置(即生成随机布局程序的装置)进行布局随机化处理后,变量和函数的相对位置关系发生了变化,根据源代码无法猜测出程序运行时的变量和函数布局,从而提高了软件系统的抗攻击能力。
[0044] 所述变量可以是全局变量。
[0045] 图4是本发明实施例提供的生成随机布局程序的装置的内部模块示意图,如图4所示,包括随机数生成模块10、输入模块20、排序模块30、输出模块40。
[0046] 随机数生成模块10用于对需要进行随机布局的程序,生成用来对所述程序进行随机布局的随机数。也就是说,随机数生成模块10负责生成无规律的随机数,实现方式包括但不限于使用纯软件方法生成随机数,根据随机事件(例如中断数、网络通信信息)软件生成随机数,直接读取特定硬件提供的随机数等。
[0047] 输入模块20用于构建所述程序的函数信息块和/或变量信息块。具体地说,输入模块20接收外部顺序输入的函数和/或变量,对于需要随机化布局的函数,输入模块20按照输入顺序,从所述程序中依次获取函数,并将所获取的每个函数作为一个函数信息块进行缓存;对于需要随机化布局的变量,例如全局变量,输入模块20按照外部输入所述程序的顺序,从所述程序中依次获取变量,并将所获取的每个变量作为一个变量信息块进行缓存。
[0048] 排序模块30用于利用所生成的随机数,对所述函数信息块和/或变量信息块的位置进行调整,形成随机布局程序。所述随机布局程序包含排序后的函数信息块和/或变量信息块。具体地说,对于需要随机化布局的函数,排序模块30读取输入模块20缓存的函数信息块(即关于函数的顺序分块数据),并为所缓存的每个函数信息块获取一个随机数,然后按照随机数的大小,对每个函数信息块的位置进行排序,并输出排序后的函数信息块;对于需要随机化布局的变量,例如全局变量,排序模块30读取输入模块20缓存的变量信息块(即关于变量的顺序分块数据),并为所缓存的每个变量信息块获取一个随机数,然后按照随机数的大小,对每个变量信息块的位置进行排序,并输出排序后的变量信息块。
[0049] 输出模块40用于输出所述随机布局程序,即按照随机顺序输出函数和/或变量。
[0050] 图5是将图4所示装置嵌入到编译器中实现时的工作示意图,如图5所示,所述装置的工作流程如下:
[0051] 步骤1:在编译器内部的汇编文件输出之前,插入对输入模块20的调用。
[0052] 步骤2:输入模块20判断是否需要进行随机化布局,若判断不需要进行随机化布局处理,则返回并进行汇编文件输出,若判断需要进行随机化布局处理,则对需要随机化布局的函数信息和/或全局变量信息依次进行分块缓存,对其余信息不做处理。
[0053] 步骤3:在编译器完成单个源文件的全部编译动作后,调用排序模块30。
[0054] 步骤4:排序模块30根据随机数生成模块10的输出,为每一个被缓存的信息块获取一个对应的随机数。
[0055] 步骤5:在所有信息块都获得对应的随机数后,排序模块30依据信息块的随机数大小对信息块进行重新排序。完成排序后,排序模块30将重排后的信息块顺序传递给输出模块40。
[0056] 步骤6:输出模块40顺序将信息块的内容写入汇编文件中。
[0057] 上述信息块包括函数信息块和/或(全局)变量信息块。
[0058] 优选在编译器内部实施的原因是,此时本发明所述装置可以获得最为完整的代码信息,保证变形过程的正确性,同时,可以与其他代码保护技术同时实施,进一步增强抗攻击能力,并且可以保证输出程序的调试信息正确。
[0059] 通过新增的定制编译流程,本发明能够使得编译器每次编译生成的程序拥有不同的内存布局(包括但不限于函数和全局变量),以较小的时空性能代价,大大增强软件系统的抗攻击能力。
[0060] 综上,本发明提供的方法具体包括:
[0061] 1、在编译流程中加入如图4所示装置,修改函数编译后的输出顺序,将原有的按源代码顺序输出改为随机顺序输出。具体地说,在进行编译时,从随机数生成模块10中为每一个函数取得一个随机数。按照函数对应的随机数大小,排定函数输出的顺序。排列函数的实施方式包括但不限于:在实际编译前,调整输入到实际编译流程的函数顺序;在实际编译后,调整函数输出到文件的顺序。
[0062] 2、在编译流程中加入如图4所示的装置,将原有的全局变量布局从按源代码顺序改为随机顺序。具体地说,在进行编译时,从随机数生成模块10中为每一个全局变量取得一个随机数。按照全局变量对应的随机数大小,排定变量的相对顺序。排列变量的实施方式包括但不限于:在实际编译前,调整进入编译流程的变量顺序;在实际编译后,调整变量输出到文件的顺序。
[0063] 图6是可实施本发明的其他位点示意图,如图6所示,本发明在程序编译阶段,除了在编译器中生成随机布局程序,还可以在其它多个位点生成随机布局程序,例如在源代码预编译时,在源代码级进行程序的内存布局随机化调整;在汇编代码输入汇编器前,针对汇编文件进行内存布局随机化调整;在汇编器内部进行内存布局随机化调整等等。
[0064] 在其他位点实施的装置也都具有类似的组成结构和工作原理,其核心逻辑包括分块缓存输入的顺序数据,为每一个分块(即信息块)获得对应的随机数,利用该随机数对分块数据进行排序,最后输出排序后的数据。
[0065] 尽管上文对本发明进行了详细说明,但是本发明不限于此,本技术领域技术人员可以根据本发明的原理进行各种修改。因此,凡按照本发明原理所作的修改,都应当理解为落入本发明的保护范围。

当前第1页 第1页 第2页 第3页
相关技术
方法装置相关技术
生成随机相关技术
谢宝友发明人的其他相关专利技术