由於Java位元組碼的抽象級別較高,因此它們較容易被反編譯。下面介紹了幾種常用的方法,用於保護Java位元組碼不被反編譯。通常,這些方法不能夠絕對防止程序被反編譯,而是加大反編譯的難度而已,因為這些方法都有自己的使用環境和弱點。
1.隔離Java程序
最簡單的方法就是讓用戶不能夠訪問到Java Class程序,這種方法是最根本的方法,具體實現有多種方式。例如,開發人員可以將關鍵的Java Class放在伺服器端,客戶端通過訪問伺服器的相關介面來獲得服務,而不是直接訪問Class文件。這樣黑客就沒有辦法反編譯Class文件。目前,通過介面提供服務的標准和協議也越來越多,例如 HTTP、Web Service、RPC等。但是有很多應用都不適合這種保護方式,例如對於單機運行的程序就無法隔離Java程序。
2.對Class文件進行加密
為了防止Class文件被直接反編譯,許多開發人員將一些關鍵的Class文件進行加密,例如對注冊碼、序列號管理相關的類等。在使用這些被加密的類之前,程序首先需要對這些類進行解密,而後再將這些類裝載到JVM當中。這些類的解密可以由硬體完成,也可以使用軟體完成。
在實現時,開發人員往往通過自定義ClassLoader類來完成加密類的裝載(注意由於安全性的原因,Applet不能夠支持自定義的ClassLoader)。自定義的ClassLoader首先找到加密的類,而後進行解密,最後將解密後的類裝載到JVM當中。在這種保護方式中,自定義的ClassLoader是非常關鍵的類。由於它本身不是被加密的,因此它可能成為黑客最先攻擊的目標。如果相關的解密密鑰和演算法被攻克,那麼被加密的類也很容易被解密。
3.轉換成本地代碼
將程序轉換成本地代碼也是一種防止反編譯的有效方法。因為本地代碼往往難以被反編譯。開發人員可以選擇將整個應用程序轉換成本地代碼,也可以選擇關鍵模塊轉換。如果僅僅轉換關鍵部分模塊,Java程序在使用這些模塊時,需要使用JNI技術進行調用。當然,在使用這種技術保護Java程序的同時,也犧牲了Java的跨平台特性。對於不同的平台,我們需要維護不同版本的本地代碼,這將加重軟體支持和維護的工作。不過對於一些關鍵的模塊,有時這種方案往往是必要的。為了保證這些本地代碼不被修改和替代,通常需要對這些代碼進行數字簽名。在使用這些本地代碼之前,往往需要對這些本地代碼進行認證,確保這些代碼沒有被黑客更改。如果簽名檢查通過,則調用相關JNI方法。
4.代碼混淆
代碼混淆是對Class文件進行重新組織和處理,使得處理後的代碼與處理前代碼完成相同的功能(語義)。但是混淆後的代碼很難被反編譯,即反編譯後得出的代碼是非常難懂、晦澀的,因此反編譯人員很難得出程序的真正語義。從理論上來說,黑客如果有足夠的時間,被混淆的代碼仍然可能被破解,甚至目前有些人正在研製反混淆的工具。但是從實際情況來看,由於混淆技術的多元化發展,混淆理論的成熟,經過混淆的Java代碼還是能夠很好地防止反編譯。下面我們會詳細介紹混淆技術,因為混淆是一種保護Java程序的重要技術。
② 反編譯出來的java文件有錯誤,請問怎麼改
這個反編譯的程序 相當於自己寫的程序的 你這樣包裝改就對了try{File log = new File(System.getProperty("server.root"), file); fw = new FileWriter(log, true); bw = new BufferedWriter(fw); pw = new PrintWriter(bw, true); }catch(IOException){}return;}
③ java反編譯工具 出了問題 該怎麼辦
可以將看不懂的.class文件轉換成看得懂的.java文件,這樣一來就能很方便的讀懂別人編寫的java代碼。
java反編譯工具有多種,推薦使用jd-gui
④ 為什麼將class反編譯為java後,java直接編譯時有錯誤
midlet不存在? 如果你用的是Eclipse那你在配置環境時有問題 沒關聯EclipseMe 和關聯WTK MIDletStateChangeException應該是有異常
反編譯的軟體一般都會使用如a b c之類的變數名 導致很多類的情況下容易重名導致變數混亂 最好改成自己習慣的變數名
至於環境變數的配置按這個來
右鍵點擊我的電腦--->屬性--->高級--->環境變數--->系統變數--->新建
path: C:\j2sdk1.4.2_05\bin
classpath: .;C:\j2sdk1.4.2_05\lib\dt.jar;C:\j2sdk1.4.2_05\lib\tools.jar 確定
改了還不行的話把代碼貼出來看看 祝你走運~~~
⑤ java 代碼反編譯錯誤
換個軟體試試。可能原代碼已加密,你需要能解密的反編譯軟體去編譯。
⑥ java 反編譯中出現的問題,請高手蝦米指教:
The class file version is 50.0 <only 45.3 and 46.0 are supported
對呀這句話不就說得很明白了嗎, 你的class是50.0
而jad只支持45.3 到 46.0
⑦ 為什麼Java反編譯後帶有匯編代碼
那個不是匯編。。。是反編譯工具無法識別的位元組碼(bytecodes,java中間代碼),因為無法識別,自然只能直接把位元組碼打出來給你看了。
你多試幾種反編譯工具,並不是所有的都會出的,也不是所有的都在同一個地方出。這個取決於反編譯工具的作者對位元組碼的理解。
⑧ JAVA的環境變數java_home,PATH, CLASSPATH,按要求設置了,apk反編譯時但還是不行,求解決
確定都是32bit或者都是64bit。
使用javac -version來確定java版本。
刪除之前的JDK之後需要刪除相關的環境變數。
這個軟體我沒有過,可能是固有漏洞或者需要修改其配置文件。
⑨ java問題:為什麼有些class文件反編譯不了
private 的屬性 方法不會被反編譯出來的。
還有就是某些class是作者用自己的編譯器編譯的.你也反編譯不出來
還有就是加密了.
⑩ Java反編譯後得到的不是Java源代碼。
估計你得到的是java虛擬機指令,因為.class文件與java源代碼不是一一對應的,但與虛擬機指令卻是一一對應的,就像exe文件中的機器指令與匯編指令是一一對應的,要看懂這些代碼可以參考java虛擬機指令集