(计算机应用技术专业论文)基于混淆和水印的java字节码安全技术的研究.pdf_第1页
(计算机应用技术专业论文)基于混淆和水印的java字节码安全技术的研究.pdf_第2页
(计算机应用技术专业论文)基于混淆和水印的java字节码安全技术的研究.pdf_第3页
(计算机应用技术专业论文)基于混淆和水印的java字节码安全技术的研究.pdf_第4页
(计算机应用技术专业论文)基于混淆和水印的java字节码安全技术的研究.pdf_第5页
已阅读5页,还剩62页未读 继续免费阅读

(计算机应用技术专业论文)基于混淆和水印的java字节码安全技术的研究.pdf.pdf 免费下载

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

摘要 摘要 j a v a 程序由于平台无关性得以在i n t e m e t 上迅速发布,但同时j a v a 程序也面临着两 个严重的安全问题:第一,侵权使用。j a v a 编译器将每一个类编译成一个单独的c l a s s 文件,这一特点让侵权使用j a v ac l a s s 文件变的容易;第二,逆向工程。目前j a v a 字节 码的反编译技术已经很成熟,出现了许多j a v a 反编译工具,这些工具能很好的把j a v a 字节码反编译成j a v a 源代码。 为了保护j a v a 字节码的安全,本文提出了一种新的保护模型:利用代码混淆和软件 水印技术对j a v a 字节码实施双重保护,从而保护了j a v a 程序的知识产权。混淆j a v a 字 节码是在保持程序语义的前提下隐藏程序的内部信息,使得j a v a 程序员很难读懂反编译 后的j a v a 源代码甚至于不能被正确的重新编译更甚者不能反编译。在j a v a 字节码中嵌 入水印就是将含有标识意义的信息嵌入到j a v ac l a s s 文件中。也就是说利用混淆技术来 阻止j a v a 字节码的逆向工程,利用软件水印为j a v ac l a s s 文件提供版权保护。 研究了现有的代码混淆技术,在此基础上设计了词法转换算法、类的假重构算法, 改进和完善了类拆分算法,总结了类型隐藏混淆的本质和与接口回调技术的区别,分析、 细节化了三种能使反编译失败的控制流混淆算法,并针对程序切片严重威胁控制流混淆 的问题找出了两种抵抗程序切片的混淆策略。研究了现有的一种针对j a v a 字节码的水印 算法。通过对水印算法的改进,提高了水印算法的鲁棒性、透明性。 利用研究成果,设计并实现了名为j o c o w ( j a v at o o lw h i c hc o m b i n e so b f u s c a t i o n a n dw a t e r m a r kt e c h n o l o g y ) 的系统,用户可使用该系统对j a v ac l a s s 文件进行双重保护。 保证j a v a 字节码的绝对安全是不可能的,但是本文的研究可以给j a v a 字节码提供 版权保护和使j a v a 字节码逆向工程价值减小。 关键词:j a v a 字节码;混淆;软件水印;程序切片 大连交通大学工学硕士学位论文 a b s t r a c t j a v ap r o g r a m sh a v eb e e np o p u l a r i z e di nt h ei n t e r n e tb e c a u s eo fp l a t f o r md e p e n d e n c e c h a r a c t e r i s t i c m e a n w h i l ej a v ap r o g r a m sa l s oh a v et w os e r i o u ss a f e t yp r o b l e m s :t h ef i r s to n e i su s i n gi n f r i n g e m e n t t h ef a c tt h a tj a v ac o m p i l e rc o m p i l eac l a s si n t oas e p a r a t ec l a s sf i l e m a k e se a s yf o rj a v au s i n gi n f r i n g e m e n t ;t h es e c o n do n ei sr e v e r s ee n g i n e e r a tp r e s e n tj a v a d e c o m p i l a t i o nt e c h n o l o g yh a sa l r e a d yr e a c h e dm a t u r i t y ,t h e r ea r em a n yj a v ad e c o m p i l a t i o n t o o l sw h i c hc a nc o m p i l ej a v ab y t e c o d ei n t os o u r c ec o d ev e r yw e l l t h et h e s i sp r o p o s e san e ws o f t w a r ep r o t e c t i o nm o d e l :p r o t t e c t i n gj a v ab y t e c o d e ss a f e t y b yt h ew a yo fc o d eo b f u s c a t i o na n ds o f t w a r ew a t e r m a r kt e c h n o l o g y ,a c c o r d i n g l yp r o t e c t i n g j a v as o f f w a r e s i n t e l l e c t u a lp r o p e r t yf i g h t s ,o b f u s c a t i n gj a v ab y t e c o d ec a ne x a c t l yh i d e p r o g r a m si n n e ri n f o r m a t i o no nt h ep r e m i s eo fk e e p i n gp r o g r a m s f u n c t i o n ,w h i c hm a k e sj a v a p r o g r a m m e r d i f f i c u l tt ou n d e r s t a n dt h ec o d ea f t e rd e c o m p i l a t i o ne v e nb eu n a b l et or e c o m p i l e c o r r e c t l ym o r ee v e nb eu n a b l et od e c o m p i l e w a t e r m a r kw h i c hi se m b e d d e di nj a v ab y t e c o d e s i si n f o r m a t i o nw h i c hh a ss p e c i a lm e a n i n g t h et h e s i sm a k e su s eo fo b f u s c a t i o nt e c h n o l o g yt o p r e v e n tj a v ab y t e c o d ef r o mr e v e r s ee n g i n e e r ,m a k e su s eo fs o f t w a r ew a t e r m a r kt oc o m f i r mt h e c l a s sf i l ew h i c hi ss t o l e no rn o ta n dp r o v i d ec o p y r i g h tp r o t e c t i o nw i t hj a v ac l a s sf i l e e x i s t i n g c o d eo b f u s c a t i o nt e c h n o l o g yi ss t u d i e d t h et h e s i s d e s i g n e dt h e l e x c i a l c o n v e r s i o na l g o r i t h ma n dc l a s s sf a l s er e f a c t o ra l g o r i t h m ,t h et h e s i si m p r o v e d ,p e r f e c t e dt h e c l a s ss p l i ta l g o r i t h m ,a n ds u m m a r i z e dt h ed i f f e r e n c eo ft y p eh i d eo b f u s c a t i o n se s s e n c ea n d i n t e r f a c ec a l l - b a c kt e c h n o l o g y ,t h et h e s i sa n a l y s e dt h r e ec o n t r o lf l o wo b f u s c a t i o n sw h i c hm a k e d e c o m p i l ef a i l ,a n df i n do u tt w oo b f u s c a t i o ns t r a t e g i e sa i m i n ga tt h ep r o b l e mw h i c hp r o g r a m s l i c et h r e a t e n sc o n t r o lf l o wo b f u s c a t i o n t h et h e s i ss t u d i e daj a v ab y t e c o d ew a t e r m a r k i n g a l g o r i t h mw h i c hi n c r e a s e sw a t e r m a r k i n ga l g o r i t h m sr e s i s t i b i l i t ya n dt r a n s p a r e n c yb yt h e b e t t e r m e n t a i ma tt h et h e o r ys t u d yr e s u l t ,t h et h e s i sd e s i g n e da n dr e a l i z e dt h es y s t e mw h o s en a m e i sj o c o w ( j a v at o o lw h i c hc o m b i n e so b f u s c a t i o na n dw a t e r m a r kt e c h n o l o g y ) ,t h eu s e r su s e t h es y s t e mt op r o v i d e dd o u b l ep r o t e c t i o nt oj a v ab y t e c o d e i ti si m p o s s i b l et op r o t e c tk a v ab y t e c o d e sa b s o l u t es a f e t y ,b u ti tc a np r o v i d ec o p y r i g h t p r o t e c t t i o nf o rj a v ab y t e c o d ea n dm a k er e v e r s ee n g i n e e rm e a n i n g l e s s k e yw o r d s :j a v ab y t e c o d e ;o b f u s e a t i o n ;s o f t w a r ew a t e r m a r k i n g ;p r o g r a ms l i c e h 第一章绪论 第一章绪论 1 1 研究的背景 随着j a v a 以及相关技术的快遽发展使得人们非常关心j a v a 字节码的安全问题。j a v a 字节码的反编译在j a v a 语言雏形期就出现了,侵权使用j a v ac l a s s 文件也是一个常见的 问题,因而急需要找出一个有效的方法保护j a v a 字节码的安全。混淆技术是为了防止 逆向j a v a 字节码而发展起来的一种新技术。软件水印是密码学、软件工程、算法设计、 图论、程序设计等学科的交叉研究领域,可以为软件提供版权保护。这两种技术能缀好 的解决j a v a 字节码的安全问题。 1 2 混淆技术的研究现状 对混淆技术进行系统的研究是从上个世纪9 0 年代末开始的。这一领域中的大部分 研究工谁是c o l l b e r g ,t h o m b o r s o n , l o w , c h e n x iw a n g ,h o h l 和t s a i 做文的。 c o l l b e r g 首次对混淆转换进行了详细的总结、分类和评估【m 】。将混淆转换分为四类: 布局混淆转换;控制混淆转换;数据混淆转换;预防性混淆转换。提崽了四种混淆变换 的评估标准:力度;抵抗力;执行代价;质量。并提出了构造廉价、高抵抗力、高力度 的不透明谓词的理论p j 。 c h e n x iw a n g 实现了在c 语言源代码上的若干控制混淆转换与数据混淆转换,并分 析了混淆转换造成的性能过载问题以及混淆转换对静态分析工具的有效性1 4 制。 h o h l 提出用带有时闻限制的黑盒方法来保护移动a g e n t i ”。这墨的黑盒是指混淆转 换过的a g e n t 程序。h o h l 提出了一个协议用来检测移动a g e n t 的运行,提出了针对可执 行代码和汇编指令的混淆技术瞵j 。 2 0 0 3 年m i k h a i ls o s o n k i n ,g l e bn a u m o v i c h , n a s i rm e m o n 描述了三种面向对象的程 序设计混淆【9 】:类型隐藏;类的拆分;类的合并。类型隐藏用接口机制去模糊被程序引 用的对象类型。类的拆分是用多个类取代一个类,每个类负责实现原始类中功能的一部 分。类的合并是用一个类取代多个类,一个类负责实现所有功能。 2 0 0 4 年a k i t om o n d e n 提出一种新的混淆框架瑟0 1 。通过将解释器“混淆 来替代原 有的“混淆 程序本身,这种“混淆”解释器的方法可以将程序功能隐藏,从而达到软 件保护的目的。提出了一个基于解释器的“确定状态机概念( f s m ) t , o l 。利用f s m 给出程序p 中的每条指令的语义,这些语义都是内容相关的,因此试图静态地分析两条 指令间的关系和它们的语义将不会成功。 大连交通大学t 学硕十学位论文 2 0 0 4 年m i n g h s i ut s a i ,h s i a n g y a n gc h e n ,t i n g - w e ih o u 提出对j a v a 字节码实施控 制流混淆【l 。分别是摧毁基本块、取代g o t o 、交叉l o o p 。 1 3 软件水印技术的研究现状 目前软件水印所做的研究主要集中在水印理论的完善上,并没有具体的j a v a 水印工 具。提出的水印算法主要有: d a v i d s o n 和m y h r v o l d 提出的静态代码水印是通过重排程序的控制流图中的基本执 行模块来嵌入水印【1 2 】,缺点是难以抵抗对程序基本执行模块的任意的随机重排。 s t e m 等人提出利用语义等价指令序列代换选定的指令序列从而改变其执行频率来 嵌入水印,此时需要一个代码本用来记录代换后的指令序列的执行频率【l 引。该方案对施 加于低水平数据结构上的变换或优化较敏感。 m o s k o w i m 描述了一种将水印代码嵌入数字图象并将图象存储于程序的数据区域的 静态水印方案【1 4 1 。水印代码被随机地提取并执行,当图象被篡改( 即认为水印被篡改) 时 能够即时感知并终止程序的运行,故具有一定的防篡改能力。该方案的问题是由于凭空 产生并执行代码的行为不寻常而容易引起攻击者的注意。 p i e p r z y k 描述了一种利用两个可替换的方法进行数字权限管理的水印方案【l 引,其中 第一个方法将水印信号嵌入对指令序列的同义词的选择上,该方法的的弱点在于攻击者 对每个指令变量的随机选择。 v e n k a t e s a n 算法【l6 】将水印数据嵌入创建的c f g 的拓扑结构中,并将表示水印的c f g 通过构造的不透明分支捆绑在程序的c f g 中,为了顺利提取水印,属于水印图的基本 执行模块被标识出来以识别表示水印的c f g 。 p a t f i cc o u s o t 和r a d l l i ac o u s o t 提出一种称为抽象水印的实现方案,其基本思想是利 用中国剩余定理将水印数据分解为一组整数,通过嵌入这组整数而嵌入水印数据,水印的 提取通过对程序语义的静态分析而获得。抽象水印既可看作动态水印又可看作静态水印: 将其看作动态水印是因为代表水印的整数序列通过程序的动态计算而获得,看作静态水 印是因为水印的提取通过静态分析从程序的抽象语义中提取。 c h r i s t i a nc o l l b e r g 和c l a r kt h o m b o r s o n 提出的基于动态图的水印方案( 也称为c t 算法【l 7 j ) ,被认为是目前最具潜力的水印方案。水印数据嵌入程序在预定执行下创建的 图的拓扑结构中,由于存储于堆中的水印图具有别名分析难属性,故水印难以被定位, 同时容易利用水印图的内部结构设计防篡改方案。 2 第一章绪论 j a s v i rn a g r a 和c l a r kt h o m b o r s o n 提出利用多线程的并发控制,将水印信息隐藏在 线程的执行轨迹中【1 8 】。该水印方案表现出较好的隐蔽性和抗攻击能力,但嵌入的信息量 少是该方案的主要缺陷。 p a l s b e r g 提出基于c t 算法的动态水印方案【l9 1 ,与c t 算法不同的是水印图的创建 不依赖预定输入序列,而是无条件建立的。 a k i t o 和h a j i m u l 提出一种针对j a v a 字节码的水印算法【2 0 。2 1 1 。这种算法的基本思想 是,在j a v a 源代码中加入一些冗余代码提供水印的嵌入空间,在j a v a 字节码中嵌入水 印。 1 4j a v a 字节码安全技术的研究现状 m i c h a e lr b a t c h e l d e r 提出了三种j a v a 字节码安全保护措施。它们分别是隔离j a v a c l a s s 文件【2 2 1 、j a v a 字节码加密【捌和混淆j a v a 字节码【勿。 ( 1 ) 隔离j a v a c l a s s 文件 开发人员将关键的j a v ac l a s s 文件放在服务器端,客户端通过访问服务器的相关接 口来获得服务,而不是直接访问c l a s s 文件。这样黑客就没有办法得到c l a s s 文件并进行 反编译。目前,通过接口提供服务的标准和协议也越来越多,例如h t t p 、w e bs e r v i c e 、 r p c 等。 这种模型的优点是可以完全保护服务器端的c l a s s 文件不被反编译。它的一个主要 缺点是在接口和功能间分离的特性。在客户端和服务器端相互交换数据的时候低的带宽 会影响到程序的性能。它的适应环境是网络环境,分布式环境中的客服端和服务器结构, 当然也有很多应用都不适合这种保护方式,例如对于单机运行的程序就无法隔离j a v a c l a s s 文件。 ( 2 ) 加密j a v a 字节码 为了防止c l a s s 文件被直接反编译,许多开发人员将一些关键的c l a s s 文件进行加密, 例如对注册码、序列号管理相关的类等。当然在使用这些被加密的类之前,程序首先需 要对这些类进行解密,而后再将这些类装载到j v m 当中。这些类的解密可以由硬件完 成,也可以使用软件完成。在实现时,开发人员往往通过自定义c l a s s l o a d e r 类来完成 加密类的装载。白定义的c l a s s l o a d e r 首先找到加密的类,而后进行解密,最后将解密 后的类装载到j v m 当中。在这种保护方式中,自定义的c l a s s l o a d e r 是非常关键的类。 由于它本身不是被加密的,因此它可能成为黑客最先攻击的目标。如果相关的解密密钥 和算法被攻克,那么被加密的类也很容易被解密。 ( 3 ) 混淆j a v a 字节码 3 大连交通大学工学硕士学位论文 混淆j a v a 字节码是在不改变j a v a 字节码工作流程的前提下更改类、字段、方法和 局部变量名字,改变数据的存储方式和扰乱控制流等。虽然经过混淆的j a v a 字节码仍然 能够被逆向编译,但是逆向编译后所有的类、字段、方法和局部变量的名称都不再是最 初设定的有意义的名称。例如一个方法的名字“g e t n a m e 变为随机序列“a b c s d d d , 这个方法的信息被隐藏,逆向工程得到的信息是无意义的。注意的是混淆变换并不能完 全阻止j a v a 字节码被逆向,而是加大了逆向的难度。本文通过混淆j a v a 字节码不仅改 变了类等的名称还重组了原有的数据结构和添加了破坏性的指令。 1 5 研究的设想和预期结果 通过对前人工作的研究,发现目前还没有把混淆和水印这两种技术结合起来对j a v a 字节码实施双重保护的理论基础,更不用说现成的应用工具。国内外已经有很多混淆器, 但是这些混淆器大部分只是实现了布局混淆。对于软件水印所做的研究主要集中在水印 理论的完善上,并没有实现某一水印算法的j a v a 工具出现。针对这些空白,本文设想找 到一个切入点把这两种保护技术结合起来,这样既防止j a v a 字节码的逆向工程,又防止 j a v ac l a s s 文件的侵权使用。最终设计实现一个j a v a 字节码通用的实施混淆变换和水印 嵌入、提取的j a v a 保护工具。 1 6 本文结构及章节安排 本文内容安排如下: 在第一章中说明了论文的研究背景以及国内外在该领域的研究现状和研究的主要 内容并给出了研究的设想和预期的结果。在第二章中提出了论文需要解决的主要问题以 及解决思路。首先分析了j a v a 字节码指令发现j a v a 字节码很容易被逆向编译。通过字 节码验证了解到字节码指令需要遵循的基本原则。最终推出一种新的j a v a 软件保护模 型。在第三章中研究了代码混淆技术。把数据混淆中的几种混淆策略具体化、实例化, 重新定义了三种字节码控制流混淆。在第四章中讨论了一种逆向工程技术一程序切片技 术,本文给出了j a v a 程序之间的依赖,介绍了j a v a 程序的两种切片方法,最后提出了 两种抵抗程序切片的混淆策略。在第五章中研究了一种j a v a 字节码水印算法,提出了一 种构造不透明谓词的方法,并对水印算法进行了改进和完善。在第六章中利用理论研究 成果进行系统的设计与实现。在第七章中对系统的正确性和质量做出评价,并和国外其 它j a v a 保护工具进行比较。 4 第二章j a v a 字节码 第二章j a v a 字节码 j a v a 字节码是一个中间代码,它的名字源自于一个事实,即每个操作码通常能用一 个字节表示。总共有2 5 6 个操作码,其中有一些操作码被保留。操作码后面可能会跟随 着一个寄存器索引和一个操作数,这就构成了j a v a 虚拟机指令。 2 1j a v a 字节码指令 j a v a 字节码是一个中间代码而非最底层的机器代码,因此代码的格式非常类似于 j a v a 源代码。j v m 规范定义了一组与j a v a 语言操作符和关键字相匹配的指令。j a v a 字 节码指令是由操作码以及后面可能会跟随着一个寄存器索引和一个操作数构成。j a v a 字 节码指令也称为虚拟机指令,因为这些指令是在虚拟机上执行的。几乎所有的j a v a 虚拟 机指令都与操作数栈有关,绝大多数指令都会执行自己功能的时候进行入栈、出栈操作。 本文专门对操作数栈进行操作的一些指令进行了阐述,从而可以更好的了解j a v a 字节码 的特点。这些指令执行常量入栈【2 3 1 、通用栈和操作数栈【2 3 】和局部变量之间往返传输值操 作【2 3 】: ( 1 ) 常量入栈 操作码在执行常量入栈操作之前,使用如下三种方式指明常量的值:常量值隐式包 含在操作码内部;常量值在字节码流中如同操作数一样紧随在操作码之后;从常量池中 取出常量。例如i c o n s t1 操作码告知j a v a 虚拟机向栈中压入一个值为l 的i n t 类型的数。 b i p u s hb y t e l 是将b y t e l 转化为i n t 类型,然后将其压入栈,这个操作码通过使用一个紧 随在操作码之后的操作数明确指定将要压入栈的常量。l d ci n d e x b y t c l 是从由i n d e x b y t e l 指向的常量池入口中取出一个字长的值,然后将其压入栈,采用的是从常量池中取出常 量的方式。 ( 2 ) 通用栈 尽管j a v a 虚拟机指令集中的大多数指令都只处理一种特定的类型,但还是有一些指 令可以进行类型无关的栈操作。如n o p 不进行任何操作,p o p 从操作数栈中弹出栈顶的 一个字等。 ( 3 ) 操作数栈和局部变量之间往返传输值 有几个操作码用于将i n t 类型和f l o a t 类型局部变量压入栈,如i l o a d0 ,f l o a d0 等, 它们是将位置0 的局部变量压入栈。 通过上面的分析可以看出j a v a 字节码的指令简单,比其它基于硬件的指令集更依赖 于自然语言。这一切为j a v a 字节码的反编译打开了大门。 大连交通大学t 学硕十学位论文 2 2j a v a 字节码的验证 要想字节码指令在虚拟机上运行,必须通过c l a s s 文件检验器的“字节码验证”扫 描。在这趟扫描中,j a v a 虚拟机对字节流进行数据流分析,这些字节流代表的是类的方 法。字节码检验器要进行大量的检查,以确保采用任何路径在字节码流中都得到一个确 定的操作码,确保操作数栈总是包含正确的数值以及正确的类型。它必须保证局部变量 在赋予合适的值以前不能被访问,而且类的字段中必须总是被赋予正确类型的值,类的 方法被调用时总是传递正确数值和类型的参数。字节码检验器还必须保证每一个操作码 都是合法的,即每一个操作码都有合法的操作数,以及对每一个操作码,合适类型的数 值位于局部变量中或是在操作数栈中。这些仅仅是字节码检验器所做的大量检验工作中 的一小部分,在整个检验过程通过后,它就能保证这个字节码流可以被j a v a 虚拟机安全 运行。每一个混淆变换必须遵循这些规则以确保由混淆器输出的代码能通过验证,否则 转换代码将是无用的。在j a v a 字节码中嵌入水印后也需要保证能通过字节码验证。 2 3j a v a 字节码的反编译 反编译作为一种软件分析和理解的工具,是软件逆向工程的主要组成部分,它具有 重要的实用价值。造成j a v a 字节码很容易被反编译的原因: ( 1 ) j a v a 字节码是一种与平台无关的代码形式,档案格式简单【2 4 】,信息保留完整, 指令是最简单的堆栈式架构【2 4 1 。j a v a 字节码携带了在源文件中可以找到的所有重要信 息。 ( 2 ) j a v ac l a s s 文件是动态连接的。在动态连接的可执行程序中,类之间的引用是符 号化的,如果引用是指向一个字段,那么就会详细说明这个字段的名字和描述符,如果 引用是指向一个方法,那么这个方法的名称和描述符会被详细说明。j a v ac l a s s 文件不仅 包含对其它类的字段和成员方法的符号引用,还包含对自己的字段和成员方法的符号引 用。j a v ac l a s s 文件包含了可选的调试信息,这些调试信息包含局部变量的名称和类型。 保护j a v ac l a s s 文件不被逆向工程,保护j a v a 软件的知识产权,是本文需要解决的 问题。 2 4j a v ac l a s s 文件的盗版 j a v ac l a s s 文件是对j a v a 程序二进制文件格式的精确定义。每一个j a v ac l a s s 文件都 对一个j a v a 类或者j a v a 接口作出了全面的描述。因此盗版其中核心类或接口变得非常 容易。 6 第二章j a v a 字节码 2 5 一种新的j a v a 保护模型 目前有很多种保护j a v a 字节码安全的方法。为了防止j a v a 字节码被逆向工程,提 出对j a v a 字节码进行混淆变换。混淆变换的种类和实现方式很多,例如混淆器 r e t r o g u a r d ,j s h r i n k 等。混淆变换只是阻止了j a v a 字节码的逆向工程。如果攻击者知 道一段读不懂的程序的实现功能,完全可以把这段程序嵌入到自己的程序中当成自己的 东西来用,虽然不能逆向但可以盗版。为了防止j a v a 字节码被盗版,有人提出了在j a v a 字节码中嵌入水印。市面上并没有在j a v a 字节码中嵌入水印的工具。目前所做的研究主 要集中在水印理论的完善上。例如提出许多水印算法以及嵌入水印的方法等。用嵌入水 印的方法保护j a v a 字节码的缺点是不能防止j a v a 字节码的逆向工程。这两种保护方法 都有各自的优缺点。总起来说现有的保护模型都是对j a v a 软件产品实施一个方面的保 护。 本文为了解决这个问题提出了一种新的j a v a 软件保护模型:利用混淆和水印技术保 护j a v a 字节码。这种保护模型不仅能防止j a v a 字节码被逆向工程,同时也能防止j a v a 字节码被盗版,实现对软件产品的双重保护。此保护模型的一个技术难点就是由于代码 混淆使原来的类和方法的名字都发生了改变,如何精确查找到需要嵌入水印的相应的类 和方法呢? 本文的解决方法保留要嵌入水印的类和方法不被重命名,目的是让程序可以 找到嵌入水印的方法进行水印嵌入和水印提取。但是这样又容易暴露嵌入水印的方法, 如何隐藏嵌入水印的方法,也是本文需要注意的。把代码混淆和软件水印这两种软件保 护技术结合起来,保护j a v a 的知识产权。保护模型如图2 1 所示。 陬习 1 一j 图2 1 保护模型 f i g 2 1p r o t e c t i o nm o d e l 7 入保护策略 大连交通大学工学硕士学位论文 本章小结 本章首先分析了j a v a 字节码指令的特点,然后说明了如何保证字节码流可以在j a v a 虚拟机上安全的运行,最后提出了一种j a v a 字节码保护模型。具体的方案实现在第六章。 8 第三章代码混淆技术 第三章代码混淆技术 本文采用代码混淆技术对j a v a 字节码进行混淆处理。代码混淆技术是一种重要的 软件保护方法。代码混淆是指对拟发布的应用程序进行保持语义的混淆变换,使得变换 后的程序和原来的程序在功能上相同或相近,但是更难以被静态分析和逆向工程所攻 击。 3 1 混淆变换的定义 混淆器实际是提供了一种转换机制,使转换后的j a v a 源程序或者转换后的j a v ac l a s s 文件的反编译结果难以理解。这种转换机制被称为混淆变换【l l ,定义如下: 设丁是原来的程序p 到目标程序p 的一个变换,如果p 和尸具有相同的可观测行 为,则称丁是一个从p 到尸。的混淆变换。更准确地说,当满足以下两个条件时丁才是一 个合法的混淆变换: ( 1 ) 如果p 无法终止或者以错误的状态终止,则p 可以终止也可以不终止。 ( 2 ) 否则p 必须中止并且产生和p 相同的输出结果。 可观测行为被松散的定义为用户所观测到的软件行为。这意味着p 允许产生一些p 没有的行为( 例如创建文件,或在i n t e m e t 发送信息等) ,只要这些行为用户观测不到 就可以。注意的是并不需要尸和尸具有相同的执行效率,实际上转换将使尸的执行效率 低于尸,耗用更多的内存。 3 2 混淆变换的分类 根据变换所设计的对象混淆变换主要分为三类: ( 1 ) 词法变换:对类、方法和变量的名称进行扰乱,使其违背见名知义的软件工程 原则。 ( 2 ) 数据变换:通过对原有的数据结构进行重组以增加观测的困难性。 ( 3 ) 控制流变换:在语义不变的前提下扰乱原有程序的控制结构使其难以被理解。 混淆变换中的词法变换是比较简单的,当前大部分的混淆器都应用了这种混淆变 换,通过对函数和变量的名称进行扰乱,使其违背见名知义的软件工程原则。本文不但 实现了词法变换,还实现了数据变换和控制流变换。 3 3 混淆变换的评价 采用混淆变换后需要对其进行评价,混淆变换主要有四个评价标准。本文给出了提 高力度的方式以及抵抗力的度量方式。第七章依据这四个标准评价混淆变换的质量。 9 大连交通大学工学硕士学位论文 3 3 1 力度 力度就是混淆后程序的模糊程度,分低、中、高三种程度。 定义3 1 :设丁是一个从源程序尸到目标程序尸行为保持变换,e ( 尸) 为源程序p 的 复杂度,e ( p ) 为目标程序p 的复杂度,乙( 尸) 为程序尸的转换力度。它被定义为: 彤 t p o t ( p ) = e ( p 。) e ( p ) - 1 i j 如果乙( 尸) o ,是对p 的一个有力度的混淆变换,也就是说通过提高程序的复杂度可以 提高程序尸的力度。复杂度由h a l s t e a d 的程序长度、m c c a b e 的圈复杂度、h a r r i s o n 的 嵌套复杂度、o v i e d o 的数据流复杂度、h e n r y 的扇入扇出复杂度、m u n s o n 的数据结构 复杂度和c h i d a m b e r 的面向对象度量等度量。其中h a l s t e a d 、m u n s o n 是度量整个程序的 复杂度,m c c a b e 、h a r r i s o n 、o v i e d o 、h e n r y 是度量程序中方法的复杂度,c h i d a m b e r 是度量j a v a 类的复杂度。提高复杂度的方法如下: ( 1 ) h a l s t e a d 方法是一个著名的方法,它根据程序中运算符和操作数的总数来度量程 序的复杂度。为了使p 是一个有力度的混淆转换,可以增加程序中运算符和操作数的个 数。 ( 2 ) m c c a b e 方法根据程序控制流的复杂程度定量度量程序的复杂程度,这样度量出 的结果称为程序的环形复杂度。从环形复杂度的计算方法跚可以看出,一个应用程序所 包含的谓词越多,条件和循环结构嵌套的次数越多,该程序的复杂度就越高,从而可以 提高混淆变换的力度。 ( 3 ) 根据m u n s o n 的数据结构复杂度口6 1 、c h i d a m b e r 的面向对象度量【2 7 1 ,为了使p 是 一个有力度的混淆转换,它应该:提高数据结构( 如数组的维数,字段的数目等) 的复杂 性;提高类( 如类在继承树中距离根的深度,类的直接子类的个数等) 的复杂性。 ( 4 ) o v i e d o ,h a r r i s o n ,h e n r y 指出方法的复杂度随着基本块与基本块之间传递的参 数个数增加而增加,随着条件语句的隐蔽性提高而提高,随着形式参数的个数提高而提 高。 由此可见,增加程序的长度;引入新的类和方法;引入新的谓词;增加条件语句和 循环结构的嵌套层数;增加方法的参数个数;增加继承树的高度等方法都可以提高混淆 转换的力度。 3 3 2 抵抗力 抵抗力就是混淆后的程序被反混淆器破解的程度。分很弱、弱、强、很强、单向五 类级别。如果某个变换是单向的,即变换是不可恢复的,如从程序中移除有助于人阅读 l o 第三章代码混淆技术 和理解的格式、变量名、注释等不影响程序执行的有关信息,这种变换的抵抗力就是最 强的。对于其它例如在程序中加入不改变程序行为的假的谓词等变换,能够加大攻击者 人工阅读时的工作量,但却是可恢复的变换。 7 定义3 2 :设丁是一个行为保持变换,这样p 一尸就是转换一个源程序p 到一个目 标程序p 。( 尸) 是源程序p 的转换后的抵抗力。如果从p 中删除信息,尸不能重构 正矿 恢复到p ,那么乙( 尸) = d 刀p w a y 。否则乙( 尸) = r e s i l i e n c e ( t 肪。黼,删埘盯) 。 咖,fe f f o n 从定义中可以看出抵抗力包括两个方面:d e o b f u s c a t o r e f f o r t 意味着一个自动的反混 淆器需要多少执行时间和执行空间才能有效的降低转换力度;p r o g r a m m e re f f o r t 意味着 程序员需要花费多长时间去构造一个能有效的降低转换力度的自动反混淆器 区别力度和抵抗力是非常重要的,如果一个变换尽量做到了混淆一个程序员,那么 就说这个混淆变换是有力度的。但是如果它能抵抗一个自动反混淆器的攻击那么它就是 有抵抗力的。 3 3 3 执行代价 执行代价是执行程序需要额外时间和空间的量度,分非常昂贵、昂贵、低廉、无代 价四种级别。 r 定义3 3 :设丁是一个从源程序尸到目标程序p 行为保持变换,这样p - - - p 就是转 换一个源程序p 到一个目标程序p 。凡,( 尸) 是尸跟p 相比较额外的执行时间和空间。 d e f 如果执行p 需要比p 多耗费指数阶的资源,那么瓦。,( 尸) - - = jd e a r 。如果执行p 需要比p 多 出, 耗费多项式阶o ( n p ) ( p 1 ) 的资源,那么咒。,( p ) 三c o s a y 。如果执行尸需要比p 多耗费线 c l e f 性阶o ( n ) 的资源,那么,( 尸) 二c h e a p ,如果执行尸需要比p 多耗费常量阶d ( 1 ) 的资源, 耐 那么,( 尸) = f i e e 。 某些变换如改名、格式移除是零开销的,但多数变换都会带来或多或少的时间和空 间开销。变换的开销主要来自于代码增加、数据膨胀和循环增多。而大多数混淆变换所 引入的动态数据的膨胀是开销的主要来源。程序执行时动态数据的增加会导致频繁的内 存与硬盘的数据交换,对j a v a 来说还会加重垃圾收集的负担。更为严重的情况是,原 本能正常运行的程序在经过混淆变换后,可能因为耗尽内存空间而无法运行。开销的大 大连交通大学工学硕士学位论文 小与程序执行时的上下文有关。如在多层循环内的一条简单赋值语句所带来的开销要远 大于在循环体之外的同样的语句所带来的开销。 3 3 4 质量 混淆变换的质量定义如下: 定义3 4 :乙( 尸) 为转换丁的质量,它被定义为力度、抵抗力、代价的结合: 乃删( 尸) = ( ( p ) ,( 尸) ,乙,( 尸) ) i j 意味着混淆变换的质量与力度、抵抗力成正比,与执行代价成反比。 3 4 布局混淆 布局混淆就是修改程序的布局结构。当前大多数混淆器都采用了布局混淆。该类混 淆主要包括删除和改名。删除是指将程序中与执行无关的调试信息、注释、用不到的方 法和类等从程序体中删除。删除这些信息后不但使攻击者难以阅读和理解,而且还可以 减小程序的大小,提高程序装载和执行的效率。改名主要是混淆标识符,对程序中的变 量名、常量名、类名、方法名等标识符做词法上的变换以混淆攻击者对程序的理解。改 名的方法有很多种如哈希改名、名字交换、重载归纳等。 ( 1 ) 哈希改名 哈希改名就是简单的将原来一个有明确含义的名字替换为一个没有任何含义的名 字。这种算法的优点就是实现起来比较简单,但是必须遵循的原则就是不能重名,重名 的意思是说在同一命名空间里同一层次关系上的类、方法、变量的名字不能产生歧义。 本文改名的方法采用的是哈希改名。算法实现以及解决重名问题在第六章。 ( 2 ) 名字交换 名字交换是首先将原来程序中的所有的名字集中在一起,然后再随机地分发给变 量、常量、类、方法等。这种方法比较隐蔽,攻击者往往不易察觉。 ( 3 ) 重载归纳 重载归纳就是将程序中所有的标识符尽量用相同的来代替。它是利用了程序中方法 不只是依靠名字还可利用参数和返回类型来区分,以及不同命名空间中相同的名字不会 引起冲突的特性。 3 5 数据混淆 数据混淆也就是对程序中数据结构进行数据变换,大部分的数据混淆直接提高了 m u n s o n 和c h i d a m b e r 度量。 1 2 第三章代码混淆技术 3 5 1 抽象数据类型的混淆 一个抽象的数据类型是由保存的数据类型和可能在这个数据类型上进行的操作定 义的。开发者只能通过操作方法来访问抽象数据类型的属性,但是不知道这个数据类型 内部各种操作是如何实现的。类是j a v a 中最基本最抽象的数据类型,类中封装了实例变 量和方法。本文定义一个类为c = ( v m ) ,在这里v 是类c 中所有实例变量的集合,m 是类c 中所有方法的集合。与传统的抽象数据类型不同,j a v a 中两个类可以通过继承建 立关系,继承可以使子类具有父类的各种属性和方法,而不需要再次编写相同的代码。 在令子类继承父类的同时,可以重新定义子类的某些属性和方法,也就是覆盖父类的原 有属性和方法,使其获得与父类不同的功能。表示继承为r = p oa r i 2 引。r 表示为一 个新定义类,p 表示子类继承父类中已经存在类的属性和方法,r 表示为r 新增的属 性和方法。o 意思为实例变量的组合,方法的重写。类的拆分和类的假重构就是修改类 之间的继承关系,根据c h i d a m b e r 度量,这两种对类的操作都能提高类的复杂性,从而 提高了程序的力度。 ( 1 ) 类拆分 c o l l b e r g 提出可以将类进行拆分【,把一个类c 拆分成两个类e rc f 2 ,c r ,继承 c ,:,不能随意的移动类c 的实例变量和方法到目标类中。事实上c = ( v ) , m ) ) ,方法m 和变量v 是有联系的。任何拆分必须顾及到变量v 的范围。例如:不能拆分c 为c f ,c , c f 。= ( ) , m ) ) ac f l = ( v , ) ,q 1 = c f 。:oac f j 。为了解决这个问题,设定规则如 下: 规则3 1 【1 】:构建一个依赖图g 。图g

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论