java代码反编译CFR

java代码反编译CFR

1.下载文件

从 CFR 的官方网站下载最新的 .jar 文件

官方下载:https://www.benf.org/other/cfr

直接链接(以 0.152 版本为例):https://www.benf.org/other/cfr/cfr-0.152.jar

2.开始使用

2.1 下载完成后,进行验证安装

执行:

bash 复制代码
java -jar cfr-0.152.jar --version

注意:如果在构建时遇到 maven-compiler-plugin 错误,请确保你的 JAVA_HOME 环境变量指向 JDK 8 或 11。

2.2 之后,就可以直接通过 java -jar 命令来运行它了

bash 复制代码
java -jar cfr-0.152.jar [选项] <要反编译的文件>

3.基础用法

CFR 的核心使用命令格式为:java -jar cfr.jar [选项] <目标文件>。

3.1 反编译单个 .class 文件

直接指定 .class 文件的路径,结果会输出到控制台。

bash 复制代码
java -jar cfr-0.152.jar com/example/MyClass.class[reference:19][reference:20]

3.2 反编译整个 .jar 文件

指定 .jar 文件路径,并使用 --outputdir 指定输出目录,将源码保存到文件中

bash 复制代码
java -jar cfr-0.152.jar your-library.jar --outputdir ./decompiled-src[reference:23]

3.3 批量反编译

CFR 支持递归处理目录。如果目标是一个目录,它会自动寻找并反编译其中所有的 .class 和 .jar 文件

bash 复制代码
java -jar cfr-0.152.jar ./thr/* --outputdir ./out_thr

3.4 常用配置选项

你可以通过添加参数来定制反编译行为,使用 --help 可以查看所有选项

选项 说明 示例

--outputdir <目录> (重要) 指定所有反编译源码的输出目录。 --outputdir ./src

--outputpath <文件> 指定单个文件的输出路径,用于反编译单个类。 --outputpath MyClass.java

--decodelambdas 尝试将字节码还原为 Lambda 表达式,提高可读性。 --decodelambdas true

--silent 减少控制台输出的日志信息。 --silent true

--comments 在生成的代码中尽可能保留原始注释。 --comments true

--renameillegalidents 重命名混淆后产生的非法标识符,使代码更符合 Java 规范。 --renameillegalidents true

--enableclassfilter (高级) 启用后,会跳过 Spring、Guava 等常见第三方库,显著加快大型 Jar 包的反编译速度。 --enableclassfilter

--help 显示所有可用的命令行选项。 --help

提示:你也可以将这些配置写入一个文件(如 cfr.config),然后通过 --config 参数加载

4.注意事项

代码完整性:反编译得到的代码主要用于阅读和学习,逻辑与原代码高度一致,但不可能完美还原原始的变量名、注释等信息,不能直接用于编译。

代码混淆:如果 Jar 包经过代码混淆(如 ProGuard),反编译后的代码可读性会极差。

法律合规:反编译他人代码前,请确保遵守相关软件的许可协议和法律,仅用于学习、调试或获得明确授权的场景。

相关推荐
SL_staff19 分钟前
制造订单交付闭环实践:用跨部门计划模板解决缺料-停机-返工三角死循环
java·开源·产品
device_Any22 分钟前
接口文档写着三个字段,接口返回了五个
android·java·linux
Wang's Blog28 分钟前
Java 项目实战: 交友项目 - 小视频模块实战:访客记录、FastDFS 存储与 SpringCache 缓存
java·缓存·交友
BuHuaX30 分钟前
Lua 与 ToLua:运行机制及热更新原理
开发语言·unity·junit·c#·lua
xys_67833 分钟前
深挖C++:C++入门基础
开发语言·c++
香蕉大香蕉(06敬畏市场)39 分钟前
MySQL 单点详解(09)
java·数据库·mysql·面试·八股·大厂实习
幻境如梦丶皆为虚1 小时前
从零写一个 DSH 插件:在左侧菜单栏加一个「测试」
开发语言·javascript·ecmascript
吹什么轩1 小时前
constexpr 完全指南:从 const 的两种含义,到编译期计算的四次演进
java·前端·javascript
她的男孩1 小时前
租户 A 的验证码,却用了租户 B 的 AccessKey:Forge Admin 修跨租户短信串发
java·spring boot·saas