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)进行混淆操作后生成的日志文件
如果你要进行转载,请注明来源。