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