JAVA語言是1995年5月由SUN公司發(fā)布的,由于其安全性高、代碼優(yōu)化、跨平臺(tái)等特性,迅速取代了很多傳統(tǒng)高級語言,占據(jù)了企業(yè)級網(wǎng)絡(luò)應(yīng)用開發(fā)等諸多領(lǐng)域的霸主地位,新疆烏魯木齊軟件開發(fā)網(wǎng),m.zgna.net 整理。
不過,JAVA最突出的跨平臺(tái)優(yōu)勢使得它不能被編譯成本地代碼,而要以中間代碼的形式運(yùn)行在虛擬機(jī)環(huán)境中,這使得JAVA的反編譯要比別的高級語言容易實(shí)現(xiàn),并且反編譯的代碼經(jīng)過優(yōu)化后幾乎可以與源代碼相媲美。 為了更好地保護(hù)知識(shí)產(chǎn)權(quán),避免本公司的智力成果輕易被人竊取,開發(fā)者有必要對反編譯工具深入了解,以便有針對性地采取保護(hù)措施。 目前,比較流行的JAVA反編譯工具有近30種,其中有三款堪稱精品: 一、 應(yīng)用廣泛的JAD 在眾多的JAVA反編譯工具中,有幾種非常著名的工具使用了相同的核心引擎——JAD,其中主要包括:Front End Plus、mDeJava、Decafe Pro、Cavaj Java Decompiler、DJ Java Decompiler、NMI’s Java Class Viewer和國產(chǎn)的JAVA源代碼反編譯專家。 JAD本身是一個(gè)命令行工具,沒有圖形界面,上述的這些工具大多是在JAD內(nèi)核的基礎(chǔ)之上加了一個(gè)圖形界面而已。這么多種產(chǎn)品的共同選擇,足可證明JAD在JAVA反編譯領(lǐng)域中的尊貴地位。 筆者用來測試的JAD版本是1.5.8f,其運(yùn)行界面如下圖: 需要特別說明的是,JODE不是通過常規(guī)的Open->File的方式來加載JAVA編譯后的類文件(*.class)或是類包(*.jar)的,而是通過在Options菜單中的Set Classpath來實(shí)現(xiàn)的,單獨(dú)的類文件可以將它的上一級目錄作為Classpath輸入,然后再選擇Reload Classpath即可:
新加入的類包或是類的名字會(huì)在左側(cè)窗口出現(xiàn),雙擊類包名可以展開目錄樹結(jié)構(gòu),雙擊需要反編譯的類名則在右上角的窗口中直接顯示反編譯后的源代碼。 三、 獨(dú)樹一幟的DAVA DAVA不是一個(gè)獨(dú)立的JAVA反編譯器,而是JAVA代碼優(yōu)化工具Soot的一部分。Soot和JODE一樣是純JAVA開發(fā)的,也是一個(gè)獨(dú)立的JAR包,但卻不能通過雙擊直接運(yùn)行,而是象JAD一樣在命令行狀態(tài)運(yùn)行。
Soot對環(huán)境變量的配置要求非常嚴(yán)格,通常情況下要對CLASSPATH做如下設(shè)置: Set CLASSPATH=%CLASSPATH%;c:\sootdir\sootclasses-2.1.0.jar;.; 其中的c:\sootdir\是下載的soot類包放置的路徑,CLASSPATH末尾的.;代表了當(dāng)前目錄,如果不加上這個(gè)的話Soot經(jīng)常會(huì)報(bào)一個(gè)找不到類的錯(cuò)誤。 DAVA是作為Soot的一個(gè)參數(shù)使用的,通常的用法如下: Java soot.Main –f dava –d c:\javasource javatest 注意最后的類名不用帶.class后綴,因?yàn)樗J(rèn)是處理class文件,這個(gè)操作與前述的JAD的參數(shù)效果相同。 DAVA采取了流程優(yōu)化的方式進(jìn)行反編譯,與傳統(tǒng)反編譯思路不盡相同,但卻對改變流程類的加密方法有獨(dú)特的反編譯效果。 上述的三種工具各有千秋,但效果都非常不錯(cuò)。經(jīng)測試,它們基本上都可以把JDK自帶的一些例程完全反編譯,然后不加任何修改可再編譯成功,并能正常運(yùn)行! (文中工具均經(jīng)過本人親手測試,當(dāng)時(shí)用的是jdk1.4.2_03,現(xiàn)在離寫文章的時(shí)候過了一年多了,jdk都出到1.5了,怕是有些程序也不太好反編了)
|