何看懂Java混淆后的反編譯代碼
如何看懂Java混淆后的反編譯代碼
作者:dozb
一般情況下Java應(yīng)用的開發(fā)者為了保護(hù)代碼不被別人抄襲,在生成class文件的時(shí)候都java文件進(jìn)行了混淆,這種class文件用反編譯工具得到的結(jié)果很難看懂,并且不能進(jìn)行編譯。本文從研究的角度,淺析如何讀懂這種反編譯過來的文件。
例子一:賦值 反編譯過來的代碼如下: 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 ; //賦值語句 練習(xí): String s1; String s8 = node.getChildNodes().item(1).getChildNodes().item(0).getNodeValue(); s8; s8; JVM INSTR swap ; s1; 10; Integer.parseInt(); int i; i;
例子二:不帶參數(shù)創(chuàng)建對象 反編譯過來的代碼如下: JVM INSTR new #244 <Class CrossTable>; JVM INSTR dup ; JVM INSTR swap ; CrossTable(); CrossTable crosstable; crosstable;
原始語句: CrossTable crosstable = new CrossTable(); 注解: 練習(xí): JVM INSTR new #246 <Class Database>; JVM INSTR dup ; JVM INSTR swap ; Database(); Object obj; obj;
例子三:帶參數(shù)創(chuàng)建對象 反編譯過來的代碼如下: JVM INSTR new #262 <Class StringBuffer>; JVM INSTR dup ; 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(); 注解: 此語句實(shí)際上是:s2 += s.substring(j, i) + s6; 練習(xí):
例子四:for循環(huán) 反編譯過來的代碼如下: 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循環(huán) 反編譯過來的代碼如下: String s1 = ""; goto _L1 _L3: JVM INSTR new #262 <Class StringBuffer>; JVM INSTR dup ; 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);
} 注解:
歡迎有此興趣的朋友和我交流。
|