论文部分内容阅读
随着信息化的发展和相关产业的不断成熟,计算机和软件系统已经成为了人们工作和生活中不可缺少的部分和提升效率的工具。提升软件系统本身的安全性成为了所有的安全机构和软件厂商关注的重点。代码混淆技术作为软件安全领域的主流技术,正在被广泛使用在对软件系统的保护中,借助代码混淆技术,可以在不必借助安全硬件或者密钥等方式的前提下,借助程序本身的逻辑来保护程序内部的重要信息和关键算法,从而保证软件系统的安全,确保软件系统的开发者或者用户的利益不会受到侵害。近年来随着代码混淆技术研究的不断进步,相关领域已经取得了一些重要的研究成果,对软件系统中知识产权和数据的保护起到了有效的遏制作用,但是,这方面依然有很多的问题在困扰着研究人员。本文从基于CO-Vine IL (Vine Intermediate Language for Code Obfuscation)中间语言的混淆预处理模型,基于SJT-BF (Second Jump and Transform based on Branch Function)的静态混淆算法,基于需求驱动符号执行的动态混淆算法,基于多点函数的动静结合混淆算法四个方面,从不同的角度以提升二进制程序的混淆效果为整体目标进行了研究,研究的主要内容和贡献如下:首先,对原始程序的混淆分为源码级别的混淆和二进制程序的混淆,本文主要研究二进制程序的混淆。二进制程序到汇编语言的转换是混淆预处理的前提,但是由于汇编代码无法提供程序执行状态中具体的细节信息,很容易增加分析的错误率,降低效率。本文提出了基于CO-Vine IL中间语言的混淆预处理模型,其中CO-Vine IL的中间形式为混淆预处理提供了更多的关于程序寄存器,内存,变量等的状态信息,并通过混淆的预处理算法提升了准确性,同时能够形成更加清晰的控制流图,有效提升效率。第二,静态的二进制代码混淆技术主要集中在汇编层,有效抵御线性扫描和递归往复两种反汇编方法是主要目标。复杂化控制流是混淆的主要方式,而复杂化程度的增加会导致程序性能的大幅下降。本文提出了基于SJT-BF的静态混淆算法,其中Junk Instruction用来延迟线性扫描方法的重同步特性。Branch Function函数通过实现对JMP指令的混淆来抵御递归往复方法。通过对Junk Instruction中数据再利用和Branch Function跳转地址的变形隐藏,可以降低控制流的复杂度,保证混淆效果的同时提升程序的性能。算法的设计和实现基于汇编层,算法的指令定位基于CO-Vine IL中间语言。横向和纵向的对比测试表明,混淆强度平均提升20%的前提下,性能开销大概只增加2%左右。第三,动态的代码混淆技术有自修改代码和动态路径执行两种方式,自修改代码方式的缺陷是程序运行时会有指令还原的窗口期,容易被跟踪逆向。动态路径执行方式避免了这个缺陷,但是地址固定的路径分派函数容易被定位,同时两种混淆方式进行了额外的运行时混淆操作,会导致程序性能的下降。本文基于动态路径执行方式提出了需求驱动符号执行动态混淆算法,该算法利用跳跃结点的连接来创建新的执行路径,通过制造路径爆炸的效果实现对程序的混淆,利用跳跃结点的动态分布性避免分派函数被定位。结点摘要信息保存路径的执行状态,避免重复计算,提升执行效率。利用需求驱动信息减少关键结点的执行次数,提升程序的黑盒特性。实验测试表明,随着跳跃结点的线性增加,逆向工具生成的执行路径和遍历时间呈爆炸式的增长,极大的提升了程序被还原的难度。最后,不透明谓词是代码混淆的关键技术,但是存在两个方面的缺陷:一是不透明谓词的功能逻辑相互孤立,容易被各个击破。二是黑盒特性的不足,混淆效果不够理想。本文提出了基于多点函数的动静结合混淆算法,该算法首先利用多点函数的黑盒特性和收敛特性来增强不透明谓词的混淆强度,并且利用多点函数的多输入多输出特性来对不透明谓词相互关联,避免不透明谓词由于个体的脆弱性导致混淆效果的整体下降。其次是该算法做为代码混淆模型中的一种功能性算法,利用算法的逻辑特性结合本文提出的静态混淆算法和动态混淆算法,这种结合方式也提升了单一混淆算法的混淆效果。通过与AA算法和PA算法的对比测试表明,混淆程度平均提升10%的前提下,混淆强度提升达到20%,而性能开销只呈现线性增长。