當前位置:首頁 » 編程軟體 » java混淆反編譯

java混淆反編譯

發布時間: 2023-05-04 03:34:43

javaweb項目做混淆的詳細步驟

混淆的工具很多,最常用的為retroguard.
Java 代碼編譯後生成的 .class 中包含有源代碼中的所有信息(不包括注釋),尤其是在其中保存有調試信息的時候。所以一個按照正常方式編譯的 Java .class 文件可以非常輕易地被反編譯。反編譯工具有很多種,其中非常強大的一種是 jad。
為了避免出現這種情況,保護開發者的勞動,又有一種叫做 Java 混淆器的工具被開發出來。Java 混淆器的作用是對編譯好的代碼進行混淆,使得其無法被反編譯或者反編譯後的代碼混亂難懂。Java 混淆器也有很多種,其中比較強大的一種是 RetroGuard(只說比較強大是因為我對其功效還是有些懷疑的)。

這里我介紹一下 RetroGuard 的使用方法。
將下載的 .tar.gz 或者 .zip 文件解壓。有用的只有 retroguard.jar 一個文件,其它的是源代碼和文檔。
RetroGuard 是針對 jar 文件做混淆的。使用之前需要先配置一下。可以手工編輯配置文件,更好的方法是使用 RetroGuard 提供的 GUI 工具來生成配置文件。使用方法如下:
java -classpath retroguard.jar;xxx.jar;yyy.zip;... RGgui
然後在 GUI 的 Wizard 中設置各個參數。上面的 -classpath 中應該列出要混淆的 jar 所依賴的所有的包。
RGgui 的詳細使用方法可以看 RetroGuard 的文檔 docs.html。
配置文件生成後,就可以運行 RetroGuard 進行混淆了。使用方法如下:
java -classpath xxx.jar;yyy.zip;... RetroGuard vvv-unofb.jar vvv.jar vvv.rgs vvv.log
其中 vvv-unofb.jar 是未混淆的 jar 文件,vvv.jar 是混淆後生成的 jar 文件,vvv.rgs 是配置文件,vvv.log 是日誌文件。預設的配置文件名稱為 script.rgs,預設的日誌文件名稱為 retroguard.log。

在生成配置文件時需要注意的是:
1、所有 public 的類名、方法名、變數名應該全部保留。因為所有設置為 public 的內容代表了整個包對外表現的介面。若某個內容不想為外界訪問,就不應該設置為 public 的。
2、若包中某個類使用了 java.lang.Class 或者 java.lang.ClassLoader 中的某個方法載入了一個類,若這個類在包外,不需要特別處理;若這個類在包內,則需要保留這個類的類名,否則混淆後會找不到這個類。
3、在包中的所有調試信息(源文件名、行號、變數/參數信息等等)應全部刪除。

㈡ 如何有效的防止Java程序被反編譯和破解

由於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程序的重要技術。

㈢ javacompile混淆器怎麼混淆後的class文件還是可以被反編譯出來呢求高手指點....

混淆的作用並不是使class文件不能被反編譯
混淆的作用是使反編譯的代碼更難讓人閱讀,比如一些計算金錢的敏感邏輯里有如下的代碼(新金額=舊金額*某個倍率):
double newMoney=oldMoney*rate;
如果這樣的代碼直接編譯成class文件,別人反編譯這個class文件就能很清楚的看到金錢的計算關系,混淆後代碼可能就變成這樣的了:
double a=b*c;
這樣的代碼別人即使反編譯了,也是很難看懂其中的邏輯關系的

㈣ 如何分析經過混淆後的java代碼

混淆代碼 是為了防止class文件被反編譯用的 但是程序的功能還是正常的 和你正常運行一樣
如果連變數名都混淆了,就是說所有有具體意義的英文變數名都用a,b,c,x,y等等來表示,那這是不可能還原的,因為電腦也不可能知道你這個a實際上代表了你的年齡而那個c代表了你老婆的胸圍!
但如果只是個事混淆,那網上倒有不少工具可以格式化源代碼!自己搜一搜吧!推薦一款編輯器,IntelliJ,很不錯,值得一提的是,我用過的眾多編輯器中,這款編輯器的代碼格式化功能最強大!

