from :http://www.glorze.com/219.html
反编译
众所周知,我们将源代码进行编译,生成可执行的程序或者容器发布包,这个将代码转换的过程就是编译的过程,而反编译就是将这些已经执行好的程序转换成程序人员可以阅读的源代码的过程就是反编译的过程。由于像Java这类基于虚拟机技术的高级语言反编译相对容易,所以衍生出很多不错的反编译软件,下面老四为大家介绍几款,并希望您根据您的自己喜好选择性使用,当然是在你需要的时候,而且软件排名分先后,分先后。。。文末提供合集下载,请自助获取。
反编译的基本原理:基于虚拟机的高级语言,几乎都采用了字节码的二进制,所以通过二进制的字节码转化为编译原理中的抽象语法,再配合反编译器就可以将抽象语法转化为代码。更牛逼的是基于这些原理还能实现各个平台的语言之间的代码转换。
PS:再牛逼的反编译也不可能做到跟源代码一模一样,多少都会有差异,不要在意这些细节。。。
1.JD-GUI
包括图形化界面,eclipse插件以及idea插件,采用C++开发,支持苹果Mac、微软windows以及Linux多个平台,可以反编译class文件、jar包等。用的人比较多。但是它已经好久没有更新了,jdk7的代码很多语法都不支持,就别提已经大热的jdk8了,在我说完这句话的时候,去oracle官网一看,jdk10都发布惹。。。不过凭借着便捷与图形化还是再加上时间的沉淀,老四还是给它排在第一位。对了,JD-GUI的核心其实是听过jd-core来完成的。
eclipse的插件安装方法也是常规操作,jd-gui官网下载eclipse插件,解压放到你的eclipse安装目录就好了。然后在你的eclipse中用jd形式打开class文件就可以了,但是貌似jd已经不支持java 8的反编译了,在eclipse中直接报错,使用的时候请注意。因为老四目前没有安装idea,所以不介绍idea的jd-gui插件了。
2.CFR-非常优秀并且支持java8
这款201313年横空出世,至今都保持更新的反编译工具,因为其持续更新承接java的变化而且反编译效果非常良好,越来越来被人们更多的使用,根据cfr官网上的介绍,CFR支持反编译当今最新的Java特性--Java 8,例如lambda表达式以及java7中的switch支持String类型等,但是人家最要命也最装逼的是cfr完全是用Java 6编写的。。。
cfr没有图形化工具,需要在命令行中使用,首先的你的系统要配置java的环境,然后进入到cfr的jar包目录,运行类似如下的命令。
你一定觉得很不方便,对不对?一定在想是否存在便捷一点的工具,对不对?其实工具也就是一个脚本而已,也没有方便太多,这里放出一个脚本文件,至于用不用您自己参考。
1
2
3
4
|
@echo off
if "%PATH_BASE%" == "" set PATH_BASE=%PATH%
set PATH=%CD%;%PATH_BASE%;
java -jar -Duser.language=en "%~dp0\cfr.jar" %1 %2 %3 %4 %5 %6 %7 %8 %9
|
3.Jadx-开源,快速并且支持安卓
这又是一款相当强大的反编译神器了,现在已经在全球最大的同性交友社区GitHub上开源了,图形化的界面以及支持拖拽方式的操作可以大大满足你日常的需要了,如果你使用Gradle(老四没用过,老四用Maven),它也支持导出Gradle工程,而且它支持诸如apk、dex、jar、class、zip等多种文件格式。当前该项目依然在不断更新当中,相信也会越来越好。如果你喜欢折腾,那就可以去交友社区下载源码自己编译生成工具为自己所用,如果你不愿意可以去release栏下载官方最新的zip包,windows下直接运行jadx-gui.bat就可以了。
当然,由于项目比较新,当前不断更新的过程中你可能会遇到很多的问题,这个时候你需要经常关注源代码,查看软件运行日志以及官方FAQ来解决问题。
4.Procyon-可以媲美cfr的有款Java反编译工具
与cfr一样,不像JD-GUI那样已经万年不更新了,Procyon同样支持Jdk1.8的类编译,譬如java8的很多新特性他都支持并且在一下几方面的反编译甚至已经超越了cfr,Procyon反编译后不仅输出java源码,还能输出原始字节码等。但是和cfr一样
- 方法传递
- Lambda表达式
- 接口规范
- 匿名内部类
- 注解
- 枚举
- switch(String)
下面来看看Procyon作者是怎么描述他的亲儿子的:
作为一名在.NET和Java平台之间分配时间的开发人员,我对Java生态系统中反编译器选择不足感到惊讶和沮丧。Jad(不再维护,封闭源代码)和JD-GUI(GPL3)都是相当不错的选择,但前者不支持Java 5+语言特性,后者倾向于禁用我的LINQ / DLR树编译器发出的代码。为了解决这个问题,我最近开始自己开发一个反编译器,受ILSpy和Mono.Cecil的启发(并且大量借鉴)。尽管仍然不完整,但我自己的测试似乎表明,Procyon反编译器通常可以对付其他领先的Java反编译器。但是,有一些已知的问题:用Eclipse编译的类(或其他任何东西javac)可能会产生不太理想的结果,特别是对于像基于String的switch语句这样的结构。到目前为止,我主要测试了使用Javac编译的类。随着时间的推移,我将努力改进对其他编译器的支持。不幸的是,我还没有像JD-GUI一样的GUI前端(但第三方前端存在 - 见下文!)。但是,我确实为支持ANSI / xterm-256的控制台提供颜色编码输出。我还提供三种输出模式:1.Java(默认)2.原始字节码(类似于javap,但更漂亮;运行-r)3.字节码AST(中间表示;运行-b,添加-u未优化)
Procyon的用法几乎同cfr一样,不在赘述。
5.其实还有fernflower、Jad等等反编译工具,但是因为Jad就如rocyon作者所言Jad已经不再维护了,fernflower在老四所写的另一篇文章《你可能不知道的两个逆天的Java反编译在线网站》的在线网址中提供了fernflower反编译的输出,您可以在那里体验,另外fernflower有两个不错的优点:
- 大部分能反编译得到的java文件可以直接使用
- 能给你反编译的就会给你反编译,不能的不鸟你
就以上这些,老四都已经打包好了,需要的文末自助下载。如果发现更好的工具会在本页面更新,请您随时留意。
更博不易,如果觉得文章对你有帮助并且有能力的老铁烦请赞助盒烟钱,点我去赞助。抱拳。