什么是反编译器
大家都知道,将源代码转换成二进制执行代码的过程叫“编译”,比如将C源代码编译成exe可执行文件;那么把二进制执行代码的过程就叫“反编译”,比如把exe转换为C源代码就叫“反编译”。
由于主流的C的编译器都进行了代码的优化,因此把C编译生成的exe文件反编译成C代码非常困难。但是像Java、.net这样基于虚拟机技术的编程语言则反编译非常容易,Java平台下有Jad、Jode、JD等反编译器,.net平台下则有Reflector等反编译器,反编译质量非常高,甚至和源代码几乎没什么差别。
反编译得到的是源代码吗?
反编译得到的代码是非常接近于源代码,但是或多或少与源代码有一些差异的,比如一些表达式被优化掉了,比如:
下面的源代码:
int i=1+1;
学过《编译原理》的同学知道有“常量优化”这个编译优化算法,因此上边的源代码一般会被优化为:int i=2;
由于在编译过程中已经进行了优化,把“1+1”这个原始的信息丢掉了,因此反编译出来的代码只能是:
int i=2;
可以看到反编译得到的代码和源代码是有区别的。
比如:andriod中
download = (Button)findViewById(R.id.xiaz);
被优化成了download = (Button)findViewById(0x7f070018);
程序可以反编译岂不是很不安全?
可以采用代码混淆等技术来加大反编译的难度和降低反编译代码的可读性,但是完全避免反编译是不可能的。
反编译器的原理是什么?
由于Java、.net这样的基于虚拟机技术的语言都是采用了ByteCode的二进制结构,因此很容易将ByteCode转化为“抽象语法树”(简称AST,《编译原理》这门课中的概念),然后采用反编译器就可以将AST转换为代码了。
一个github上项目,目前支持.exe、.jar和源代码下载,还是充分的考虑到windows用户了,jd显示INTERNAL ERROR的class文件笔者用这个可以打开,并且设置比jd丰富,
这就看个人喜好了。有一个小缺陷,右键窗口不能全部关闭,jd是可以的。提示:这是一个maven的项目,如果用源码安装的话需要安装maven。
https://github.com/deathmarine/Luyten
打开连接,点击download可以进入下载页
也是github上的项目,目前支持.zip和.gz的下载,windows用户需要运行一个batch文件,这个项目主页上都有介绍。
这个不是maven项目了,不需要安装maven。apache2.0的许可证,你可以再发布或者加入这个git项目。
https://github.com/skylot/jadx