浏览 41553 次
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2003-10-12
Java 代码编译后生成的 .class 中包含有源代码中的所有信息(不包括注释),尤其是在其中保存有调试信息的时候。所以一个按照正常方式编译的 Java .class 文件可以非常轻易地被反编译。反编译工具有很多种,其中非常强大的一种是 jad。 为了避免出现这种情况,保护开发者的劳动,又有一种叫做 Java 混淆器的工具被开发出来。Java 混淆器的作用是对编译好的代码进行混淆,使得其无法被反编译或者反编译后的代码混乱难懂。Java 混淆器也有很多种,其中比较强大的一种是 RetroGuard(只说比较强大是因为我对其功效还是有些怀疑的)。 这里我介绍一下 RetroGuard 的使用方法。 将下载的 .tar.gz 或者 .zip 文件解压。有用的只有 retroguard.jar 一个文件,其它的是源代码和文档。 RetroGuard 是针对 jar 文件做混淆的。使用之前需要先配置一下。可以手工编辑配置文件,更好的方法是使用 RetroGuard 提供的 GUI 工具来生成配置文件。使用方法如下: java -classpath retroguard.jar;xxx.jar;yyy.zip;... RGgui 然后在 GUI 的 Wizard 中设置各个参数。上面的 -classpath 中应该列出要混淆的 jar 所依赖的所有的包。 RGgui 的详细使用方法可以看 RetroGuard 的文档 docs.html。 配置文件生成后,就可以运行 RetroGuard 进行混淆了。使用方法如下: java -classpath xxx.jar;yyy.zip;... RetroGuard vvv-unofb.jar vvv.jar vvv.rgs vvv.log 其中 vvv-unofb.jar 是未混淆的 jar 文件,vvv.jar 是混淆后生成的 jar 文件,vvv.rgs 是配置文件,vvv.log 是日志文件。缺省的配置文件名称为 script.rgs,缺省的日志文件名称为 retroguard.log。 在生成配置文件时需要注意的是: 1、所有 public 的类名、方法名、变量名应该全部保留。因为所有设置为 public 的内容代表了整个包对外表现的接口。若某个内容不想为外界访问,就不应该设置为 public 的。 2、若包中某个类使用了 java.lang.Class 或者 java.lang.ClassLoader 中的某个方法加载了一个类,若这个类在包外,不需要特别处理;若这个类在包内,则需要保留这个类的类名,否则混淆后会找不到这个类。 3、在包中的所有调试信息(源文件名、行号、变量/参数信息等等)应全部删除。 RetroGuard 还有一种打 patch 的所谓“增量式混淆”的使用方法。方法的要点是把上一次混淆生成的 log 文件作为下一次混淆的配置文件,这样就可以生成一个仅包含修改的 patch jar。在使用的时候把这个 path jar 放在 CLASSPATH 的上一次混淆 jar 之前。这种增量式混淆有两种方法: 1、每个 patch jar 仅包含上一个版本混淆以来发生的变化,这样每个 patch jar 会很小,但是 CLASSPATH 会越来越长。 2、每个 patch jar 包含上一个主要版本(2.0、3.0、4.0)混淆以来发生的变化,这样两个主要版本间的 patch jar 会越来越大。但是 CLASSPATH 只需做很小的变化。 以上的两种方式我都不喜欢,感觉都不够优雅。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2006-07-11
RetroGuard会把包名也混淆了。还有类,方法。显然如果使用spring的话,好像不行哦。能不能只混淆类中的方法体?包名和类名都不改变?
|
|
返回顶楼 | |
发表时间:2006-07-11
注意RetroGuard的License其实是要收费的。我使用Proguard,完全免费,配合ant来做混淆。只要注意不混淆一些类名或方法名(比如所有继承xwork的Action接口的类都需要保留类名、getter和setter方法),即使我的页面都是使用JSTL编写,也没有什么问题。
|
|
返回顶楼 | |
发表时间:2006-07-12
to crofton
在网上看到proguard都是集成在J2ME当中,所以我们作的app应用怎么弄,能给个例子说明一下么? |
|
返回顶楼 | |
发表时间:2006-07-12
通过java -jar proguardgui.jar
在这个页面上不知怎么配置,原本我有一个1234kb 的test.jar 通过处理输出后自由101kb 的outtest.jar,我直线把里面的语法之类的混淆,使用发编译出来很难看懂就ok了。而不想删除些东西。我发现outtest.jar自由实体类之类的,很多都被删除了。请问怎么配置?? |
|
返回顶楼 | |
发表时间:2006-07-12
要注意Proguard支持对Java Class进行三种类型的处理:shrinker,optimizer和obfuscator,我只用obfuscator,即只将类名、方法名、字段名修改成无意义的名字。
如果你看不懂文档,最好不要用这些工具,不然到最后自己都被混淆了。 |
|
返回顶楼 | |
发表时间:2006-07-12
哎,没有绝对的安全,能增加一些复杂度,这样又给自己造成了不便,比如base.jar这是给其他任用的。
更安全一点的是将核心的一些class加密(字节码加密),用自己的classloader装载解密。如果破解着找到这个classloader,拿到密钥。。。 |
|
返回顶楼 | |
发表时间:2006-07-13
楼上应该没做过相关工作吧,你说的方法却是最弱的一种方法。混淆的主要目的就是:代码都摆你眼前了,你也要花上开发的两三倍时间才能理解,这样目的就达到了。
|
|
返回顶楼 | |
发表时间:2006-07-13
独狼 写道 楼上应该没做过相关工作吧,你说的方法却是最弱的一种方法。混淆的主要目的就是:代码都摆你眼前了,你也要花上开发的两三倍时间才能理解,这样目的就达到了。
我们的项目也是混淆的,不过不是我搞的,但了解它的原理。 这样混淆是破解是花费些时间,但还是能破解和反编译。我见过最牛的混淆是把所有的方法和属性都混淆成了Oo0等方式,当然这些public 的方法都是自己用的,如果使用spring就不行了。但即使这样还是能破解它,我看不懂,我直接用行把。不仅要保护代码,还的保护软件不被别人滥用。 你试过我说的这种方法么??? 我觉得这是相对最安全的方式了,也可以先把类混淆,然后在加密,将classloader也混淆,但是要是找到这个classload就还是不行了 找不到最好的办法。 |
|
返回顶楼 | |
发表时间:2006-07-13
classloader很难找吗?
|
|
返回顶楼 | |