反编译
众所周知,我们将源代码进行编译,生成可执行的程序或者容器发布包,这个将代码转换的过程就是编译的过程,而反编译就是将这些已经执行好的程序转换成程序人员可以阅读的源代码的过程就是反编译的过程。由于像 Java 这类基于虚拟机技术的高级语言反编译相对容易,所以衍生出很多不错的反编译软件,下面老四为大家介绍几款,并希望您根据您的自己喜好选择性使用,当然是在你需要的时候,而且软件排名分先后,分先后。。。文末提供合集下载,请自助获取。
反编译的基本原理:基于虚拟机的高级语言,几乎都采用了字节码的二进制,所以通过二进制的字节码转化为编译原理中的抽象语法,再配合反编译器就可以将抽象语法转化为代码。更牛逼的是基于这些原理还能实现各个平台的语言之间的代码转换。
PS: 再牛逼的反编译也不可能做到跟源代码一模一样,多少都会有差异,不要在意这些细节。。。
1、JD-GUI
包括图形化界面,Eclipse 插件以及 IntelliJ 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
这款 2013 年横空出世,至今都保持更新的反编译工具,因为其持续更新承接 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 源码,还能输出原始字节码等。
- 方法传递
- 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 在老四所写的另一篇文章的在线网址推荐中提供了 fernflower 反编译的输出,您可以在那里体验(参阅文末「相关文章阅读」),另外 fernflower 有两个不错的优点:
- 大部分能反编译得到的 Java 文件可以直接使用
- 能给你反编译的就会给你反编译,不能的不鸟你
就以上这些,老四都已经打包好了,需要的文末自助下载。如果发现更好的工具会在本页面更新,请您随时留意。
相关文章阅读
- 《你可能不知道的两个逆天的 Java 反编译在线网站 墙裂推荐》
- 《阿里巴巴Java开发规约第一章-其它篇》
- 《浅析设计模式第五章之依赖倒转原则》
- 《[Windows] 分享一下最新可用的 RedisDesktopManager 2020.5 Redis 桌面可视化客户端 持续更新》
更博不易,如果觉得文章对你有帮助并且有能力的老铁烦请捐赠盒烟钱,点我去赞助。或者扫描文章下面的微信/支付宝二维码打赏任意金额(点击「给你买杜蕾斯」),也可扫描小站放的支付宝领红包二维码,线下支付享受优惠的同时老四也可以获得对应赏金,老四这里抱拳谢谢诸位了。捐赠时请备注姓名或者昵称,因为您的署名会出现在赞赏列表页面,您的捐赠钱财也会被用于小站的服务器运维上面,再次抱拳感谢。
资源下载
隐藏内容:******,购买后可见!
下载价格:0 G币
您需要先登录后,才能购买资源
欢迎访问高老四博客(glorze.com),本站技术文章代码均为老四亲自编写或者借鉴整合,其余资源多为网络收集,如涉及版权问题请与站长联系。如非特殊说明,本站所有资源解压密码均为:glorze.com。