什么是反編譯
大家都知道,將源代碼轉換成二進制執行代碼的過程叫“編譯”,比如將C源代碼編譯成exe可執行文件;那么把二進制執行代碼的過程就叫“反編譯”,比如把exe轉換為C源代碼就叫“反編譯”。
由于主流的C的編譯器都進行了代碼的優化,因此把C編譯生成的exe文件反編譯成C代碼非常困難。但是像Java、.net這樣基于虛擬機技術的編程語言則反編譯非常容易,jd gui官方網站Java平臺下有Jad、Jode、JD等反編譯器,.net平臺下則有Reflector等反編譯器,反編譯質量非常高,甚至和源代碼幾乎沒什么差別。
反編譯得到的是源代碼嗎?
反編譯得到的代碼是非常接近于源代碼,但是或多或少與源代碼有一些差異的,比如一些表達式被優化掉了,比如:
下面的源代碼:
int i=1+1;
學過《編譯原理》的同學知道有“常量優化”這個編譯優化算法,因此上邊的源代碼一般會被優化為:int i=2;
由于在編譯過程中已經進行了優化,jd-gui.exe(java反編譯工具)官網(http://java-decompiler.github.io)把“1+1”這個原始的信息丟掉了,因此反編譯出來的代碼只能是: