JAVA反编译工具-CFR(class单个反编译、JAR包整体反编译)

news2024/11/24 7:47:15

环境说明

1、win10
2、JAVA8(环境变量要配置好)
3、cfr版本:C:\Users(xx)当前用户\cfr-0.152.jar
4、命令行操作路径:C:\Users(xx)当前用户
5、示例反编译jar包:C:\Users(xx)当前用户\ruoyi-admin.jar

CFR工具相关参数

  1. 查看所有参数
C:\Users\赵亮>java -jar cfr-0.152.jar ruoyi-admin.jar --help
CFR 0.152

   --aexagg                         (boolean)
   --aexagg2                        (boolean)
   --aggressivedocopy               (int >= 0)  default: 0
   --aggressivedoextension          (boolean)
   --aggressiveduff                 (boolean)
   --aggressivesizethreshold        (int >= 0)  default: 13000
   --allowcorrecting                (boolean)  default: true
   --allowmalformedswitch           (boolean)
   --analyseas                      (One of [DETECT, JAR, WAR, CLASS])
   --antiobf                        (boolean)  default: false
   --arrayiter                      (boolean)  default: true if class file from version 49.0 (Java 5) or greater
   --caseinsensitivefs              (boolean)  default: true
   --clobber                        (boolean)
   --collectioniter                 (boolean)  default: true if class file from version 49.0 (Java 5) or greater
   --commentmonitors                (boolean)  default: false
   --comments                       (boolean)  default: true
   --constobf                       (boolean)  default: Value of option 'antiobf'
   --decodeenumswitch               (boolean)  default: true if class file from version 49.0 (Java 5) or greater
   --decodefinally                  (boolean)  default: true
   --decodelambdas                  (boolean)  default: true if class file from version 52.0 (Java 8) or greater
   --decodestringswitch             (boolean)  default: true if class file from version 51.0 (Java 7) or greater
   --dumpclasspath                  (boolean)  default: false
   --eclipse                        (boolean)  default: true
   --elidescala                     (boolean)  default: false
   --extraclasspath                 (string)
   --forbidanonymousclasses         (boolean)  default: false
   --forbidmethodscopedclasses      (boolean)  default: false
   --forceclassfilever              (string, specifying either java version as 'j6', 'j1.0', or classfile as '56', '56.65535')
   --forcecondpropagate             (boolean)
   --forceexceptionprune            (boolean)
   --forcereturningifs              (boolean)
   --forcetopsort                   (boolean)
   --forcetopsortaggress            (boolean)
   --forcetopsortnopull             (boolean)
   --forloopaggcapture              (boolean)
   --hidebridgemethods              (boolean)  default: Value of option 'obfattr'
   --hidelangimports                (boolean)  default: true
   --hidelongstrings                (boolean)  default: false
   --hideutf                        (boolean)  default: true
   --ignoreexceptions               (boolean)  default: false
   --ignoreexceptionsalways         (boolean)  default: false
   --importfilter                   (string)
   --innerclasses                   (boolean)  default: true
   --instanceofpattern              (boolean)  default: true if class file from version 60.0 (Java 16) or greater, or experimental in 58.0 (Java 14), 59.0 (Java 15)
   --j14classobj                    (boolean)  default: false if class file from version 49.0 (Java 5) or greater
   --jarfilter                      (string)
   --labelledblocks                 (boolean)  default: true
   --lenient                        (boolean)  default: false
   --liftconstructorinit            (boolean)  default: true
   --lomem                          (boolean)  default: false
   --methodname                     (string)
   --obfattr                        (boolean)  default: Value of option 'antiobf'
   --obfcontrol                     (boolean)  default: Value of option 'antiobf'
   --obfuscationpath                (string)
   --outputdir                      (string)
   --outputencoding                 (string)
   --outputpath                     (string)
   --override                       (boolean)  default: true if class file from version 50.0 (Java 6) or greater
   --previewfeatures                (boolean)  default: true
   --pullcodecase                   (boolean)  default: false
   --recordtypes                    (boolean)  default: true if class file from version 60.0 (Java 16) or greater, or experimental in 58.0 (Java 14), 59.0 (Java 15)
   --recover                        (boolean)  default: true
   --recovertypeclash               (boolean)
   --recovertypehints               (boolean)
   --reducecondscope                (boolean)
   --relinkconst                    (boolean)  default: true
   --relinkconststring              (boolean)  default: Value of option 'relinkconst'
   --removebadgenerics              (boolean)  default: true
   --removeboilerplate              (boolean)  default: true
   --removedeadconditionals         (boolean)
   --removedeadmethods              (boolean)  default: true
   --removeinnerclasssynthetics     (boolean)  default: true
   --rename                         (boolean)  default: false
   --renamedupmembers               (boolean)  default: Value of option 'rename'
   --renameenumidents               (boolean)  default: Value of option 'rename'
   --renameillegalidents            (boolean)  default: Value of option 'rename'
   --renamesmallmembers             (int >= 0)  default: 0
   --sealed                         (boolean)  default: true if class file from version 62.0 (Java 18) or greater, or experimental in 60.0 (Java 16), 61.0 (Java 17)
   --showinferrable                 (boolean)  default: false if class file from version 51.0 (Java 7) or greater
   --showversion                    (boolean)  default: true
   --silent                         (boolean)  default: false
   --skipbatchinnerclasses          (boolean)  default: true
   --staticinitreturn               (boolean)  default: true
   --stringbuffer                   (boolean)  default: false if class file from version 49.0 (Java 5) or greater
   --stringbuilder                  (boolean)  default: true if class file from version 49.0 (Java 5) or greater
   --stringconcat                   (boolean)  default: true if class file from version 53.0 (Java 9) or greater
   --sugarasserts                   (boolean)  default: true
   --sugarboxing                    (boolean)  default: true
   --sugarenums                     (boolean)  default: true if class file from version 49.0 (Java 5) or greater
   --sugarretrolambda               (boolean)  default: false
   --switchexpression               (boolean)  default: true if class file from version 58.0 (Java 14) or greater, or experimental in 56.0 (Java 12), 57.0 (Java 13)
   --tidymonitors                   (boolean)  default: true
   --trackbytecodeloc               (boolean)  default: false
   --tryresources                   (boolean)  default: true if class file from version 51.0 (Java 7) or greater
   --usenametable                   (boolean)  default: true
   --usesignatures                  (boolean)  default: true
   --version                        (boolean)  default: true
   --help                           (string)
  1. 查看某个具体参数的说明-以我用到的outputdir为例
C:\Users\赵亮>java -jar cfr-0.152.jar ruoyi-admin.jar --help outputdir
CFR 0.152

'outputdir':

Decompile to files in [directory] (= options 'outputpath' + 'clobber') (historic compatibility)

解释:反编译为[directory]中的文件(='outputpath'+'clober')(历史兼容性)

Range : string

class单个反编译

C:\Users\赵亮>java -jar cfr-0.152.jar C:\Users\赵亮\ruoyi-admin\BOOT-INF\classes\com\ruoyi\web\controller\common\CaptchaController.class
/*
 * Decompiled with CFR 0.152.
 *
 * Could not load the following classes:
 *  com.google.code.kaptcha.Producer
 *  com.ruoyi.common.config.RuoYiConfig
 *  com.ruoyi.common.constant.Constants
 *  com.ruoyi.common.core.domain.AjaxResult
 *  com.ruoyi.common.core.redis.RedisCache
 *  com.ruoyi.common.utils.sign.Base64
 *  com.ruoyi.common.utils.uuid.IdUtils
 *  com.ruoyi.system.service.ISysConfigService
 *  javax.servlet.http.HttpServletResponse
 *  org.springframework.beans.factory.annotation.Autowired
 *  org.springframework.util.FastByteArrayOutputStream
 *  org.springframework.web.bind.annotation.GetMapping
 *  org.springframework.web.bind.annotation.RestController
 */
package com.ruoyi.web.controller.common;

