JAVA网站制作之怎样回护Java程序 避免Java反编译仓酷云
学习JAVA的目的更多的是培养自身的工作能力,我觉得工作能力的一个核心就是:独立思考能力,因为只有独立思考后,才会有自己的见解 Java是一种跨平台的、注释型言语。Java源代码编译两头“字节码”存储于class文件中。Class文件是一种字节码情势的两头代码,该字节码中包含了良多源代码的信息,比方变量名、办法名等。因而,Java两头代码的反编译就变得十分简单。今朝市场上有很多收费的、商用的反编译软件,都可以天生高质量的反编译后的源代码。以是,对开辟职员来讲,怎样回护Java程序就酿成了一个十分主要的应战。本文起首会商了回护Java程序的基础办法,然后对代码搅浑成绩举行深切研讨,最初分离一个实践的使用程序,剖析怎样在理论中回护Java程序。反编译成为回护Java程序的最年夜应战
一般C、C++等编程言语开辟的程序都被编译成方针代码,这些方针代码都是本呆板的二进制可实行代码。一般一切的源文件被编译、链接成一个可实行文件。在这些可实行文件中,编译器删除程序中的变量称号、办法称号等信息,这些信息常常是由内存地点暗示,比方假如必要利用一个变量,常常是经由过程这个变量的地点来会见的。因而,反编译这些当地的方针代码就长短常坚苦的。
Java言语的呈现,使得反编译变得十分简单而无效。缘故原由以下:1.因为跨平台的需求,Java的指令集对照复杂而通用,较简单得出程序的语义信息;2.Java编译器将每个类编译成一个独自的文件,这也简化了反编译的事情;3.Java的Class文件中,仍旧保存一切的办法称号、变量称号,而且经由过程这些称号来会见变量和办法,这些标记常常带有很多语义信息。因为Java程序本身的特性,关于不经由处置的Java程序反编译的效果十分好。
今朝,市场上有很多Java的反编译工具,有收费的,也有贸易利用的,另有的是开放源代码的。这些工具的反编译速率和效果都十分不错。好的反编译软件,可以反编译出十分靠近源代码的程序。因而,经由过程反编译器,黑客可以对这些程序举行变动,大概复用个中的程序。因而,怎样回护Java程序不被反编译,长短常主要的一个成绩。
经常使用的回护手艺
因为Java字节码的笼统级别较高,因而它们较简单被反编译。本节先容了几种经常使用的办法,用于回护Java字节码不被反编译。一般,这些办法不克不及够相对避免程序被反编译,而是加年夜反编译的难度罢了,由于这些办法都有本人的利用情况和缺点。
断绝Java程序
最复杂的办法就是让用户不克不及够会见到JavaClass程序,这类办法是最基本的办法,详细完成有多种体例。比方,开辟职员能够将关头的JavaClass放在服务器端,客户端经由过程会见服务器的相干接口来取得服务,而不是间接会见Class文件。如许黑客就没有举措反编译Class文件。今朝,经由过程接口供应服务的尺度和协定也愈来愈多,比方HTTP、WebService、RPC等。可是有良多使用都不合适这类回护体例,比方关于单机运转的程序就没法断绝Java程序。这类回护体例见所示。
<br>
断绝Java程序表示图
对Class文件举行加密
为了避免Class文件被间接反编译,很多开辟职员将一些关头的Class文件举行加密,比方对注册码、序列号办理相干的类等。在利用这些被加密的类之前,程序起首必要对这些类举行解密,尔后再将这些类装载到JVM傍边。这些类的解密能够由硬件完成,也能够利用软件完成。
在完成时,开辟职员常常经由过程自界说ClassLoader类来完成加密类的装载(注重因为平安性的缘故原由,Applet不克不及够撑持自界说的ClassLoader)。自界说的ClassLoader起首找到加密的类,尔后举行解密,最初将解密后的类装载到JVM傍边。在这类回护体例中,自界说的ClassLoader长短常关头的类。因为它自己不是被加密的,因而它大概成为黑客开始打击的方针。假如相干的解密密钥和算法被霸占,那末被加密的类也很简单被解密。这类回护体例表示图见。
<br>
对Class文件举行加密表示图
转换本钱地代码
将程序转换本钱地代码也是一种避免反编译的无效办法。由于当地代码常常难以被反编译。开辟职员能够选择将全部使用程序转换本钱地代码,也能够选择关头模块转换。假如仅仅转换关头部分模块,Java程序在利用这些模块时,必要利用JNI手艺举行挪用。
固然,在利用这类手艺回护Java程序的同时,也就义了Java的跨平台特征。关于分歧的平台,我们必要保护分歧版本的当地代码,这将减轻软件撑持和保护的事情。不外关于一些关头的模块,偶然这类计划常常是需要的。
为了包管这些当地代码不被修正和替换,一般必要对这些代码举行数字署名。在利用这些当地代码之前,常常必要对这些当地代码举行认证,确保这些代码没有被黑客变动。假如署名反省经由过程,则挪用相干JNI办法。这类回护体例表示图见。
代码搅浑
<br>
转换本钱地代码表示图
代码搅浑是对Class文件举行从头构造和处置,使得处置后的代码与处置前代码完成不异的功效(语义)。可是搅浑后的代码很难被反编译,即反编译后得出的代码长短常难明、流畅的,因而反编译职员很可贵出程序的真正语义。从实际下去说,黑客假如有充足的工夫,被搅浑的代码仍旧大概被破解,乃至今朝有些人正在研制反搅浑的工具。可是从实践情形来看,因为搅浑手艺的多元化开展,搅浑实际的成熟,经由搅浑的Java代码仍是可以很好地避免反编译。上面我们会具体先容搅浑手艺,由于搅浑是一种回护Java程序的主要手艺。是代码搅浑的表示图。
<br>
代码搅浑表示图
几种手艺的总结
以上几种手艺都有分歧的使用情况,各自都有本人的缺点,表1是相干特性的对照。
搅浑手艺先容
表1分歧回护手艺对照表
<br>
到今朝为止,关于Java程序的回护,搅浑手艺仍是最基础的回护办法。Java搅浑工具也十分多,包含贸易的、收费的、开放源代码的。Sun公司也供应了本人的搅浑工具。它们年夜多都是对Class文件举行搅浑处置,也有大批工具起首对源代码举行处置,然后再对Class举行处置,如许加年夜了搅浑处置的力度。今朝,贸易上对照乐成的搅浑工具包含JProof公司的1stBarrier系列、Eastridge公司的JShrink和4thpass.com的SourceGuard等。次要的搅浑手艺依照搅浑方针能够举行以下分类,它们分离为标记搅浑(LexicalObfuscation)、数据搅浑(DataObfuscation)、把持搅浑(ControlObfuscation)、防备性搅浑(PreventTransformation)。
标记搅浑
在Class中存在很多与程序实行自己有关的信息,比方办法称号、变量称号,这些标记的称号常常带有必定的寄义。比方某个办法名为getKeyLength(),那末这个办法极可能就是用来前往Key的长度。标记搅浑就是将这些信息打乱,把这些信息酿成无任何意义的暗示,比方将一切的变量从vairant_001入手下手编号;关于一切的办法从method_001入手下手编号。这将对反编译带来必定的坚苦。关于公有函数、部分变量,一般能够改动它们的标记,而不影响程序的运转。可是关于一些接口称号、私有函数、成员变量,假如有别的内部模块必要援用这些标记,我们常常必要保存这些称号,不然内部模块找不到这些称号的办法和变量。因而,多半的搅浑工具关于标记搅浑,都供应了丰厚的选项,让用户选择是不是、怎样举行标记搅浑。
数据搅浑
<br>
改动数据会见
数据搅浑是对程序利用的数据举行搅浑。搅浑的办法也有多种,次要能够分为改动数据存储及编码(StoreandEncodeTransform)、改动数据会见(AccessTransform)。
改动数据存储和编码能够打乱程序利用的数据存储体例。比方将一个有10个成员的数组,拆开为10个变量,而且打乱这些变量的名字;将一个两维数组转化为一个一维数组等。关于一些庞大的数据布局,我们将打乱它的数据布局,比方用多个类取代一个庞大的类等。
别的一种体例是改动数据会见。比方会见数组的下标时,我们能够举行必定的盘算,就是一个例子。
在理论搅浑处置中,这两种办法一般是综合利用的,在打乱数据存储的同时,也打乱数据会见的体例。经由对数据搅浑,程序的语义变得庞大了,如许增年夜了反编译的难度。
把持搅浑
把持搅浑就是对程序的把持流举行搅浑,使得程序的把持流加倍难以反编译,一般把持流的改动必要增添一些分外的盘算和把持流,因而在功能上会给程序带来必定的负面影响。偶然,必要在程序的功能和搅浑水平之间举行衡量。把持搅浑的手艺最为庞大,技能也最多。这些手艺能够分为以下几类:
增添搅浑把持经由过程增添分外的、庞大的把持流,能够将程序本来的语义埋没起来。比方,关于顺次序实行的两个语句A、B,我们能够增添一个把持前提,以决意B的实行。经由过程这类体例加年夜反汇编的难度。可是一切的搅扰把持都不该该影响B的实行。就给出三种体例,为这个例子增添搅浑把持。
<br>
增添搅浑把持的三种体例
把持流重组重组把持流也是主要的搅浑办法。比方,程序挪用一个办法,在搅浑后,能够将该办法代码嵌进到挪用程序傍边。反过去,程序中的一段代码也能够变化为一个函数挪用。别的,关于一个轮回的把持流,为能够拆分多个轮回的把持流,大概将轮回转化成一个递回历程。这类办法最为庞大,研讨的职员也十分多。
防备性搅浑
这类搅浑一般是针对一些公用的反编译器而计划的,一样平常来讲,这些手艺使用反编译器的缺点大概Bug来计划搅浑计划。比方,有些反编译器关于Return前面的指令不举行反编译,而有些搅浑计划恰好将代码放在Return语句前面。这类搅浑的无效性关于分歧反编译器的感化也不太不异的。一个好的搅浑工具,一般会综合利用这些搅浑手艺。
案例剖析
在理论傍边,回护一个年夜型Java程序常常必要综合利用这些办法,而不是单一利用某一种办法。这是由于每种办法都有其缺点和使用情况。综合利用这些办法使得Java程序的回护加倍无效。别的,我们常常还必要利用别的的相干平安手艺,比方平安认证、数字署名、PKI等。
本文给出的例子是一个Java使用程序,它是一个SCJP(SunCertificateJavaProgrammer)的摹拟测验软件。该使用程序带有大批的摹拟标题,一切的标题都被加密后存储在文件中。因为它所带的题库是该软件的中心部分,以是关于题库的存取和会见就成为十分中心的类。一旦这些相干的类被反编译,则一切的题库将被破解。如今,我们来思索怎样回护这些题库及相干的类。
在这个例子中,我们思索利用综合回护手艺,个中包含当地代码和搅浑手艺。由于该软件次要公布在Windows上,因而转换本钱地代码后,仅仅必要保护一个版本的当地代码。别的,搅浑对Java程序也长短常无效的,合用于这类自力公布的使用体系。
在详细的计划中,我们将程序分为两个部分,一个是由当地代码编写的题库会见的模块,别的一个是由Java开辟的别的模块。如许能够更高水平地回护标题办理模块不被反编译。关于Java开辟的模块,我们仍旧要利用搅浑手艺。该计划的表示图拜见。
<br>
SCJP回护手艺计划图
关于标题办理模块,因为程序次要在Windows下利用,以是利用C++开辟题库会见模块,而且供应了必定的会见接口。为了回护题库会见的接口,我们还增添了一个初始化接口,用于每次利用题库会见接口之前的初始化事情。它的接口次要分为两类:
1.初始化接口
在利用题库模块之前,我们必需先挪用初始化接口。在挪用该接口时,客户端必要供应一个随机数作为参数。题库办理模块和客户端经由过程这个随机数,按必定的算法同时天生不异的SessionKey,用于加密今后输出和输入的一切数据。经由过程这类体例,只要受权(无效)的客户端才干够毗连准确的毗连,天生准确的SessionKey,用于会见题库信息。不法的客户很难天生准确的SessionKey,因而没法取得题库的信息。假如必要创建更高的保密级别,也能够接纳双向认证手艺。
2.数据会见接口
认证完成以后,客户端就能够一般的会见题库数据。可是,输出和输入的数据都是由SessionKey所加密的数据。因而,只要准确的题库办理模块才干够利用题库办理模块。时序图暗示了题库办理模块和别的部分的交互历程。
<br>
题库办理模块和别的部分的交互历程图
诸如RMI,EJB等一些技术并不是你说的那么复杂,而是它们把一些复杂的工具封装成不复杂的工具了,理解这些工具是需要些时间。我问你,.net网页编程里有这些工具吗?要简单多少?。 你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢? Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。 我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。 《JAVA语言程序设计》或《JAVA从入门到精通》这两本书开始学,等你编程有感觉的时候也可以回看一下。《JAVA读书笔记》这本书,因为讲的代码很多,也很容易看懂,涉及到面也到位。是你学习技术巩固的好书,学完后就看看《JAVA编程思想》这本书,找找一个自己写的代码跟书上的代码有什么不一样。 是一种使网页(Web Page)产生生动活泼画面的语言 你快去找一份Java的编程工作来做吧(如果是在校学生可以去做兼职啊),在实践中提高自己,那才是最快的。不过你得祈祷在公司里碰到一个高手,而且他 还愿意不厌其烦地教你,这样好象有点难哦!还有一个办法就是读开放源码的程序了。我们知道开放源码大都出自高手,他们设计合理,考虑周到,再加上有广大的程序员参与,代码的价值自然是字字珠叽,铿锵有力(对不起,偶最近《金装四大才子》看多了)。 http://www.jdon.com/去下载,或到同济技术论坛的服务器ftp://nro.shtdu.edu.cn去下,安装上有什么问题,可以到论坛上去提问。 Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。 关于设计模式的资料,还是向大家推荐banq的网站 http://www.jdon.com/,他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。 其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。 Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。 有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想) 当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢? 在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。 那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧! 科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。 接着就是EJB了,EJB就是Enterprise JavaBean, 看名字好象它是Javabean,可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的 Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。 是一种由美国SUN计算机公司(Sun Microsystems, Inc.)所研究而成的语言 《JAVA语言程序设计》或《JAVA从入门到精通》这两本书开始学,等你编程有感觉的时候也可以回看一下。《JAVA读书笔记》这本书,因为讲的代码很多,也很容易看懂,涉及到面也到位。是你学习技术巩固的好书,学完后就看看《JAVA编程思想》这本书,找找一个自己写的代码跟书上的代码有什么不一样。
页:
[1]
2