定义
反编译工具是指将编译后的字节码(如Java字节码)还原成可读的源代码的工具。
目的和作用
代码审查和安全性检查:反编译工具可以帮助工程师检查已编译的代码,确保没有意外的安全漏洞。
调试:当源代码丢失时,反编译工具可以帮助恢复代码,从而进行必要的调试和修复。
学习和分析:通过反编译优秀的开源项目或第三方库,工程师可以学习到一些优秀的编程技巧和设计模式。
了解编译后的包结构:
当你解压一个使用Maven打包的JAR文件(特别是Spring Boot应用)时,通常会看到以下几个文件夹:
BOOT-INF:这个文件夹是Spring Boot专用的目录结构,包含应用程序的主要内容。
BOOT-INF/classes:包含编译后的类文件(.class)。
BOOT-INF/lib:包含所有依赖的JAR文件。
META-INF:这个文件夹包含关于JAR文件的元数据。
MANIFEST.MF:这个文件是JAR文件的清单文件,包含关于JAR文件的描述信息,比如版本、依赖关系、主类等。
org:这个文件夹通常是你应用程序的包结构的一部分,包含了一些 Spring Boot 项目启动相关的类文件。
常见开源免费反编译工具
JD-GUI:一个Java反编译工具,可以查看Java源代码。(图形界面简单易用,但处理复杂Java特性的能力弱,不推荐,下载地址https://github.com/java-decompiler/jd-gui/releases)
Procyon:一个现代化的Java反编译器,支持Java 8及以上版本的新特性。(下载地址https://github.com/mstrobel/procyon/releases)
CFR:一个功能强大的Java反编译工具,支持Java 8 Lambda等特性。(下载地址https://github.com/leibnitz27/cfr/releases)
具体使用
使用CFR进行反编译(默认反编译行为会反编译你提供的JAR文件或.class文件,而不会自动深入到该JAR文件中的其他JAR依赖文件进行反编译,所以对于 BOOT-INF/lib 中的依赖库内容是不会被反编译的):
java -jar .\cfr-0.152.jar --outputdir <output_directory> <path_to_your_jar_file>
<path_to_your_jar_file> 是你要反编译的.class文件或jar包的路径
<output_directory> 是你要输出反编译后的文件夹路径