復制的class文件為什麼不能反編譯
① 我用反編譯文件將class編譯後成了java然後什麼都沒改結果沒法還原成class了
就拿目前最流行的反編譯工具jad來說,目前他也無法正常反編譯class中
關於try catch finally的部分,同時他的官方網站上也有說明他反編譯
的內容僅為java文件的主體流程,其中如果出現參數或方法名錯誤很正常
因此反編譯文件不能正常還原java.class很正常,這就是為什麼java有不開源
的程序,如果都可以反編譯class文件,那些不開源的豈不都是免費的了,因此該
工具僅能夠參考,不能夠照抄,希望對你有幫助
② java問題:為什麼有些class文件反編譯不了
private 的屬性 方法不會被反編譯出御液來的。
還有就搏模是某些class是作者用自己的編譯器編譯的.你也反編譯不出來
還有就是加密了基拆緩.
③ 如何利用反編譯軟體打開並修改class文件
沒辦法完全反編譯所以的class文件為java文件的,因為java中編譯具有不可逆性。
但是可以將每個文件反編譯,之後直接放到相應的包路徑下來進行重新編碼。
第一步:通過附件的「jd-gui」打開jar文件;
第二步:將每個class文件的內容,粘貼到一個新建的java工程中(包路徑必須相同);
第三步:修改需要修改的類,之後如果運行沒問題的話,直接導出為jar包即可。
備註:其實此過程中出錯的幾率還是很大的,如果能夠實現百分百編譯的話,那麼所以的項目也就間接開源了,這肯定是不現實的。
④ 任何程序都可以反編譯嗎為什麼有一些程序不可以反編譯
javap是用作反編譯的,但是javap只能給出你要反編譯的class的結構,比如有什麼方法,有什麼static或者非static的變數什麼,但不可能產生源代碼編譯後的文件不是原代碼文件,所以不能直接拿來編譯。希望樓主採納
⑤ 為什麼反編譯點class文件不能被編輯啊
由於Java位元組碼的抽象級別較高,因此它們較容易被反編譯。下面介紹了幾種常用的方法,用於保護Java位元組碼不被反編譯。
1.隔離Java程序
2.對Class文件進行加密
3.轉換成本地代碼
4.代碼混淆
⑥ 安裝jadClipse插件後,還是不能反編譯.class:
完整步驟如下:
1.下載jad.exe(Jad v1.5.8g版本)和net.sf.jadclipse_3.3.0.jar;
2.將jad.exe放進\Java\jdk1.7.0\jre\bin目錄底 下,如果你的環境變數設置的沒有問題,那麼在DOS環境下敲入cmd->jad,你會發現jad命令已經可以使用了,但是要與 MyEclipse6.5結合使用,請看下一步;
3.將net.sf.jadclipse_3.3.0.jar放到下面的目錄下 D:\MyEclipse 6.5\eclipse\plugins;
4.重新啟動MyEclipse6.5,進入 Preferences->Java->JadClipse,設置(1)Path to decompiler路徑為Jad.exe的全路徑,例如:C:\Program Files (x86)\Java\jdk1.6.0_07\jre\bin\jad.exe設置(2)在Directory for temporary files中指定臨時文件的路徑 如:C:\Program Files (x86)\MyEclipse 6.5\myeclipse\temp(如果沒有temp文件夾,自己創建一個空的取名為temp就行)點擊Apply->OK;
5.Window->Preferences->General->Editors->File Associations,將.class文件默認成通過JadClipse Class File Viewer打開。
⑦ 可以反編譯.class文件嗎
當然可以了。在java軟體包的bin文件夾下有一個javap程序,就是用來反編譯的。
用法如java一樣。就是先用javac變成位元組碼文件就是.class文件後,用javap 加上文件名就可以反編譯了。
舉個例子test.class,反編譯用javap test就行了。
⑧ 最新我公司在使用部署一公司的java web應用程序發現他們的所有的class無法反編譯,怎麼做到的
怎麼可能不能反編譯,除非他的代碼不想讓機器運行。
java加密無非是模糊化或者是修改classloader加密。前一種直接反編譯,只是不容易看而已。
後一種先反編譯classloader,研究加密過程,再解密反編譯即可。
⑨ 混淆的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);
}