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)進行混淆操作後生成的日志檔案
如果你要進行轉載,請注明來源。