import com.google.code.kaptcha.Producer;
import com.ruoyi.common.config.RuoYiConfig;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.utils.sign.Base64;
import com.ruoyi.common.utils.uuid.IdUtils;
import com.ruoyi.system.service.ISysConfigService;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.util.concurrent.TimeUnit;
import javax.annotation.Resource;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.FastByteArrayOutputStream;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class CaptchaController {
    @Resource(name="captchaProducer")
    private Producer captchaProducer;
    @Resource(name="captchaProducerMath")
    private Producer captchaProducerMath;
    @Autowired
    private RedisCache redisCache;
    @Autowired
    private ISysConfigService configService;

    @GetMapping(value={"/captchaImage"})
    public AjaxResult getCode(HttpServletResponse response) throws IOException {
        AjaxResult ajax = AjaxResult.success();
        boolean captchaOnOff = this.configService.selectCaptchaOnOff();
        ajax.put("captchaOnOff", (Object)captchaOnOff);
        if (!captchaOnOff) {
            return ajax;
        }
        String uuid = IdUtils.simpleUUID();
        String verifyKey = "captcha_codes:" + uuid;
        String capStr = null;
        String code = null;
        BufferedImage image = null;
        String captchaType = RuoYiConfig.getCaptchaType();
        if ("math".equals(captchaType)) {
            String capText = this.captchaProducerMath.createText();
            capStr = capText.substring(0, capText.lastIndexOf("@"));
            code = capText.substring(capText.lastIndexOf("@") + 1);
            image = this.captchaProducerMath.createImage(capStr);
        } else if ("char".equals(captchaType)) {
            capStr = code = this.captchaProducer.createText();
            image = this.captchaProducer.createImage(capStr);
        }
        this.redisCache.setCacheObject(verifyKey, (Object)code, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES);
        FastByteArrayOutputStream os = new FastByteArrayOutputStream();
        try {
            ImageIO.write((RenderedImage)image, "jpg", (OutputStream)os);
        }
        catch (IOException e) {
            return AjaxResult.error((String)e.getMessage());
        }
        ajax.put("uuid", (Object)uuid);
        ajax.put("img", (Object)Base64.encode((byte[])os.toByteArray()));
        return ajax;
    }
}

C:\Users\赵亮>

jar包整体反编译

  1. 反编译并且输出到当前路径target文件夹下
java -jar cfr-0.152.jar ruoyi-admin.jar --outputdir target

结果截图:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

为方便大家测试已经将cfr-0.152.jar共享:
https://www.alipan.com/s/vkVThap1KiM
提取码: sg99
点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画倍速播放。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1817464.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HarmonyOs修改应用名称和图标方法

最近在开发Harmony应用,发现修改app.json5下的lable:app_name和icon不生效 后来经过查找,原来还需要更改entry下的src/main/module.json5才行,具体操作路径是: 更改后生效:

LeetCode刷题之HOT100之不同的二叉搜索树

1、题目描述 2、逻辑分析 给定一个有序序列 1⋯n,为了构建出一棵二叉搜索树,我们可以遍历每个数字 i,将该数字作为树根,将 1⋯(i−1) 序列作为左子树,将 (i1)⋯n 序列作为右子树。接着我们可以按照同样的方式递归构建…

读AI未来进行式笔记11丰饶时代与奇点

1. 第四次工业革命 1.1. 在AI轰轰烈烈地拉开第四次工业革命帷幕的同时,一场清洁能源革命也紧锣密鼓地展开 1.1.1. 清洁能源革命好比一场“及时雨”,不但将解决日益加剧的全球气候变化问题,而且会大幅降低全世界的电力成本 1.1.2. 人们将致…

谷歌发布HyperDreameBooth:单张人像20秒内完成模型训练,速度比DreamBooth快25倍,模型小10000倍

HyperDreamBooth是谷歌去年发布的革命性模型训练方法,单张人像20秒内完成模型训练,速度比DreamBooth快25倍,模型小10000倍,但是没有不开源。 今年,论文《HyperDreamBooth: HyperNetworks for Fast Personalization of…

【沟通管理】项目经理《葵花宝典》之跨部门沟通

为什么每次跟其它部门的沟通总是不欢而散? 为什么每次想好好的就事论事的时候,却总是像在吵架? 为什么沟通总是不同频? 这是不是你作为项目经理在跨部门沟通时经常会遇到的问题? 在企业项目管理中,跨部门沟…

32岁TVB「最强关系户」快速上位,嫁巨星家族屡传婚变。

现年32岁的王敏奕贵为总经理曾志伟的新抱,经常被外界以「家嫂」称呼,而王敏奕近年亦凭出色演技获大赞,继在TVB剧集《婚后事》中饰演Mira一角,介入陈自瑶与罗子溢的婚姻,被封为「港版最美小三」之后,早前在剧集《家族荣耀之继承者》中大展「哭功」,获观众激赞! 除了演技…

平板消解加热台-温度均匀,防腐蚀-实验室化学分析

DBF系列防腐电热板 是精致路合金加热板块表面经进口高纯实验级PFATeflon氟塑料防腐不粘处理,专为实验室设计的电加热产品,是样品前处理中,加热、消解、煮沸、蒸酸、赶酸等处理的得力助手。可以满足物理、化学、生物、环保、制药、食品、饮品…

国内院线电影票api接口如何开发小程序

