类分裂的代码混淆技术

上传人:l****6 文档编号:38056403 上传时间:2018-04-26 格式:DOC 页数:5 大小:33KB
返回 下载 相关 举报
类分裂的代码混淆技术_第1页
第1页 / 共5页
类分裂的代码混淆技术_第2页
第2页 / 共5页
类分裂的代码混淆技术_第3页
第3页 / 共5页
类分裂的代码混淆技术_第4页
第4页 / 共5页
类分裂的代码混淆技术_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《类分裂的代码混淆技术》由会员分享,可在线阅读,更多相关《类分裂的代码混淆技术(5页珍藏版)》请在金锄头文库上搜索。

1、1类分裂的代码混淆技术摘 要 包含有大部分或全部源码信息的软件发行版本的普及,比如易被反编译成源码的 Java 字节代码,增加了软件被恶意逆向工程攻击的可能。文章介绍了面向对象语言的类分裂混淆方法,同时也给出了混淆技术的定义、分类和评判标准。关键词 逆向工程;代码混淆;软件保护;类分裂1 引言计算机软件的安全一直是软件企业和相关研究领域的关注重点,当前存在的软件保护技术分别有硬件辅助保护、序列号保护、加密保护、服务器认证、防篡改以及代码混淆等。随着 JAVA 语言、逆向工程的迅速发展和普遍运用以及恶意主机对软件的逆向分析等突出安全问题的不断涌现,使得代码混淆,这一新的保护软件安全的技术正越来越

2、受到人们的重视。2 代码混淆的定义和分类2.1 代码混淆定义给定一个程序 P、策略 T,经过混淆变换后得到程序 P (见图 1)。此过程称之为混淆变换,如果对程序进行一种功能保持的变换,变换后的程序拥有和原始程序相同的功能。更确切的说法应该包含以下两个条件:如果 P 出错终止或终止失败,P不一定终止。P 和 P在正常终止情况下,P必须产生与 P 相同的输出。所不同的是经过转换的 P相较 P 更难于被静态分析等逆向工程方法攻击,即使被反编译,生成的程序也难以被人阅读和理解。2图 1 代码混淆2.2 代码混淆分类根据混淆对象和对其进行操作的差别,可将代码混淆技术分为布局(layout)混淆、控制(

3、control)混淆、数据(data)混淆、预防(preventive)混淆等几种。(1)外形混淆。该类混淆主要包括对程序中的变量名、常量名、类名、方法名称等标识符作词法上的变换改名和删除程序中与执行无关的调试信息、注释、源码格式等。(2)控制混淆。该类混淆的目的是使得攻击者对程序的控制流难以理解。主要包括打乱某段代码本身逻辑关系的聚集混淆(Aggregation Transformation)、把相关语句分散到程序不同位置并实现某项功能的次序混淆(Ordering Transformation)和隐藏真实执行路径的执行混淆(Computation Transformation)等。 (3)数

4、据混淆。数据混淆的对象是程序中的数据域。它可细分为相关数据的储存(Storage)与编码(Encoding)方式的混淆、组合和拆分数据的聚集(Aggregation)混淆、位序重计的次序(Ordering)混淆等。(4)预防混淆。与前述混淆类型针对恶意用户不同,预防混淆主要利用一些专用反编译器的设计缺陷,以使这些反编译器难以反向还原混淆之后的代码。例如,反编译器 mocha 对于 Return 后面的指令不进行反编译,Hosemocha 就是专门针对此缺陷,故意将代码放在 Return 语句后面,从而使反编译失效。2.3 类分裂介绍完代码混淆的分类后,接下来我将就面向对象语言中的一种混淆技术:

5、类分裂(class splitting)进行说明。首先对类分裂进行定义:类分裂是将一个初始(原)类用两个或两个以上的类来替换的混淆方法。对类分裂进行叙述前,我们规定以下相关使用术语的意义:3P: JAVA 程序Classes(P): P 中一般类的集合Interfaces(P): P 中接口类的集合ct: Class 或 Interface 中的任意类Methods(ct): ct 中的成员函数的集合Field(ct): ct 中的成员变量的集合注:Methods(ct),Field(ct)不包括从父类继承的成员函数和成员变量,而只包括:当前定义类中新定义的成员函数和成员变量。当前定义类所覆盖

6、的其父类的成员函数。依赖(depends)关系的定义:m,n Methods(ct),如果存在 m 调用 n,则(m,n) depends and mMethods(ct), fField(ct),如果存在 m 使用了 f,则(m,f) depends为了便于用例的书写,特做说明,图 2 左列和右列的符号实际上表示同一类。CCtC1Ct,1Ct,1Ct,24图 2其次,由于类分裂的方法很多,为了叙述方便,我们假设将类 ct 分裂成两个新类ct,1 和 ct,2,公式如下:分裂函数 usplit 代表了这么一个分裂过程:原来的类的成员(成员函数或成员变量)被拆分到某个或是两个新类中。分裂函数的选

7、择必须考虑到成员函数之间或成员函数和成员变量之间的依赖关系,这是决定分裂函数是否有效的重要标准。下面的程序中,初始程序中的类 Ct不能被分为混淆后的程序中两个毫无继承关系的新类,而应分裂为具有继承关系的类 ct,1 和 ct,2。可以使用另一种表达方式描述:初始程序中类 Ct 的 m2 成员函数调用了 m3 成员函数,因此我们不能将 m2 作为 ct,1 的成员函数,m3 作为 ct,2 的成员函数,而 ct,1 和 ct,2 两者间无继承关系。而应将 m2 作为子类 ct,2的成员函数,m3 作为父类 ct,1 的成员函数。且成员函数 m3 不需要修改,m3 依旧调用 m2。如果出现这种情况