㈤ 什麼是Java代碼的編譯與反編譯

Java代碼的編譯與反編譯

2017-02-21Hollis數盟

一、什麼是編譯

1、利用編譯程序從源語言編寫的源程序產生目標程序的過程。

2、用編譯程序產生目標程序的動作。編譯就是把高級語言變成計算機可以識別的2進制語言,計算機只認識1和0,編譯程序把人們熟悉的語言換成2進制的。編譯程序把一個源程序翻譯成目標程序的工作過程分為五個階段:詞法分析;語法分析;語義檢查和中間代碼生成;代碼優化;目標代碼生成。主要是進行詞法分析和語法分析,又稱為源程序分析,分析過程中發現有語法錯誤,給出提示信息。

二、什麼是反編譯

計算機軟體反向工程(Reverseengineering)也稱為計算機軟體還原工程,是指通過對他人軟體的目標程序(可執行程序)進行「逆向分析、研究」工作,以推導出他人的軟體產品所使用的思路、原理、結構、演算法、處理過程、運行方法等設計要素,某些特定情況下可能推導出源代碼。反編譯作為自己開發軟體時的參考,或者直接用於自己的軟體產品中。

三、Java類的編譯與反編譯

我們在最初學習Java的時候,會接觸到兩個命令:javac和java,那個時候我們就知道,javac是用來編譯Java類的,就是將我們寫好的helloworld.java文件編譯成helloworld.class文件。

class文件打破了C或者C++等語言所遵循的傳統,使用這些傳統語言寫的程序通常首先被編譯,然後被連接成單獨的、專門支持特定硬體平台和操作系統的二進制文件。通常情況下,一個平台上的二進制可執行文件不能在其他平台上工作。而Javaclass文件是可以運行在任何支持Java虛擬機的硬體平台和操作系統上的二進制文件。

那麼反編譯呢,就是通過helloworld.class文件得到java文件(或者說是程序員能看懂的Java文件)

四、什麼時候會用到反編譯

1、我們只有一個類的class文件,但是我們又看不懂Java的class文件,那麼我們可以把它反編譯成我們可以看得懂的文件。

2、學習Java過程中,JDK的每個版本都會加入越來越多的語法糖,有些時候我們想知道Java一些實現細節,我們可以藉助反編譯。

五、反編譯工具

1、javap

2、Jad:官網(牆裂推薦)

客戶端:

可以在官網下載可執行文件,找到對應的操作系統的對應版本,然後進行安裝使用。

因為我使用的是linux操作系統,所以我下載的是Linux版本的工具,這個工具下載好之後會有一個執行文件,只要在執行文件所在目錄執行./jadhelloworld.class就會在當前目錄下生成helloworld.jad文件,該文件里就是我們很熟悉的Java代碼

Eclipse插件:

下載地址在官網下載插件的jar包,然後將jar包放到eclipse的plugins目錄下『在打開Eclipse,Eclipse->Window->Preferences->Java,此時你會發現會比原來多了一個JadClipse的選項,單擊,在Pathtodecompiler中輸入你剛才放置jad.exe的位置,也可以制定臨時文件的目錄。當然在JadClipse下還有一些子選項,如Debug,Directives等,按照默認配置即可。基本配置完畢後,我們可以查看一下class文件的默認打開方式,Eclipse->Window->Preferences->General->Editors->FileAssociations我們可以看到class文件的打開方式有兩個,JadClipse和Eclipse自帶的ClassFileViewer,而JadClipse是默認的。全部配置完成,下面我們可以查看源碼了,選擇需要查看的類,按F3即可查看源碼

㈥ java編譯混淆後的class如何反編譯java文件!

即使不混淆也不可能100%的反編譯。。。。混淆之後幾乎是不可能的,或者代碼沒什麼價值了。

㈦ 如何反編譯被Java混淆器保護的class文件

人家混淆了就是為了防止你反編譯。否則反編譯後能直接生成源碼,人混淆還有啥用?
混淆了就只能費些勁,慢慢看了,花點時間應該還能看懂。

㈧ 用JAVA反編譯器,把.class文件反編譯後會不會和原文件不同