要开发一个基于国内院线电影票API接口的小程序,你需要遵循以下步骤: 1. 确定API提供方 首先,你需要确定一个提供电影票API接口的服务商。这可能是一个电影票务平台、院线自己的API服务,或者是一个第三方的数据提供商。 2. 阅读…

opencv roi改进版

点击鼠标左键开始画roi,右键或者回车代表画框完毕 并且做了封装。 import cv2 import numpy as npclass ROIDrawer:def __init__(self, image_path):self.drawing = Falseself.ix, self.iy = -1, -1self.roi = Noneself.image_o = cv2.imread(image_path)self.image = self.…

vue中使用emit

1. vue中使用emit 1.1. 在子组件中触发事件 1.1.1. 子组件示例 (ChildComponent.vue) 1.2. 在父组件中监听事件 1.2.1. 父组件示例 (ParentComponent.vue) vue3中使用emit 1.3. 使用 setup 函数和 defineEmits 1.3.1. 子组件示例 (ChildComponent.vue)1.3.2. 父组件示例 (Pare…

Python入门教程 - 模块、包(八)

目录 一、模块的概念 二、模块的导入方式 三、案例演示 3.1 import模块名 3.2 from 模块名 import 功能名 3.3 from 模块名 import * 3.4 as定义别名 四、自定义模块 4.1 制作自定义模块 4.2 测试模块 4.3 注意事项 4.4 __all__ 五、Python包 5.1 包的概念 5.2 …

大数据学习——linux操作系统(Centos)安装mysql(Hive的元数据库)

一. 准备工作 1. 打开虚拟机并连接shell工具 2. 将mysql安装包上传至虚拟机 mysql安装包 提取码:6666 将下载好的jar包拖至install_package目录下 3. 检查环境 rpm -qa|grep mariadb 如果上述命令返回有结果 那么进行mariadb的卸载 rpm -e --nodeps mariadb-l…

【全开源】快递寄件小程序源码(FastAdmin+ThinkPHP+原生微信小程序)

📦快递寄件小程序:轻松寄送,便捷生活 🚚一、引言:告别繁琐,让寄件更简单 在繁忙的生活中,寄送快递往往成为我们的一大难题。传统的寄件方式需要前往快递公司网点,填写繁琐的寄件信…

二十二、Jar包制作及使用

1、什么是Jar包? Jar包(Java ARchive)就是.class字节码文件的标准压缩包,是 Java 的一种文档格式. 2、Jar是不是压缩包? 是! JAR 格式允许压缩文件以提高存储效率。 1、传输平台扩展。 Java 扩展框架&am…

解决使用Jmeter进行测试时出现“302“,‘‘401“等用户未登录的问题

使用 JMeter 压力测试时解决登录问题的两种方法 在使用 JMeter 进行压力测试时,可能会遇程序存在安全验证,必须登录后才能对里面的具体方法进行测试: 如果遇到登录问题,通常是因为 JMeter 无法模拟用户的登录状态,导…

Java | Leetcode Java题解之第148题排序链表

题目: 题解: class Solution {public ListNode sortList(ListNode head) {if (head null) {return head;}int length 0;ListNode node head;while (node ! null) {length;node node.next;}ListNode dummyHead new ListNode(0, head);for (int subL…

【机器学习】支持向量机(个人笔记)

文章目录 SVM 分类器的误差函数分类误差函数距离误差函数C 参数 非线性边界的 SVM 分类器(内核方法)多项式内核径向基函数(RBF)内核 源代码文件请点击此处! SVM 分类器的误差函数 SVM 使用两条平行线,使用…

JavaEE大作业之班级通讯录系统(前端HTML+后端JavaEE实现)PS:也可选网络留言板、图书借阅系统、寝室管理系统

背景: 题目要求: 题目一:班级通讯录【我们选这个】 实现一个B/S结构的电子通讯录,其中的每条记录至少包含学号、姓名、性别、班级、手机号、QQ号、微信号,需要实现如下功能: (1)…

7.Nginx动静分离

介绍 把动态和静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。 动静分离从目前实现角度分为两种: 1.纯粹把静态文件独立成单独的域名,放在独立的静态资源服务器上,目前主流推崇的方案。 2.动态和静态文件混合在一起发布,通过nginx来分开。 通过loc…

16字节对齐算法

//16字节对齐算法 static inline size_t align16(size_t x) {return (x size_t(15)) & ~size_t(15); } 原理为 首先若x8 将原始的内存 8 与 size_t(15)相加,得到 8 15 23 将 size_t(15) 即 15进行~(取反)操作,~&#xff0…