8、:由于初始程序中的类设计本身存在缺陷,导致该类实际等同于多个类的组合。在此前提下,可以将初始类分裂为毫无继承关系的两个或两个以上新类。将类分裂为具有继承关系的新类的方法产生了大量有效的分裂函数,这是因为这种分裂方法的约束条件非常简单且只具有惟一的限制:成员函数和成员函数所使用到的成员变量必须在同一类中定义,而这个类必须是定义成员函数的类。用公式表述如下: mMethods(ct):if ct,1 usplit(m),thennMethods(ct):depends(m,n)ct,1 usplit(n) andfFields(ct):depends(m,f) ct,1 usplit(f)原则的体

9、现如同下面所示类分裂混淆例子所示:成员函数 m3 调用了成员函数5m4,因此将 m3 和 m4 定义为类 ct,1 的成员函数。由于分裂函数 usplit 将 m4 函数分配给了类 ct,2,类 ct,1 的成员函数 m4 其实只是一个虚假的程序段(函数),它使恶意逆向工程人员以为调用的是 ct,1 的成员函数 m4。但实际情况是:程序运行期间 ct,1 的成员函数 m4 将不会被调用,它将被 ct,2 的 m4 成员函数所覆盖。同时,类 ct,1 中构造函数用到的成员变量 i,d 都在类 ct,1 定义,类 ct,2 中构造函数用到的成员变量 o 则在类 ct,2 定义。接着,当新类产生后,

10、必须要对原有的类型声明进行替换,主要包括:成员函数的参数,成员变量和本地变量的类型声明由 ct 变为 ct,1 和 ct,2 代替,程序中是 C 使用 C1 和 C2 代替。 原类构造函数的调用由 ct 变为 ct,2,程序中用 C2 替代 C,这是防止动态类型转换的一个简单替换。初始程序 混淆后的程序 class C class C1 private int i; private int i;private double d;private double d;protected Object o; public C1() public C() i=5;i=5; d=1.0;d=1.0; o=

11、new Object(); public C1(int iarg,double darg) i=iarg;public C(int iarg,double darg) d=darg;i=iarg; d=darg; public boolean m1() o=new Object();混淆变换 return i 0; public boolean m1() protected void m3(int iarg) return i 0; i=iarg; m4(new Object();public void m2() d=3.0; public void m4(Object obj) m3(3);

12、 o=obj.getClass();6 protected void m3(int iarg) i=iarg; class C2 extends C1 m4(new Object(); protected Object o; public C2() public void m4(Object obj) super();o=obj; o=new Object(); public C(int iarg,double darg) class D super(iarg,darg);void n() o=new Object();C c=new C();if (c.m1) public void m2(

13、) c.m2; d=3.0;c.m4; m3(3); public void m4(Object obj) O=obj; class D void n() C2 c=new C2();if (c.m1) c.m2;c.m4; 3 代码混淆的评判指标程序混淆效果通常从强度(potency)、耐受性(resilience)、开销(cost)、隐蔽性(stealth)等 4 个方面来评估:(1)强度。指混淆变换后的程序相对原始的程序对恶意用户理解程序造成的困难程度或复杂度。(2)耐受性。指混淆变换后的程序对使用自动去混淆工具进行攻击的抵抗度。其抵抗度大小与前述标准之一的强度的大小无直接联系,甚至可能

14、出现某些强度很高的混淆变换对自动去混淆工具的抵抗能力却很差的情况。7(3)开销。指经过混淆变换后的程序在执行时由变换所带来的额外的执行时间和所需存储空间的开销。(4)隐蔽性。耐受性好的混淆变换不容易被自动去混淆工具所去除,但却可能很容易被攻击者的人工分析识破。特别是,如果一种变换所引入的代码和原始程序有较大的差异性,就会轻易地被攻击者识破,因此应尽力使用与原代码相近的语法结构等来加强隐蔽性。4 结语代码混淆的目的是防止对软件的逆向分析,从而有效保护软件知识产权。它通过改变程序本身,使其转换为极难理解和分析的新程序,最终让恶意攻击者在必须耗费其所不能承受的代价(时间或其它方面)面前,放弃对软件的

15、分析来实现。但代码混淆技术作为一种新的软件保护方法,在理论基础、技术成熟度等方面依旧存在许多不足,这也将是代码混淆技术下一步要解决的问题。参考文献 1 C. Collberg,C. Thomborson,and D . Low. A Taxonomy of Obfuscating Transformations. Technical Report 148,July 1997 2 C. S. Collberg and C. Thomborson. Watermarking,Tamper-Proofing,and Obfuscation- Tools for Software Protection

16、. IEEE Transaction on Software Engineering,28(8):735-746,Aug,2002 3 H. Chang and M. Atallah. Protecting software code by guards. In Proceeding of the ACM Workshop on Security and Privacy in Digital Rights Managements,pages 160- 175,Nov. 2001 4 C. Wang. A Security Architecture for Survivability Mechanisms. PhD thesis,University of Virginia,School of Enginee

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号