版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 二进制代码混淆的国内外研究(ynji)现状国内外研究(ynji)现状南开大学(nn ki d xu) 贾春福 路径模糊一种有效抵抗符号执行的二进制混淆技术提出了一种新的基于路径模糊的软件保护方法以抵抗符号执行的逆向分析:利用条件异常代码替换条件跳转指令来隐藏程序的路径分支信息,通过系统的异常处理机制实现程序的跳转,并使用不透明谓词技术引入伪造的路径分支来弥补程序在统计属性上的差异。电子科技大学 吴适 基于二进制代码混淆的软件保护研究提出一种新的 C2D 转换的混淆算法基于代码-数据欺骗的混淆算法,该算法的目的是为了在静态分析工具中隐藏目标基本块及到目标基本块的控制流,当反汇编器遇上条件跳转指
2、令时,跳转指令中的目标地址和跳转指令紧接着的地址都会被解释成指令。 令绝对跳转指令(jmp,ret)后面的地址为 A,当使用递归遍历算法时,若没有其他指令跳转到 A,则 A 不会被解释成指令;当使用顺序扫描算法时,A 地址处存在无法被解释的指令,则会跳过对 A 的反汇编。利用这两点规律,将真正的控制转移隐藏在某条指令的数据部分中,还可以将指令隐藏在代码段的静态数据中。西北大学 王怀军 基于变形的二进制代码混淆技术研究研究并实现了二进制代码混淆保护原型系统MEPE,MEPE 系统变形部分主要包含3 方面研究内容: 1) 指令等价变形,主要通过设计指令变形的模板函数,利用模板函数对原始指令进行等价
3、变形。2) 控制流混淆,通过打乱原来指令的物理顺序,利用跳转地址表管理指令执行顺序; 3) 循环体中指令变形的控制,首先分析循环结构对时间开销的影响,然后提出控制循环体中指令变形和控制流混淆的方法。南开大学 王志 二进制代码路径混淆技术研究提出了一种全新的线性代码混淆策略,该策略将未解数学猜想引入到软件的路径信息中,将基于符号执行和约束求解技术的逆向工程难度等价到证明未解数学猜想的难度。在代码混淆中只使用线性操作,不使用加密函数。多项式等价变换、收敛值变换、固定循环次数变换和相似控制流变换是基于未解数学猜想的路径混淆所特有的变换方式,多态和变形技术是常用的代码变换技术,由于基于未解数学猜想的路
4、径混淆有很好的可扩展性,这些代码变换技术可以直接应用到混淆后代码中。Collberg A Taxonomy of Obfuscation Transformations.Department of Computer Science第一次针对 JAVA 程序提出了代码混淆。Collberg 在其技术报告中提出了混淆转换的定义、混淆算法的详细分类及其有效性评估方法(fngf),该报告中根据其分类描述了混淆转换的一般性算法,这些算法能够应用于大部分流行的高级程序语言的代码混淆。根据 Collberg 的分类,混淆转换可以分为词法结构混淆又称布局混淆、控制流混淆、数据混淆以及针对特定反混淆器的预防性混
5、淆。Cohen Operating System Protection through Program Evolution论述了将代码混淆作为一种技术用于增加软件代码的多样性,其使用了重排指令顺序,增加或者删除跳转指令和反内联函数等方法,在不改变代码语义的情况下对软件的指令或指令序列进行替换,利用软件代码的多样性增加攻击者对软件进行逆向(n xin)分析和篡改的难度。C WangA security architecture for survivability mechanisms:dissertation针对静态逆向反编译技术提出了基于控制流退化(degeneration of contro
6、l flow)的高级语言代码混淆策略,通过间接跳转对控制流重新(chngxn)整合,并在数据流中引入指针别名操作,有效地提高了软件代码的复杂度,并降低了静态逆向反编译的精度。Linn C Obfuscation of executable code to improve resistance to staticDisassembly等人针对静态反汇编技术提出了一种二进制代码混淆方案。反汇编技术是将二进制机器代码转换成汇编指令,是逆向分析和推理的基础,常用的反汇编算法有线性扫描算法(linear sweep algorithm)和递归遍历算法(recursivetraversal algorit
7、hm)。针对线性扫描算法难以区分代码和数据的问题,Linn 等人提出了分支反转(branch flipping)技术,在条件跳转指令之后加入垃圾数据以阻止线性扫描算法的分析。针对递归遍历算法以控制流为基础进行反汇编的特点,Linn 等人提出了分支函数(branch functions)技术,将控制流中显而易见的直接跳转指令和函数调用指令隐藏在分支函数中,并引入不透明谓词(opaquepredicates)和跳转表欺骗(jump table spoofing)技术误导反汇编的递归遍历算法。Wang 和 Linn 等人的混淆策略都利用了静态逆向分析难以处理指针别名的问题,将控制流的静态逆向分析由线
8、性复杂度变成 NP 完全问题。 KanzakiExploiting Self-Modification Mechanism for Program Protection利用二进制代码自修改机制(self-modifying mechanism)对软件中的重要代码进行伪装。首先,用不可执行的垃圾指令对软件原始的二进制指令进行伪装;然后,在软件执行中利用二进制代码的自修改机制动态地生成原始指令并替换伪装代码;最后,将已经执行过的原始指令再次使用垃圾指令进行覆盖。Birrer 利用程序碎片技术和跳转表使混淆后的软件二进制代码具有变形能力。Kanzaki 和 Birrer 等人提出的两种代码混淆策略隐
9、藏了软件代码或控制流,使其在执行过程中才动态的展现出来,其混淆的对象是静态反汇编和反编译技术。多样性是生物系统健壮的重要保证。当前软件系统大部分是同构系统,缺乏多样性。Forrest Building Diverse Computer Systems. Proceedings of the6th Workshop on Hot Topics in Operating Systems提出了利用混淆堆栈数据的方式增加软件代码的多样性,在保持软件的用户(yngh)体验、功能性和效率的基础上,提高了软件的抗攻击能力。Bhatkar Address Obfuscation: an Efcient App
10、roach to Combat aBroad Range of Memory Error Exploits提出了地址混淆的策略,在 Forrest 等人的工作基础上对软件中的代码(di m)和数据地址进行混淆变换,进一步提升了软件代码的健壮性。2007 年,Popov Binary obfuscation using signals. Proceedings of theUSENIX Security Symposium提出了一种基于Linux信号机制的二进制代码混淆技术:使用各种产生异常信号的代码替换程序中的 jmp、ret 和 call 等跳转指令来混淆程序的执行过程。二进制代码中读写内存
11、、算术运算和调用系统函数等操作,都有可能产生系统异常信号,因此,静态逆向分析工具很难准确判定在执行过程中二进制代码是否会产生异常信号。但是,该技术无法对二进制代码的路径分支进行混淆,因此,它不能缓解软件执行过程中的信息(xnx)泄露问题。2008 年,Sharif Impeding malware analysis using conditional codeObfuscation等人提出了一种基于哈希函数代码混淆策略,用哈希值替换路径分支条件中的常量,利用哈希函数的单向性增加逆向工程的难度,但是,哈希函数不具有保序性,即无法保证当 x y 时,Hash(x) Hash(y)成立。因此,该混淆
12、策略具有局限性,只能保护等于关系的路径分支条件。2011 年,Falcarin Exploiting Code Mobility for Dynamic BinaryObfuscation等人将软件核心代码放到网络上的一个可信实体中,该实体在攻击者的控制之外,利用代码的流动性使软件在执行过程中动态获得这些代码,减少攻击者对软件整个二进制代码的能见度,从而限制攻击者的知识并阻止其逆向工程。2011 年,Ceccato Remote Software Protection Using Orthogonal Replacement 等人提出了基于正交替换(orthogonal replacement
13、)的客户端混淆策略,通过设置客户端代码的有效期,软件客户端在运行过程中与远程可信服务器进行频繁的代码替换,使软件代码不断的更新,增加攻击者进行逆向工程的难度。Falcarin 和 Ceccato 提出的混淆策略都是基于网络交互的,在不可信主机上运行的软件代码都是不完整的,软件的执行过程需要由远程可信服务器决定,而且每次执行的代码都是定制的,这样迫使攻击者不断面对软件的变化,增加逆向工程的复杂度。而且,本地代码的不完整性也干扰了攻击者对软件行为的静态预测能力。但是,由于网络带宽和延迟的限制,应用程序与可信的远程服务器的频繁交互过程将致使软件的运行效率远远低于本地执行,因此大部分软件还是以二进制本
14、地代码形式发布,服务器端运行保护(protection byserver-side execution)并非对所有应用程序都适用。二代码(di m)混淆技术的分类Collberg 等人根据各种代码混淆技术变换对象的不同将混淆分为四类(s li):布局混淆、数据混淆、控制混淆和预防混淆。布局(bj)混淆布局混淆(layout obfuscation)是指删除或者混淆软件源代码或者中间代码中与执行无关的辅助文本信息,增加攻击者阅读和理解代码的难度。软件源代码中的注释文本、调试信息可以直接删除,用不到的方法和类等代码或数据结构也可以删除,这样即可以使攻击者难以理解代码的语义,也可以减小软件体积,提高
15、软件装载和执行的效率。软件代码中的常量名、变量名、类名和方法名等标识符的命名规则和字面意义有利于攻击者对代码的理解,布局混淆通过混淆这些标识符增加攻击者对软件代码理解的难度。标识符混淆的方法有多种,例如哈希函数命名、标识符交换和重载归纳等。哈希函数命名是简单地将原来标识符的字符串替换成该字符串的哈希值,这样标识符的字符串就与软件代码不相关了;标识符交换是指先收集软件代码中所有的标识符字符串,然后再随机地分配给不同的标识符,该方法不易被攻击者察觉;重载归纳是指利用高级编程语言命名规则中的一些特点,例如在不同的命名空间中变量名可以相同,使软件中不同的标识符尽量使用相同的字符串,增加攻击者对软件源代
16、码的理解难度。布局混淆是最简单的混淆方法,它不改变软件的代码和执行过程。由于攻击者通常无法直接获取软件的源代码,因而布局混淆的保护能力较弱。布局混淆常用于 Java 字节码和.Net 中间代码 MSIL 的混淆,例如 Crema、SourceGuard、yGuard和 Jaurora等。数据混淆数据混淆是指在不影响软件功能的前提下,变换软件代码中的数据或数据格式,增加软件代码的复杂度。根据混淆方式不同,数据混淆可以分为存储和编码变换、聚集变换和次序变换等。存储和编码变换通过混淆软件代码中变量的存储方式和编码方式来消除变量的含义,使它们的操作和用途变得晦涩难懂。主要的混淆方法包括以下几种:(1)
17、分割变量,把一个二进制变量v拆分成两个二进制变量p和q,然后通过函数建立 p、q 与 v 之间的映射关系,并建立基于新的变量编码结构的运算规则。(2)将简单的标量变成复杂的对象结构,例如,在 Java 语言中可以将整型变量变成与整型相关的对象结构。(3)改变变量的生命周期,例如,将一个局部变量变成一个全局变量。(4)将静态数据用函数表示,例如,软件代码中的字符串常量用一个函数来动态构造等。(5)修改编码方式,例如,用更复杂的等价的多项式替换数组变量原始的下标表达式等。聚集变换是指通过将多个数据聚集在一起形成新的数据结构,实现隐藏原始数据格式的目的。聚集变换常用于混淆面向对象的高级语言,聚集方式
18、有数组聚集和对象聚集两种,聚集方法有以下几种:(1)合并标量变量,将多个变量 V1,Vn合并成一个变量 Vm,例如将两个32 位的整数变量 x 和 y 合并成一个 64 位的整数变量 z,其合并函数是 z = 2 32x +y。(2)重新构造数组来混淆(hnxio)数组运算,重构数组的方法有很多种,例如,将一个数组分割成两个小的数组,将多个数组合并成一个大数组,将一维数组“折叠(zhdi)”成多维数组,将多维数组“压平(y pn)”成一维数组等。(3)修改类的继承关系也可以增加代码的复杂度,可以把两个无关的类进行聚集,生成一个新的无意义的父类,也可以把一个类拆分成两个类,其关键是要增加软件代码
19、中类的继承深度,因为软件的复杂度与类的继承深度成正比。3.控制流混淆控制混淆的目的是增加软件中控制流的复杂度,其不修改代码中的计算部分,只是对控制结构进行修改,根据对控制流的修改方式不同可以将控制流混淆分为聚集变换、次序变换和计算变换等类型。聚集变换是指通过破坏代码间的逻辑关系实现控制流混淆,其基本思想是把逻辑上相关的代码拆分开,把它们分散到程序的不同地方,或者把不相关的代码聚集到一起,例如,聚集到一个函数中,其主要混淆方法有以下几种:(1)内嵌函数的方法,用函数体内部的代码去替换程序中该函数的调用语句,这样就可以减少一个函数的定义,其内部代码整体的语义也就变的不如之前清晰了。外提函数的方法,
20、该方法与内嵌函数正好相反,它把没有任何关系的代码合在一起创造一个新的函数,该函数没有任何实际意义,但是,在程序执行过程中却被多次调用,从而使攻击者产生误解,使他认为该函数很有意义。(3)克隆函数的方法,将一个函数克隆成多个函数,新生成函数的功能是一致的,但是名称和实现的细节有些不同,可以调用其中的任何一个函数来替换原来的函数,这样可以有效增加攻击者逆向分析的工作量。(4)循环变换是指通过对循环退出条件的等价变换使循环的结构体变得复杂,例如循环的模块化、循环展开和循环分裂等。(5)交叉合并方法的基本思想是把不同功能的函数合并成一个函数,随着函数功能的不断增加,其代码整体的意义就变得越来越模糊不清
21、了,由此增加了攻击者的理解难度。其实现方式比较简单,可以通过增加一个标识参数来区分不同的功能。通常语义相关的代码在源代码中的物理位置也相近,例如功能相似或有依赖关系的函数会连续的放在同一个文件中或同一段代码中,这样有利于代码的阅读和理解。次序变换的目的是将语义相关的代码分散到不同的位置,尽量增加代码的上下文无关性,实现方法包括对文件中的函数重新排序,循环体或函数体内部的语句块重新排序,以及语句块内部的语句重新排序等。计算混淆是指引入混淆计算代码来隐藏真实的控制流,该方法的应用效果和保护强度都很好,其实现方法包括引入不透明谓词、插入垃圾代码、扩展循环条件、代码并行化和跳转表等。另一种重要的控制流
22、混淆技术就是不透明谓词技术(opaquepredicate)。Collberg 等人首先对不透明谓词技术在代码混淆中的应用做了比较完整的描述。如果在程序中的某一点,一个谓词的输出对于混淆者是可知的(基于先验知识),而对于其他人却是难以获知的,则称该谓词为不透明谓词。不透明谓词技术所引入的路径分支并不影响代码的实际执行顺序,新插入的路径分支条件恒为真,或者恒为假,因此,这些路径分支不改变软件代码的语义,只是使代码的控制流变得复杂且难以分析。插入垃圾代码是指利用不透明谓词技术,在其不可达分支上插入垃圾代码,增加代码静态分析的复杂度。因为,在程序执行过程中,这些垃圾代码永远不会被执行到的,因此,垃圾代码与软件的语义无关,并不影响软件的执行结果。扩展循环条件的基本思想是在循环的退出条件中,加入恒为真或者恒为假的不透明谓词PT和PF,使循环结构变得更为复杂和难以分析。实际上,这些不透明谓词并不影响循环的实际执行次数,因此,也不会改变程序的语义。将可归约控制流图转化为不可归约控制流图是指利用高级语言与低级语言表达能力上的差异,引入一些高级语言没有对应表达方式的控制流结构来增加攻击者
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 房屋产权转让合同三篇
- 2024大型连锁酒店加盟合同
- 2024版版权开发合同2篇
- 2024年度环保设施施工及运营合同带眉脚
- 2024年学员专业技能培训服务协议版
- 2024便利店商品采购合同范本
- 2024年度商标许可合同标的许可使用的商标和范围
- 2024年度安全生产作业人员劳动协议版
- 租赁合同三篇
- 2024年医疗仪器代理经营合同3篇
- 专升本合同协议模板
- 2024年新人教版道德与法治七年级上册全册教案(新版教材)
- 全册重要知识点清单2024~2025学年统编版九年级历史下册
- 幼儿园大班语言课件:不怕冷的大衣
- 教育集团化办学方案
- 2024年四川省南充市中考英语试卷真题(含官方答案及解析)
- 大学怎么读智慧树知到期末考试答案章节答案2024年北京航空航天大学
- 承继合同范本
- 小学学校规范教材和教辅资料征订管理暂行办法
- 摩根大通的监管合规应对措施
- 2024上海市高三英语一模各区《完形填空》分类汇编
评论
0/150
提交评论