




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
JAVA类文件保护分析与研究
【摘要】:由于Java语言面向对象和编译成中间代码执行的特点,其在抗反编译和反盗版方面显得尤其脆弱。本文针对Java软件的特点,运用多种方法,综合设计出一个保护Java类文件的方法。
关键词:Class;加密;密钥;代码混淆
1.引言
目前,Java编程语言的应用在全世界范围正流行,它广泛的应用在Internet的数据库、多媒体、CGI及动态网页的制作方面。1999年在美国对Java程序员的需求量首次超过C++。经调查统计,Java语言应用在软件领域占领着举足轻重的地位,为人类科技文明进步奠定了重要基础。然而,Java语言却存在着巨大的安全隐患。Java是一种跨平台的、解释型语言。第一,Java源代码编译中间“字节码”存储于Class文件中。Class文件是一种字节码形式的中间代码,该字节码中包括了很多源代码的信息,例如变量名、方法名等;第二,由于跨平台的需求,Java的指令集比较简单通用,较容易得出程序的语义信息;第三,Java编译器将每一个类编译成一个单独的文件,这也简化了反编译的工作;第四,Java的Class文件中,仍然保留所有的方法和变量的名称,可以通过这些名称来访问变量和方法,这些符号往往带有许多语义信息。因此,Java程序的这些特点,很容易对不经过处理的Java程序进行反编译。目前,市场上有许多优秀的Java反编译工具,能够反编译出非常接近源代码的程序。所以,对开发人员来说,如何保护Java程序就变成一个非常重要的任务。
2.Java类文件的安全威胁
Java的编译
开发Java应用程序首先是使用编辑工具编写Java的源代码,然后使用编译器编译成虚拟机可执行的Class类文件。编译后生成的类文件是一种有格式的中间代码——字节码文件,不能在本地机器上独立运行,只能在Java虚拟机里解释执行。Java编译器不对变量和方法等符号的引用转换为数值引用,也不确定程序执行过程中的内存布局,而是将这些符号的引用信息保留在类文件中,由解释器在运行过程中创建内存布局,然后再通过查找表来确定一个变量或方法所在的地址[1]。
从Java类文件的结构及其实际数据可知Java类文件保留了源代码文件的大部分信息,如所有的变量和方法等信息。正是由于这个特点,只要在各个平台上实现了各自的Java虚拟机,不用修改Java应用程序的源代码就可以在各个平台上运行,真正做到跨平台的特性,这也是Java能够迅速流行起来的重要原因。
Java的反编译
反编译是一个将目标代码转换成源代码的过程。而目标代码是一种用语言表示的代码,这种语言能通过实机或虚拟机直接执行。从本质上说,他需要根据小规模、低层次的行为来推断大规模、高层次的行为。因此,反编译目标代码并不容易。
在JDK中,有一个反编译器javap,利用该工具可以对Java类文件进行反编译。经过
该工具反汇编后得到的结果并不是源代码,但是使用javap进行反编译的Java类文件可以得到成员变量、方法、行号以及局部变量名等信息。在javap工具的基础上,一些反编译工具如Mocha,WinDis,DjDecompiler等工具可反编译出和源代码几乎一摸一样的代码。
3.常用Java类文件保护方法
由于Java字节码的抽象级别较高,容易被反编译,所以就有了多种防止Java字节码被反编译的方法。
隔离Java程序:最简单的方法就是让用户不能够访问到JavaClass程序,这种方法是最根本的方法,具体实现有多种方式。
代码混淆:这种方法对Class文件进行重新组织和处理,使得处理前后的代码具有相同的语义,被混淆后的代码很难被反编译。
转换成本地代码:本地代码难以被反编译,开发人员可以选择将整个应用程序或关键模块转换成本地代码。如果仅仅转换关键模块,在使用这些模块时,需调用JNI技术,这将牺
牲Java的跨平台特性
加密Class文件:为了防止Class文件被直接反编译,可以将一些关键的Class文件加密
,例如对密钥、加密算法、注册码、序列号管理相关的类等。在使用这些被加密的类之前先解密,然后再将其装载到JVM中。
对比上述几种方法,都存在其自身的优缺点。隔离Java程序只能适合网络环境的客户机/服务器结构或者分布式的环境,对单机运行的程序就无法隔离,而且Java程序需要使用安全机制保护服务器开放接口的使用,服务器的安全成了整个系统安全的焦点。代码本地化,对于不同的平台,需要维护不同版本的本地代码,这将加重软件支持和维护的工作。对Class文件进行加密,在使用时再进行解密,同时将关键加密代码部分进行代码混淆,这样经过双重处理后,代码的安全性提高了很多,该方法也是本文研究的重点。
4.Class文件加密技术
Java生成的Class文件大量暴露在客户端,利用现在的反编译工具可轻易的获取源代码,下面将讲叙如何有效的保护Class文件。
第一,读取本工程的所有待加密Class文件,并保存到byte型数组中;
publicstaticbyte[]symmetricEncrypt(byte[]key,byte[]classData){…};方法对读取到的所
有Class文件进行加密,key为用来加密的密钥,classData为所读到的待加密Class文件,返回结果为加密后的Class文件,然后将其写回原来的Class中,保证结构的完整性。
第二,加密过的Class文件在使用之前需先对其进行解密。
Java虚拟机有默认的类加载器,但是若要它根据用户提供的密码解密代码就难以做到,此时需要通过自定义ClassLoader类来完成加密类的装载。自定义的ClassLoader首先找到被加密过的类,然后进行解密,最后将解密后的类装载到JVM中。这里我的自定义ClassLoader
ClassLoaderappLoader=newEncryptedClassLoader((),newFile(args[1]));
().setContextClassLoader(appLoader);
finalClassapp=(args);
其中参数args[1]传入的是方法所在的工程名,args为主函数所在的类名。
在加载类后,系统的默认findClass()并未对加载的类作任何处理,由于Class文件已被
加密过,此时若运用系统方法findClass()则会抛出ClassNotFoundException的异常,所以这里需要重构我自己的findClass()方法
protectedClassfindClass(finalStringname)throwsClassNotFoundException{
finalStringclassResource=(‘.‘,‘/‘)+".class";finalURLclassURL=getResource(classResource);InputStreamin=null;
Filefile=newFile(());
byte[]classBytes=newbyte[(int)()];FileInputStreamfin=newFileInputStream(file);(classBytes);
……
classBytes=decrypt(classBytes);//解密
……
returndefineClass(name,classBytes,0,);
}
在这个函数中,我运用decrypt(classBytes);方法对所有的加密Class文件进行解密,并在其中调用方法publicstaticbyte[]symmetricEncrypto(byte[]key,byte[]byteSource){}将解密后的Class文件保存直原文件处,保持文件目录级别不变,key为解密密钥,byteSource为待
解密的byte型文件。至此,已完成对类文件的加密和解密,经过测试,功能已实现,Class
文件无法被反编译。但为进一步加强程序的安全性,我做了如下的处理。
第三,对包含有关键信息的方法进行代码混淆处理。在上述内容中,方法symmetricEncrypt(byte[]key,te[]classData)包含有加密所用到的算法,自定义的ClassLoader包含有关键信息,findClass(finalStringname)以及decrypt(classBytes);中包含有解密信息,由于它们本身不是被加密的,因此它可能成为黑客最先攻击的目标。如果相关的解密密钥和算法被攻克,那么被加密的类也很容易被解密。所以这里我对这些关键代码进行代码混淆。代码混淆是对代码进行重新组织和处理,使得处理后的代码与处理前的代码完成相同的功能,但是混淆后的代码很难被反编译。代码混淆有符号混淆、数据混淆、控制混淆和预防性混淆。这里我采用数据混淆对关键代码进行处理。
publicstaticbyte[]symmetricEncrypt(byte[]key,byte[]classData){…};处理
//rawKey,byteSource为symmetricEncrypt(byte[],byte[])的待传入参数
byte[]tempkey=null;
tempkey[0]=0x00;
for(inti=0;i;i++)
tempkey[i+1]=key[i];
tempkey[+1]=0x11;
byte[]source=null;
source[0]=0x00;
for(inti=0;i;i++)source[i+1]=classData[i];source[+1]=0x11;
publicstaticbyte[]symmetricEncrypt(byte[]tempkey,byte[]source){
//取tempkey和source的除第一个和最后一个byte的值
......
}
对publicClassloadClass(finalStringtempname,finalbooleanresolve){}方法进行处理
Stringtempname="abcdefg"+name;//name:loadClass的第一个待传入参数
publicClassloadClass(finalStringtempname,finalbooleanresolve){Stringname=(11,());...
}
对findClass(Stringname){}方法进行处理
//name为findClass(Stringname)待传入参数,先做如下处理
addname=name+"01357924680";
protectedClassfindClass(finalStringaddname){
name=(0,()-11);...//fingClass其他工作
}
intlen;//len=待传文件file的长度:()
byte[]classBytes=newbyte[(int)len];classBytes[len+1]=0x00;classBytes[len+2]=0x11;
//classBytes作为decrypt(byte[]classBytes)的传入参数
privatestaticbyte[]decrypt(f
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 国际贸易买卖合同模板
- 采购合同协议样本
- 机械租赁安全规范合同版
- 供热服务保障合同
- 工厂购销合同范本
- 城市户外广告投放工程合同
- 塔吊设备供应合同
- 采购与供应合同协议书范本
- 长期仓库租赁合同模板
- 宠物猫咪领养及养护合同2025
- 承德市承德县2022-2023学年七年级上学期期末数学试题
- 车辆进出道闸车牌识别系统采购安装调试合同样本
- 语文综合实践《走进传统节日探寻文化根脉》课件-【中职专用】高一语文同步课件(高教版2023·基础模块下册)
- 肯德基用户分析报告
- 福建省龙岩市漳平第一中学2024届高三第三次测评数学试卷含解析
- 60岁以上门卫雇佣协议
- 2024年长沙民政职业技术学院单招职业适应性测试题库汇编
- 苏科版八年级下册9.3-平行四边形(第1课时)课件
- TSG-T7001-2023电梯监督检验和定期检验规则宣贯解读
- PDCA提高卧床患者踝泵运动的执行率
- 蒋诗萌小品《谁杀死了周日》台词完整版
评论
0/150
提交评论