网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
.24点算法的java代码.
.JAVA的学习体会.
.凡是用到swing包的程序不能编译-.
.Java 编译、反编译、反反编译.
.配置InternetInformationService.
.Java语言数据库操作的基本流程.
.java学习——理解面向对象程序设.
.回击Ruby, Groovy on&.
.J2EE与IBM对象关系数据库(1).
.为什么Java中继承是有害的.
.详细讲述SOA的发展历史与标准规范.
.JVM(JAVA虚拟机介绍).
.iBATIS step by step 2.
.充分利用链接异常处理.
.J2SE综合:对java.util的总结 七.
.J2EE全面简介.
.开发工工具配置笔记——Jcreator.
.XML文件DTD路径解析——in Eclip.
.Java也存在2000年问题.
.扩展Eclipse的Java开发工具(二).

如何有效的保护JAVA程序

发表日期:2008-1-5



目前关于Java程序的加密方式不外乎JAVA模糊处理(Obfuscator)和运用ClassLoader方法进行加密处理这两种方式(其他的方式亦有,但大多是这两种的延伸和变异)。这两种方式不管给JAVA反编译器造成多少困难, 究竟还是有迹可寻,有机可乘的。本文介绍的方法是对ClassLoader方式加密处理的一种改进,使之达到传统二进制程序代码安全。
第一章 流行的加密方式简介

关于JAVA程序的加密方式,一直以来都是以JAVA模糊处理(Obfuscator)为主。这方面的研究结果也颇多,既有模糊器(如现在大名鼎鼎的JODE),也有针对反编译器的"炸弹"(如针对反编译工具Mocha的 "炸弹" Crema和HoseMocha)。模糊器,从其字面上,我们就可以知道它是通过模糊处理JAVA代码,具体的说,就是更换变量名,函数名,甚至类名等方法使其反编译出来的代码变得不可理解。举个例子来说吧。

先将将下面源代码编译成class文件。

public class test

int sortway;
void sort(Vector a)
{
……
}
void setSortWay(int way)
{
……
}
void sort(Vector a, int way)
{
……
}


后通过JODE进行模糊处理后,反编译过来后, 可能变成下列代码。

public class OoOoooOo0Oo0O

int OoOo0oOo0Oo0O;
void OoO0ooOo0Oo0O (Vector OoOoo0Oo0OoOO)
{
……
}
void OoOo00oOoOo0O (int Oo0oooOo0Oo0O)
{
……
}
void OoO0ooOo0Oo0O (Vector OoOoo0Oo0OoOO, int Oo0oooOo0Oo0O)
{
OoOo00oOoOo0O (Oo0oooOo0Oo0O);
OoO0ooOo0Oo0O (OoOoo0Oo0OoOO);
}


其实这只是做到了视觉上的处理,其业务逻辑却依然不变,加以耐心,仍是可以攻破的,假如用在用户身份验证等目的上,完全可以找到身份验证算法而加以突破限制。

而所谓的"炸弹"是针对反编译工具本身的缺陷,这种方法对于特定的反编译工具是非常有效的,然而到目前为止,还没有一个全能型的,对每一种反编译工具皆有效,其局限性是明显的!

另一种方法是采用ClassLoader加密。JAVA虚拟机通过一个称为ClassLoader的对象装来载类文件的字节码,而ClassLoader是可以由JAVA程序自己来定制的。ClassLoader是如何装载类的呢?ClassLoader根据类名在jar包中找到该类的文件,读取文件,并把它转换成一个Class对象。该方法的原理就是,对需加密的类文件我们先行采用一定的方法(可以是PGP, RSA, MD5等方法)进行加密处理,我们可以在读取文件之后,进行解密后,再转换成一个Class对象。

关于ClassLoader工作方式的具体介绍就不在此一一述说了,前面已有文章专题讨论了。

有没有发现,该方法并未解决ClassLoader本身的安全性? 显然,只要反编译了该ClassLoader类,就可以顺藤摸瓜找到其它的类了。可见ClassLoader本身"明码"方式仍然造成一定的不安全性,然而,假如该方法解决了ClassLoader本身的安全性,其不失为一个比较好安全方案。

第二章 ClassLoader加密方式改进

JAVA程序是通过java.exe/javaw.exe来启动的,要对ClassLoader进行解密处理,只能从java.exe/javaw.exe身上着手。

我们先来考察一下JDK的发布路径, 发现JDK的每一个版本都提供了src.jar,用WinZip打开看看, 可以看到一个launcher的路径,里面包含的就是java.exe/javaw.exe的程序代码。哈哈, 这下我们可以随心所欲了。:-)打开java.c看看,里面有一段, 如下:

jstring mainClassName = GetMainClassName(env, jarfile);
if ((*env)->ExceptionOccurred(env)) {
(*env)->ExceptionDescribe(env);
goto leave;
}
if (mainClassName == NULL) {
fprintf(stderr, "Failed to load Main-Class manifest attribute "
"from %s ", jarfile);
goto leave;
}
classname = (char *)(*env)->GetStringUTFChars(env, mainClassName, 0);
if (classname == NULL) {
(*env)->ExceptionDescribe(env);
goto leave;
}
mainClass = LoadClass(env, classname);
(*env)->ReleaseStringUTFChars(env, mainClassName, classname);
} else {
mainClass = LoadClass(env, classname);
}
if (mainClass == NULL) {
(*env)->ExceptionDescribe(env);
status = 4;
goto leave;
}

其中,函数LoadClass见下:

static jclass
LoadClass(JNIEnv *env, char *name)
{
char *buf = MemAlloc(strlen(name) + 1);
char *s = buf, *t = name, c;
jclass cls;
jlong start, end;

if (debug)
start = CounterGet();

do {
c = *t++;
*s++ = (c == ′.′) ? ′/′ : c;
} while (c != ′
上一篇:如何学习Hibernate 人气:561
下一篇:如何用servlet在客户端生成一个合成图片 人气:758
浏览全部Java的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