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

环境说明

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 ,无需下载极速在线查看,视频原画倍速播放。

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赵小哥要冲啦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值