RetroGuard脚本文件的格式详解

RetroGuard脚本文件的格式详解

Author:Denlee    Date:2007/05/06   转载请注明来源

 RetroGuard是一个很不错的Java混淆器,而且在JBuilder企业版中也带了这个混淆器,RetroGuard本身是一个Java程序(一个Jar包)。

对Jar程序包的混淆,可以使用RetroGuard的命令行方式,也可以在Jbuilder生成jar包时进行混淆;无论哪种方法,都需要使用脚本文件,RetroGuard脚本文件的默认扩展名为.rgs。

使用脚本文件的目的就是描述哪些类、函数、变量名必须保留,不能被混淆,混淆后会在日志文件中记录错误信息、混淆情况以及保留信息等。

我们可以对类、变量、方法等进行保留不被混淆,但是我们要在脚本文件中予以说明:

1. 对类名进行保留

.class com/nokia/mid/appl/luca/Luca

其中:.class是关键字,表示本行是保留类名的说明,com/nokia/mid/appl/luca/Luca是类的完整路径名。

2. 对类的所有公有成员进行保留

.class com/nokia/mid/appl/luca/b public

其中:前面的两部分含义与上相同,第三部分public及说明对本类的所有公有成员(变量以及方法)进行保留。

.class com/nokia/mid/appl/luca/b public method

其中:method表示对本类的所有公有方法进行保留。

.class com/nokia/mid/appl/luca/b public field

其中:field表示对本类所有的公有变量进行保留。

3. 对单个类成员进行保留

(1)对单个变量进行保留

.field com/nokia/mid/appl/luca/f/F X

其中:.field表示本行是对类成员变量进行保留,com/nokia/mid/appl/luca/f/F是类f的成员变量F的完整路径名;X代表变量的类型。

对于变量的类型有基本类型和对象类型之分,基本类型的表示比较简单:如果是int类型,则用I表示;byte类型用B表示,Boolean类型用Z表示,等等。如果是对象类型,则用L紧跟类的完整路径名再紧跟分号表示,比如:Ljava/lang/String;    Lcom/nokia/mid/appl/luca/f;

(2)对数组进行保留

.field com/nokia/mid/appl/luca/f/E [X

其中:com/nokia/mid/appl/luca/f/E是类f的成员数组E的完整路径名,[表示数组,X表示数组的类型。

关于数组的类型也有基本类型和对象类型之分,表示方法参照上面对单个成员变量的保留。比如:

.field com/nokia/mid/appl/luca/f/E [Z
.field com/nokia/mid/appl/luca/f/D [Ljava/lang/String;

(3)对成员函数的保留

.method com/nokia/mid/appl/luca/f/B (XX)Y

其中:.method表示本行是对成员函数进行保留,com/nokia/mid/appl/luca/f/B是类f的成员函数B的完整路径名;一对()表示为函数,括号内的X表示函数的形参类型,关于类型的表示参见上面的变量类型说明,多个形参类型说明间无需分隔;形参也可能是数组,表示方法参见上面关于数组的说明;如果没有形参则括号内为空。Y表示函数的返回类型,返回类型的说明参见上面的变量类型说明,如果返回类型为void则用V表示。比如:

.method com/nokia/mid/appl/luca/f/B ()V
.method com/nokia/mid/appl/luca/f/a (B)Ljava/lang/String;
.method com/nokia/mid/appl/luca/f/C (I)B
.method com/nokia/mid/appl/luca/f/a (IB)B
.method com/nokia/mid/appl/luca/b/a (I[Ljava/lang/String;)Ljava/lang/String;

小结:今天下午只是对部分类型进行了测试,关于文中没有提到基本类型的表示我没有进行测试。内容虽然不算多,但整理这些东西出来还是花费了一些时间,主要参阅的资料为:

(1)RetroGuard的官方文档:Example Script Entries - RetroGuard Documentation
(2)进行混淆操作后生成的日志文件

如果你要进行转载,请注明来源。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
java混淆器 RetroGuard 免费提供源码 可运行jar文件 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 只需做很小的变化。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值