您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > 二进制代码混淆的国内外研究现状
二进制代码混淆的国内外研究现状一.国内外研究现状南开大学贾春福《路径模糊一种有效抵抗符号执行的二进制混淆技术》提出了一种新的基于路径模糊的软件保护方法以抵抗符号执行的逆向分析:利用条件异常代码替换条件跳转指令来隐藏程序的路径分支信息,通过系统的异常处理机制实现程序的跳转,并使用不透明谓词技术引入伪造的路径分支来弥补程序在统计属性上的差异。电子科技大学吴适《基于二进制代码混淆的软件保护研究》提出一种新的C2D转换的混淆算法—基于代码-数据欺骗的混淆算法,该算法的目的是为了在静态分析工具中隐藏目标基本块及到目标基本块的控制流,当反汇编器遇上条件跳转指令时,跳转指令中的目标地址和跳转指令紧接着的地址都会被解释成指令。令绝对跳转指令(jmp,ret)后面的地址为A,当使用递归遍历算法时,若没有其他指令跳转到A,则A不会被解释成指令;当使用顺序扫描算法时,A地址处存在无法被解释的指令,则会跳过对A的反汇编。利用这两点规律,将真正的控制转移隐藏在某条指令的数据部分中,还可以将指令隐藏在代码段的静态数据中。西北大学王怀军《基于变形的二进制代码混淆技术研究》研究并实现了二进制代码混淆保护原型系统MEPE,MEPE系统变形部分主要包含3方面研究内容:1)指令等价变形,主要通过设计指令变形的模板函数,利用模板函数对原始指令进行等价变形。2)控制流混淆,通过打乱原来指令的物理顺序,利用跳转地址表管理指令执行顺序;3)循环体中指令变形的控制,首先分析循环结构对时间开销的影响,然后提出控制循环体中指令变形和控制流混淆的方法。南开大学王志《二进制代码路径混淆技术研究》提出了一种全新的线性代码混淆策略,该策略将未解数学猜想引入到软件的路径信息中,将基于符号执行和约束求解技术的逆向工程难度等价到证明未解数学猜想的难度。在代码混淆中只使用线性操作,不使用加密函数。多项式等价变换、收敛值变换、固定循环次数变换和相似控制流变换是基于未解数学猜想的路径混淆所特有的变换方式,多态和变形技术是常用的代码变换技术,由于基于未解数学猜想的路径混淆有很好的可扩展性,这些代码变换技术可以直接应用到混淆后代码中。Collberg《ATaxonomyofObfuscationTransformations.DepartmentofComputerScience》第一次针对JAVA程序提出了代码混淆。Collberg在其技术报告中提出了混淆转换的定义、混淆算法的详细分类及其有效性评估方法,该报告中根据其分类描述了混淆转换的一般性算法,这些算法能够应用于大部分流行的高级程序语言的代码混淆。根据Collberg的分类,混淆转换可以分为词法结构混淆又称布局混淆、控制流混淆、数据混淆以及针对特定反混淆器的预防性混淆。Cohen《OperatingSystemProtectionthroughProgramEvolution》论述了将代码混淆作为一种技术用于增加软件代码的多样性,其使用了重排指令顺序,增加或者删除跳转指令和反内联函数等方法,在不改变代码语义的情况下对软件的指令或指令序列进行替换,利用软件代码的多样性增加攻击者对软件进行逆向分析和篡改的难度。CWang《Asecurityarchitectureforsurvivabilitymechanisms:[dissertation]》针对静态逆向反编译技术提出了基于控制流退化(degenerationofcontrolflow)的高级语言代码混淆策略,通过间接跳转对控制流重新整合,并在数据流中引入指针别名操作,有效地提高了软件代码的复杂度,并降低了静态逆向反编译的精度。LinnC《ObfuscationofexecutablecodetoimproveresistancetostaticDisassembly》等人针对静态反汇编技术提出了一种二进制代码混淆方案。反汇编技术是将二进制机器代码转换成汇编指令,是逆向分析和推理的基础,常用的反汇编算法有线性扫描算法(linearsweepalgorithm)和递归遍历算法(recursivetraversalalgorithm)。针对线性扫描算法难以区分代码和数据的问题,Linn等人提出了分支反转(branchflipping)技术,在条件跳转指令之后加入垃圾数据以阻止线性扫描算法的分析。针对递归遍历算法以控制流为基础进行反汇编的特点,Linn等人提出了分支函数(branchfunctions)技术,将控制流中显而易见的直接跳转指令和函数调用指令隐藏在分支函数中,并引入不透明谓词(opaquepredicates)和跳转表欺骗(jumptablespoofing)技术误导反汇编的递归遍历算法。Wang和Linn等人的混淆策略都利用了静态逆向分析难以处理指针别名的问题,将控制流的静态逆向分析由线性复杂度变成NP完全问题。Kanzaki《ExploitingSelf-ModificationMechanismforProgramProtection》利用二进制代码自修改机制(self-modifyingmechanism)对软件中的重要代码进行伪装。首先,用不可执行的垃圾指令对软件原始的二进制指令进行伪装;然后,在软件执行中利用二进制代码的自修改机制动态地生成原始指令并替换伪装代码;最后,将已经执行过的原始指令再次使用垃圾指令进行覆盖。Birrer利用程序碎片技术和跳转表使混淆后的软件二进制代码具有变形能力。Kanzaki和Birrer等人提出的两种代码混淆策略隐藏了软件代码或控制流,使其在执行过程中才动态的展现出来,其混淆的对象是静态反汇编和反编译技术。多样性是生物系统健壮的重要保证。当前软件系统大部分是同构系统,缺乏多样性。Forrest《BuildingDiverseComputerSystems.Proceedingsofthe6thWorkshoponHotTopicsinOperatingSystems》提出了利用混淆堆栈数据的方式增加软件代码的多样性,在保持软件的用户体验、功能性和效率的基础上,提高了软件的抗攻击能力。Bhatkar《AddressObfuscation:anEfcientApproachtoCombataBroadRangeofMemoryErrorExploits》提出了地址混淆的策略,在Forrest等人的工作基础上对软件中的代码和数据地址进行混淆变换,进一步提升了软件代码的健壮性。2007年,Popov《Binaryobfuscationusingsignals.ProceedingsoftheUSENIXSecuritySymposium》提出了一种基于Linux信号机制的二进制代码混淆技术:使用各种产生异常信号的代码替换程序中的jmp、ret和call等跳转指令来混淆程序的执行过程。二进制代码中读写内存、算术运算和调用系统函数等操作,都有可能产生系统异常信号,因此,静态逆向分析工具很难准确判定在执行过程中二进制代码是否会产生异常信号。但是,该技术无法对二进制代码的路径分支进行混淆,因此,它不能缓解软件执行过程中的信息泄露问题。2008年,Sharif《ImpedingmalwareanalysisusingconditionalcodeObfuscation》等人提出了一种基于哈希函数代码混淆策略,用哈希值替换路径分支条件中的常量,利用哈希函数的单向性增加逆向工程的难度,但是,哈希函数不具有保序性,即无法保证当xy时,Hash(x)Hash(y)成立。因此,该混淆策略具有局限性,只能保护等于关系的路径分支条件。2011年,Falcarin《ExploitingCodeMobilityforDynamicBinaryObfuscation》等人将软件核心代码放到网络上的一个可信实体中,该实体在攻击者的控制之外,利用代码的流动性使软件在执行过程中动态获得这些代码,减少攻击者对软件整个二进制代码的能见度,从而限制攻击者的知识并阻止其逆向工程。2011年,Ceccato《RemoteSoftwareProtectionUsingOrthogonalReplacement》等人提出了基于正交替换(orthogonalreplacement)的客户端混淆策略,通过设置客户端代码的有效期,软件客户端在运行过程中与远程可信服务器进行频繁的代码替换,使软件代码不断的更新,增加攻击者进行逆向工程的难度。Falcarin和Ceccato提出的混淆策略都是基于网络交互的,在不可信主机上运行的软件代码都是不完整的,软件的执行过程需要由远程可信服务器决定,而且每次执行的代码都是定制的,这样迫使攻击者不断面对软件的变化,增加逆向工程的复杂度。而且,本地代码的不完整性也干扰了攻击者对软件行为的静态预测能力。但是,由于网络带宽和延迟的限制,应用程序与可信的远程服务器的频繁交互过程将致使软件的运行效率远远低于本地执行,因此大部分软件还是以二进制本地代码形式发布,服务器端运行保护(protectionbyserver-sideexecution)并非对所有应用程序都适用。二.代码混淆技术的分类Collberg等人根据各种代码混淆技术变换对象的不同将混淆分为四类:布局混淆、数据混淆、控制混淆和预防混淆。1.布局混淆布局混淆(layoutobfuscation)是指删除或者混淆软件源代码或者中间代码中与执行无关的辅助文本信息,增加攻击者阅读和理解代码的难度。软件源代码中的注释文本、调试信息可以直接删除,用不到的方法和类等代码或数据结构也可以删除,这样即可以使攻击者难以理解代码的语义,也可以减小软件体积,提高软件装载和执行的效率。软件代码中的常量名、变量名、类名和方法名等标识符的命名规则和字面意义有利于攻击者对代码的理解,布局混淆通过混淆这些标识符增加攻击者对软件代码理解的难度。标识符混淆的方法有多种,例如哈希函数命名、标识符交换和重载归纳等。哈希函数命名是简单地将原来标识符的字符串替换成该字符串的哈希值,这样标识符的字符串就与软件代码不相关了;标识符交换是指先收集软件代码中所有的标识符字符串,然后再随机地分配给不同的标识符,该方法不易被攻击者察觉;重载归纳是指利用高级编程语言命名规则中的一些特点,例如在不同的命名空间中变量名可以相同,使软件中不同的标识符尽量使用相同的字符串,增加攻击者对软件源代码的理解难度。布局混淆是最简单的混淆方法,它不改变软件的代码和执行过程。由于攻击者通常无法直接获取软件的源代码,因而布局混淆的保护能力较弱。布局混淆常用于Java字节码和.Net中间代码MSIL的混淆,例如Crema、SourceGuard、yGuard和Jaurora等。2.数据混淆数据混淆是指在不影响软件功能的前提下,变换软件代码中的数据或数据格式,增加软件代码的复杂度。根据混淆方式不同,数据混淆可以分为存储和编码变换、聚集变换和次序变换等。存储和编码变换通过混淆软件代码中变量的存储方式和编码方式来消除变量的含义,使它们的操作和用途变得晦涩难懂。主要的混淆方法包括以下几种:(1)分割变量,把一个二进制变量v拆分成两个二进制变量p和q,然后通过函数建立p、q与v之间的映射关系,并建立基于新的变量编码结构的运算规则。(2)将简单的标量变成复杂的对象结构,例如,在Java语言中可以将整型变量变成与整型相关的对象结构。(3)改变变量的生命周期,例如,将一个局部变量变成一个全局变量。(4)将静态数据用函数表示,例如,软件代码中的字符串常量用一个函数来动态构造等。(5)修改编码方式,例如,用更复杂的等价的多项式替换数组变量原始的下标表达式等。聚集变换是指通过将多个数据聚集在一起形成新的数据结构,实现隐藏原始数据格式的目的。聚集变换常用于混淆面向对象的高级语言,聚集方式有数组聚集和对象聚集两种,聚集方法有以下几种:(1)合并标量变量,将多个变量V1,…,Vn合并成一个变量Vm,例如将两个32位的整数变量x和y合并成一个64位的整数变量z,其合并函数是z=232x+y。(2)重新构造数组来混淆数组
本文标题:二进制代码混淆的国内外研究现状
链接地址:https://www.777doc.com/doc-2739076 .html