天天看點

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)進行混淆操作後生成的日志檔案

如果你要進行轉載,請注明來源。