如果是簡單的JAVA代碼或者沒有經過混淆編譯的代碼就會使一樣或者差不多的。
但是一下兩種情況就特別不一樣:
1.經過混淆編譯的
2.使用內部類的
另外,所有的注釋都是沒有的。
當然還有其他的一些情況下你會發現不一樣了,某些情況下循環的時候就會,而且變數申明的位置會改變等等。

㈨ 混淆的class文件怎麼進行反編譯

一般情況下Java應用的開發者為了保護代碼不被別人抄襲,在生成class文件的時候都java文件進行了混淆,這種class文件用反編譯工具得到的結果很難看懂,並且不能進行編譯。
從研究的角度,淺析如何讀懂這種反編譯過來的文件。
例子一:賦值
反編譯過來的代碼如下:
Node node;
Node node1 = _$3.getChildNodes().item(0);
node1;
node1;
JVM INSTR swap ;
node;
getChildNodes();
0;
item();
getChildNodes();
0;
item();
getNodeValue();
String s;
s;
原始語句:
Node node;
Node node1 = currDocument.getChildNodes().item(0);
node = node1;
String s = node.getChildNodes().item(0).getChildNodes().item(0).getNodeValue();
註解:
JVM INSTR swap ; //賦值語句
練習:
String s1;
String s8 = node.getChildNodes().item(1).getChildNodes().item(0).getNodeValue();
s8;
s8;
JVM INSTR swap ;
s1;
10;
Integer.parseInt();
int i;
i;

例子二:不帶參數創建對象
反編譯過來的代碼如下:
JVM INSTR new #244 ;
JVM INSTR p ;
JVM INSTR swap ;
CrossTable();
CrossTable crosstable;
crosstable;
原始語句:
CrossTable crosstable = new CrossTable();
註解:
練習:
JVM INSTR new #246 ;
JVM INSTR p ;
JVM INSTR swap ;
Database();
Object obj;
obj;
例子三:帶參數創建對象
反編譯過來的代碼如下:
JVM INSTR new #262 ;
JVM INSTR p ;
JVM INSTR swap ;
String.valueOf(s2);
StringBuffer();
s.substring(j, i);
append();
s6;
append();
toString();
s2;

原始語句:
s2 = (new StringBuffer(String.valueOf(s2))).append(s.substring(j, i)).append(s6).toString();
註解:
此語句實際上是:s2 += s.substring(j, i) + s6;
練習:
例子四:for循環
反編譯過來的代碼如下:
int k = 0;
goto _L4
_L8:
...
k++;
_L4:
if(k < as.length) goto _L8; else goto _L7
原始語句:
for(int k=0;k < as.length;k++)
{
...
}
註解:
例子五:while循環
反編譯過來的代碼如下:
String s1 = "";
goto _L1
_L3:
JVM INSTR new #262 ;
JVM INSTR p ;
JVM INSTR swap ;
String.valueOf(s1);
StringBuffer();
_$2(resultset, s, l);
append();
toString();
s1;
_L1:
if(resultset.next()) goto _L3; else goto _L2
原始語句:
String s1 = "";
while(resultset.next())
{
s1 = s1 + resultSetToString(resultset, s, l);
}

㈩ 如何混淆Java編譯後的類或jar,或將jar編譯成exe,使人無法反編譯獲得源代碼

混淆就可以了
我一直在用proguard4.5.1做Java項目的混淆

熱點內容
sql創建鏈接 發布:2025-07-08 00:08:38 瀏覽:398
ftp上傳中斷 發布:2025-07-08 00:08:37 瀏覽:641
linux雲計算課程 發布:2025-07-08 00:07:23 瀏覽:23
安卓網易雲怎麼發布歌曲 發布:2025-07-07 23:42:29 瀏覽:626
安卓內存讀取腳本 發布:2025-07-07 23:42:19 瀏覽:871
python27漢化 發布:2025-07-07 23:42:18 瀏覽:721
源碼鎖屏 發布:2025-07-07 23:26:52 瀏覽:944
手機版編程軟體 發布:2025-07-07 22:57:22 瀏覽:122
linux下執行sh腳本 發布:2025-07-07 22:49:00 瀏覽:127
雲盤怎麼存儲資料 發布:2025-07-07 22:49:00 瀏覽:915