`

也论java加壳

    博客分类:
  • java
阅读更多
在C世界,对代码进行加密,主要通过加壳的方式。所谓加壳,就是先将程序代码加密,然后用特定的程序加载器,将代码解密后加载进内存,这样可以在防止代码的反编译,当然,有加壳工具,也有解壳工具,虽然不能100%防止crack,但仍然给代码增加一层有力的保护。
然而在java世界,保护代码是件很困难的事情,因为class文件非常规范,极易反编译,且反编译后的代码清晰可读。常见的保护办法是使用混淆器,打乱class和function以及变量的名字,可以干扰反编译后的代码的可读性。虽然简单提高了代码的安全性,但还仅仅相当于未加壳的C程序。
java可以加壳吗?以前我认为这是不可能的,因为动态加载代码这样的内存级别的操作,java无法做到,除非使用JNI(Java Native Interface),调用自己编写的C代码,在C代码中实现动态加载java代码。但是,C如何加载java代码呢?这需要对JVM相当的了解。所以当时的我认为这是不可能的。
然而,最近接触的一些知识告诉我——java也可以加壳!!

1.URLClassLoader。用URLClassLoader可以在java程序的运行期间,再将文件夹或者jar加入到classpath中,这个特性事实上就是动态加载。既然可以动态加载class的文件夹或者jar,为何不可以加载加密后的classes呢,将classes用自己的方式加密,在URLClassLoader调用时,使用自己的方式解密。不就是达到了加壳的目的了吗?不过解密的代码放在何处是个问题,就是说解壳器的代码暴露在外,还是很危险的。

2.javassist。这实在是一个非常神奇的新技术,我是在学习Tapestry5时第一次遇到这个包的,他可以动态创建java字节码,甚至可以修改你已经写好的函数,比如你的getter和setter,只是简单的读取和赋值,你可以在Runtime用他修改你的getter和setter,让你的getter和setter每次调用时都可以触发某些代码。借助这项神奇的技术,一定可以实现更强大的动态加载,加壳也就有了可能。

让我有些不爽的是,javassist又是小日本创建的项目。
http://www.open-open.com/open54954.htm
Javassist是一个开源的分析、编辑和创建Java字节码的类库。是由东京技术学院的数学和计算机科学 系的 Shigeru Chiba 所创建的。它已加入了开放源代码JBoss 应用服务器项目,通过使用Javassist对字节码操作为JBoss实现动态AOP框架。

真是让人感慨,国外的计算机科学领域在做什么,国内的计算机科学领域又在做什么,跟在别人的技术后面,做一些肤浅的事情。不说了,跑题了~~~以后再聊这个问题
分享到:
评论
19 楼 tbest 2007-03-23  
长见识了!
18 楼 run_xiao 2007-03-22  
引用

2.javassist。这实在是一个非常神奇的新技术,我是在学习Tapestry5时第一次遇到这个包的,他可以动态创建java字节码,甚至可以修改你已经写好的函数,比如你的getter和setter,只是简单的读取和赋值,你可以在Runtime用他修改你的getter和setter,让你的getter和setter每次调用时都可以触发某些代码。借助这项神奇的技术,一定可以实现更强大的动态加载,加壳也就有了可能。

并非只有javassist才能做到,ASM早就可以实现动态修改字节码的功能
17 楼 wjsir 2007-03-21  
这不但是个技术问题,还是个法律问题呢,据说在我国,传输加密信息,确切的说,传输不能被D查看的信息是非法的——据说是这样
16 楼 rautinee 2007-03-21  
关键是一个国家和民族对待科学的态度,现在的国人很浮躁,整天都想着如何快速致富,劳动密集型产业,国内的软件业真正搞创新的有多少呢?大部分的公司铺天盖地的招聘信息都是熟悉struts/hibernate/spring/jdo等等(我是指java的b/s开发方面),现在大家都在做外包,软件公司都成了劳动密集型企业,很多程序员跟服装厂的工人差不多少,区别在于人家用缝纫机,我们用键盘,整天重复着同样的工作,没有创新,没有激情。。。

我也发发牢骚!
15 楼 towjzhou 2007-03-20  
请100个初程重写一遍软件比什么加密都管用.
14 楼 roger 2007-03-19  
直接用混淆器,反编译出的代码基本上没什么价值
不过使用混淆器,要慎用Class.forName("")这样的方式来load class
13 楼 抛出异常的爱 2007-03-19  
混嚣器把
jdk一起混了...
12 楼 jasongreen 2007-03-19  
larlf 写道
可以先对java.exe加壳,然后可运行经过加密后的Jar文件。很多加密的公司都有相关的解决方案。


可否给点详细情报
11 楼 qingjian 2007-03-19  
国家 人才。。。悲哀
10 楼 dengyin2000 2007-03-19  
引用
1.URLClassLoader。用URLClassLoader可以在java程序的运行期间,再将文件夹或者jar加入到classpath中,这个特性事实上就是动态加载。既然可以动态加载class的文件夹或者jar,为何不可以加载加密后的classes呢,将classes用自己的方式加密,在URLClassLoader调用时,使用自己的方式解密。不就是达到了加壳的目的了吗?不过解密的代码放在何处是个问题,就是说解壳器的代码暴露在外,还是很危险的。

那你的URLClassLoader需要夹克么?不加壳别人非常容易知道你是怎样加密的。
9 楼 larlf 2007-03-19  
可以先对java.exe加壳,然后可运行经过加密后的Jar文件。很多加密的公司都有相关的解决方案。
8 楼 jasongreen 2007-03-19  
solospider 写道
这是个很神奇的技术。。
不过我想问一下Dynamic Proxy不是也可以实现这个功能吗?
小日本的那个开源的东东和Dynamic Proxy有什么区别?


区别在于小日本的可以无中生有,proxy只能移花接木
7 楼 liangguanhui 2007-03-19  
guoshiguan 写道
java开源,总觉得不是天经地意的事吗,
Java是开源,不代表用Java做的东西都是开源的
6 楼 guoshiguan 2007-03-19  
java开源,总觉得不是天经地意的事吗,
5 楼 fantasy 2007-03-19  
国内的开源组织还是太少了
4 楼 solospider 2007-03-19  
这是个很神奇的技术。。
不过我想问一下Dynamic Proxy不是也可以实现这个功能吗?
小日本的那个开源的东东和Dynamic Proxy有什么区别?
3 楼 zhlmmc 2007-03-19  
小日本在计算机方面的确很强。。。。
2 楼 天之魔神 2007-03-18  
确实不错,java真的很深奥
1 楼 dennis_zane 2007-03-18  
这样的帖子不应该投隐藏吧,我投良好了

相关推荐

Global site tag (gtag.js) - Google Analytics