吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 34181|回复: 251
收起左侧

[原创] FXXXXRXXXXX 10.0 另一破解思路

    [复制链接]
2316361 发表于 2020-2-27 13:17
本帖最后由 2316361 于 2020-2-27 13:17 编辑

请问一下论坛里面研究FR的大神,有没有发现这款软件有什么暗装呢?发出来一起交流一下呗。
前些天看了论坛一位大神的帖子https://www.52pojie.cn/thread-1012601-1-1.html,试着弄了一下,真的被FR10的加密给弄崩溃了
于是想到了一个新思路,是否可以在它加载完关键类之后,从jvm里面取出字节码修改后再替换回去呢?

分享一下我的思路吧

启动FR,使用HSDB工具拿到三个类:
1、com.fr.license.selector.EncryptedLicenseSelector
2、com.fr.license.security.LicFileRegistry
3、com.fr.license.entity.FineLicense
企业微信截图_20200227124109.png

需要修改以下几个关键的地方:
1、com.fr.license.selector.EncryptedLicenseSelector的decrypt方法:

[Java] 纯文本查看 复制代码
public abstract class EncryptedLicenseSelector extends AbstractLicenseSelector {
    byte[] getBytes() {
        byte[] var1 = this.readRawBytes();
        return this.decrypt(var1);
    }

    private byte[] decrypt(byte[] var1) {   // 修改为 return var1;
        try {
            System.getProperties().setProperty("com.ibm.crypto.provider.DoRSATypeChecking", "false");
            return (new CommonDecryptChain()).decrypt(var1);
        } catch (Throwable var3) {
            this.decryptFailed(var3);
            return new byte[0];
        }
    }

    protected void decryptFailed(Throwable var1) {
        FineLoggerFactory.getLogger().error("Read license failed." + var1.getMessage(), var1);
    }

    abstract byte[] readRawBytes();
}


其实修改这一个地方就够了,另外两处修改可用于方便懒人。

2、com.fr.license.security.LicFileRegistry的check方法:

[Java] 纯文本查看 复制代码
public class LicFileRegistry {
    private static Map<Integer, LicFileChecker> _2c75dfba_fdee_47fa_8cf4_74897f6d7e9a = new ConcurrentHashMap(5);

    private LicFileRegistry() {
    }

    static {
        register(new LicFileCheckerImpl());
    }

    public static void register(LicFileChecker var0) {
        _2c75dfba_fdee_47fa_8cf4_74897f6d7e9a.put(var0.getTypeCode(), var0);
    }

    public static boolean check(InputStream var0, Integer var1) {   // 修改为 return true;
        LicFileChecker var2 = _2c75dfba_fdee_47fa_8cf4_74897f6d7e9a.get(var1);
        return var2 != null && var2.check(var0);
    }
}


修改这里主要是破解lic上传注册。

3、com.fr.license.entity.FineLicense的两个support方法:
[Java] 纯文本查看 复制代码
public class FineLicense extends AbstractLicense {
    public FineLicense(JSONObject var1) {
        super(var1);
    }

    public String getString(String var1, String var2) {
        return super.getInnerString(var1, var2);
    }

    public boolean support(PluginMarker var1) { // 修改为 return true;
        if (var1 == null) {
            return false;
        } else {
            try {
                JSONObject var2 = this.getJSONObject();
                if (var2.has(LicenseItem.Plugin.getKey())) {
                    JSONArray var3 = var2.getJSONArray(LicenseItem.Plugin.getKey());

                    for(int var5 = 0; var5 < var3.length(); ++var5) {
                        String[] var4 = var3.getString(var5).split(",");
                        if (var4.length >= 2 && var1.getPluginID().equals(var4[0])) {
                            return true;
                        }
                    }
                }
            } catch (Exception var6) {
                FineLoggerFactory.getLogger().error(var6.getMessage(), var6);
            }

            return false;
        }
    }

    public boolean support(FunctionPoint var1) {    // 修改为 return true;
        String var2 = this.getString(LicenseItem.Function.getKey(), "");
        if (StringUtils.isNotBlank(var2)) {
            BigInteger var3 = new BigInteger(String.valueOf(var2));
            return var3.and(BigInteger.ONE.shiftLeft(var1.getMarker())).compareTo(BigInteger.ZERO) == 1;
        } else {
            return true;
        }
    }


主要用于破解收费插件。

修改之后的代码可自行编译为class字节码,使用javaagent替换,不过不推荐。因为每次小更新部分类的成员变量名都会随机变化,使得破解失效,
因此建议拿到加载后的字节码自行进行修改并使用javaagent替换,以第一个关键类为例,代码如下:

[Java] 纯文本查看 复制代码
public class FxxxAgent {
    public static void agentmain(String args, Instrumentation inst) throws Exception {
        Class<?>[] classes = inst.getAllLoadedClasses();
        for (Class<?> clazz : classes) {
            if (clazz.getName().equals("com.fr.license.selector.EncryptedLicenseSelector")) {
                inst.addTransformer((loader, className, classBeingRedefined, protectionDomain, classfileBuffer) -> {
                    if (className.equals("com/fr/license/selector/EncryptedLicenseSelector")) {
                        try {
                            DataInputStream inputStream = new DataInputStream(new ByteArrayInputStream(classfileBuffer));
                            ClassFile classFile = new ClassFile(inputStream);
                            inputStream.close();
                            ConstPool constPool = classFile.getConstPool();
                            MethodInfo methodInfo = classFile.getMethod("decrypt");
                            CodeAttribute codeAttribute = new CodeAttribute(constPool, 1, 2, new byte[]{43, -80},
                                    new ExceptionTable(constPool));
                            methodInfo.setCodeAttribute(codeAttribute);
                            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
                            DataOutputStream outputStream = new DataOutputStream(byteArrayOutputStream);
                            classFile.write(outputStream);
                            outputStream.close();
                            byte[] result = byteArrayOutputStream.toByteArray();
                            byteArrayOutputStream.close();
                            return result;
                        } catch (Exception e) {
                            e.printStackTrace();
                            return classfileBuffer;
                        }
                    } else {
                        return classfileBuffer;
                    }
                });
                inst.retransformClasses(clazz);
            }
        }
    }
}


在manifest.sf文件中加上一行:Agent-Class: 刚刚编辑的类名,打包成jar文件备用。

为了使这些代码可以运行起来,需要找个地方写上一些自己的代码,我找的是fine-core-10.0.jar下的com.fr.runtime.FineRuntime这个类,
在initEncryptedBridge方法的最下面加上了自己的代码:

[Java] 纯文本查看 复制代码
    private static void initEncryptedBridge() throws Exception {
        ClassLoader var0 = (ClassLoader) Class.forName(START_LOADER_FACTORY_NAME).newInstance();
        Class.forName("com.fr.plugin.bridge.FinePluginBridge", true, var0);
        String name = ManagementFactory.getRuntimeMXBean().getName();
        String pid = name.substring(0, name.indexOf('@'));
        VirtualMachine virtualMachine = VirtualMachine.attach(pid);
        virtualMachine.loadAgent("D:/agent.jar", null); // 这里的路径即为刚刚打的jar包路径
        virtualMachine.detach();
    }


用winrar打开fr-core-10.0.jar,将编译好的FineRuntime.class替换,或者单独打成jar包,保证文件名能排在fr-core-10.0.jar的前面,放在WEB-INF\lib目录里


用如下内容的注册文件注册即可
[XML] 纯文本查看 复制代码
{"VERSION":"10.0","DEADLINE":"253402271999000","CONCURRENCY":"0"}



最后把自己的代码分享给大家吧。
https://github.com/2316361/FineCrack

免费评分

参与人数 22威望 +1 吾爱币 +41 热心值 +21 收起 理由
ys1312 + 1 + 1 我很赞同!
olkl123456 + 1 + 1 我很赞同!
corelite + 1 + 1 谢谢@Thanks!
SilverBulletY + 1 + 1 我很赞同!
hu6462682 + 1 + 1 谢谢@Thanks!
ein1209 + 1 + 1 谢谢@Thanks!
wx16302 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
Teahome + 1 + 1 谢谢@Thanks!
sweether + 1 + 1 太牛了,大大,能分享下新的破解思路吗
偏方 + 1 + 1 谢谢@Thanks!
nbuhell + 1 + 1 鼓励转贴优秀软件安全工具和文档!
ccsfxyyf + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
hy4260 + 1 + 1 我很赞同!
pguan + 1 + 1 谢谢@Thanks!
gcy167223 + 1 + 1 谢谢@Thanks!
Hmily + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
mayahua + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
Surgeon868CZD + 1 谢谢@Thanks!
redapple2015 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
solly + 1 + 1 用心讨论,共获提升!
swj330702 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
放下 + 2 + 1 必须给双赞,感谢

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Teahome 发表于 2022-2-21 20:29
本帖最后由 Teahome 于 2022-2-21 20:32 编辑
Toxiaoshu 发表于 2022-2-21 00:32
我这也是提示lic校验不能通过,指点下

在 FineCrackAgent 加入下面代码
修改 isNative,或是删除再重写也行。
[Java] 纯文本查看 复制代码
ClassPool pool = new ClassPool(true);
CtClass cl = pool.get("java.lang.reflect.Modifier");
cl.getDeclaredMethod("isNative").setBody("{ return true; }");
  inst.redefineClasses(new ClassDefinition[] {
new ClassDefinition(Class.forName(cl.getName(), false, null), cl.toBytecode())
});


wx16302 发表于 2020-4-20 11:30
本帖最后由 wx16302 于 2020-4-20 11:37 编辑

感谢楼主提供如此完美的方法,提供操作过程
1.下载楼主的源码 https://github.com/2316361/FineCrack
2.编译破解包 git clone https://github.com/2316361/FineCrack.git   mvn package  得到 FineCrack-jar-with-dependencies.jar
3.将 FineCrack-jar-with-dependencies.jar 放到你喜欢的目录,如 C:\FineReport_10.0
4.修改C:\FineReport_10.0\bin\designer.vmoptions  增加 -javaagent:C:\FineReport_10.0\FineCrack-jar-with-dependencies.jar 如果用命令启动,修改C:\FineReport_10.0\bin\designer.bat 在com.fr.start.Designer 前增加 -javaagent:C:\FineReport_10.0\FineCrack-jar-with-dependencies.jar ,修改后 ..\jre\bin\java -cp ../jre/lib/*;../lib/*;../server/lib/*;../webapps/webroot/WEB-INF/lib/* -javaagent:C:\FineReport_10.0\FineCrack-jar-with-dependencies.jar com.fr.start.Designer
5. 生成fineregister.lic ,文件内容为 {"VERSION":"10.0","DEADLINE":"253402271999000","CONCURRENCY":"0"},进行注册。
6.我按以上操作成功注册到9999年,如果不成功,请仔细检查操作步骤。

QQ五笔截图未命名.png

FineCrack-jar-with-dependencies.rar

711.39 KB, 下载次数: 641, 下载积分: 吾爱币 -1 CB

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
lz6905 + 1 + 1 谢谢@Thanks!

查看全部评分

guoyangye 发表于 2020-4-29 16:15
本帖最后由 guoyangye 于 2020-4-29 16:26 编辑

4月26日版本更新后,license文件的加解密都放到dll里面去做了,以前的方法都不行了。
好消息是 同时间的BI5.1还没什么变化。

大家还有什么好的思路,欢迎分享,贴一张图吧



FR10-v20200426_52pj.png
solly 发表于 2020-12-6 17:35
lanqw 发表于 2020-11-17 10:09
dump出license ,然后研究这三个文件,那么修改FinePrivacy的函数返回值就明确了(没有加壳的库文件就像 ...

更简单的方法是,不用去研究dll、so文件汇编代码,把需要改动的几个函数,去掉 native 属性,自己添加点java代码返回需要的值。我就是这么做的,具体怎么改,看看老版本的jar代码就可以了。

12345.png
candyl6 发表于 2020-4-9 18:44
本帖最后由 candyl6 于 2020-4-9 21:28 编辑
heiketian10 发表于 2020-3-3 08:32
在线升级的可以尝试下能升级不,现在有新版本了

正在测试,可以升级,经过我的不懈努力,终于破解完成,太感叹了,我还是只什么都不懂的菜鸟啊
Snipaste_2020-04-09_21-28-36.png

zyiang 发表于 2022-12-22 17:11
帆软10.0.0  03.26老版本分享一下
微信截图_20221222170859.png

帆软10.0.0 2020.03.26.zip

256 Bytes, 下载次数: 121, 下载积分: 吾爱币 -1 CB

wx16302 发表于 2022-5-8 16:33
本帖最后由 wx16302 于 2022-5-8 16:35 编辑
随风而来啦 发表于 2022-5-7 19:09
大佬,这几行代码加在哪个位置,我一直都没生效

package crack;

import crack.transformer.MultiMethodTransformer;
import crack.transformer.MyTransformer;
import crack.transformer.SingleMethodTransformer;

import java.lang.instrument.ClassDefinition;
import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.Instrumentation;
import javassist.ClassPool;
import javassist.CtClass;

public class FineCrackAgent {
    public static void agentmain(String args, Instrumentation inst) throws Exception {
            
           
            
           以下为增加部分

                   ClassPool pool = new ClassPool(true);
                  CtClass cl = pool.get("java.lang.reflect.Modifier");
                  cl.getDeclaredMethod("isNative").setBody("{ return true; }");
                  inst.redefineClasses(new ClassDefinition[] { new ClassDefinition(Class.forName(cl.getName(), false, null), cl.toBytecode()) });
                  

    }
}
wx16302 发表于 2022-2-24 09:20
lg560852 发表于 2022-2-16 16:23
好像改到11版本后license格式就改了

打包参考方式:https://www.52pojie.cn/forum.php ... 00&pid=31458130

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
crosy + 1 + 1 我很赞同!

查看全部评分

lanqw 发表于 2020-11-17 10:09
本帖最后由 lanqw 于 2020-11-17 10:12 编辑
wangdalu 发表于 2020-11-15 12:50
这么强,已经破解啦,我本来已经放弃啦,看到你的信息,又有希望了,求教。

dump出license ,然后研究这三个文件,那么修改FinePrivacy的函数返回值就明确了(没有加壳的库文件就像穿着比基尼的女孩,待你去开发!)。
1.png

2.png

3.png

当然你也可以通过修改rsa密钥的方式搞成自己的(这种方式好像不能用导入方式,要把FanRuan.lic直接放到resources目录。以前试过,不知道最近的版本官方改了没有,这种方法在金蝶和用友上用得比较多)

QQ截图20201116111514.png
solly 发表于 2020-12-10 21:21
wangdalu 发表于 2020-12-9 17:41
大神,可以给个提示,改那个类的方法吗?我把com.fr.license.entity.FineLicense 中 isMultiServer 返回  ...

把Check方法清空看看
heiketian10 发表于 2020-2-27 13:39
本帖最后由 heiketian10 于 2020-9-9 13:09 编辑

方法思路确实挺不错的。
lihaisanhui 发表于 2020-2-27 13:41
finereader?
狐狸爱葡萄 发表于 2020-2-27 14:14
楼主能编译一个成品吗,
mayahua 发表于 2020-2-27 14:47
在线升级,想法不错
wenguolong 发表于 2020-2-27 15:58
[XHTML] 纯文本查看 复制代码
const/4 v4 1 
iget v0 v6 Landroid/os/Message;->what:I
packed-switch v0 :label_76
label_6:
return-void
switch_7:
new-instance v1 Lcom/switfpass/pay/activity/PayResult;
iget-object v0 v6 Landroid/os/Message;->obj:Ljava/lang/Object;
check-cast v0 Ljava/lang/String;
invoke-direct {v1,v0} Lcom/switfpass/pay/activity/PayResult;-><init>(Ljava/lang/String;)V
invoke-virtual {v1} Lcom/switfpass/pay/activity/PayResult;->getResultStatus()Ljava/lang/String;
move-result-object v0
const-string v1 "hehui"
new-instance v2 Ljava/lang/StringBuilder;
const-string v3 "resultStatus-->"
invoke-direct {v2,v3} Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V
invoke-virtual {v2,v0} Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v2
invoke-virtual {v2} Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v2
invoke-static {v1,v2} Landroid/util/Log;->i(Ljava/lang/String;Ljava/lang/String;)I
const-string v1 "9000"
invoke-static {v0,v1} Landroid/text/TextUtils;->equals(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Z
move-result v1
if-eqz v1 :label_55
const/4 v0 0 
const-string v1 "支付成功"
invoke-static {v4,v0,v1} Lcom/switfpass/pay/handle/PayHandlerManager;->notifyMessage(IILjava/lang/Object;)V
goto :label_6
label_55:
const-string v1 "8000"
invoke-static {v0,v1} Landroid/text/TextUtils;->equals(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Z
move-result v0
if-eqz v0 :label_70
const/4 v0 2 
const-string v1 "支付结果待确认中,最终交易是否成功以服务端异步通知为准"
invoke-static {v4,v0,v1} Lcom/switfpass/pay/handle/PayHandlerManager;->notifyMessage(IILjava/lang/Object;)V
goto :label_6
label_70:
const-string v0 "支付失败,原因包括用户主动取消支付,或者系统返回的错误"
invoke-static {v4,v4,v0} Lcom/switfpass/pay/handle/PayHandlerManager;->notifyMessage(IILjava/lang/Object;)V
goto :label_6
label_76:
.pswitch_data 1
    1 : switch_7
.end pswitch_data


就是MT搜索常量搜出来的代码,看不懂,有大佬能解释下吗?怎么改!
hinome 发表于 2020-2-27 16:06
学习一下。~
cc329533757 发表于 2020-2-27 16:11
heiketian10 发表于 2020-2-27 13:39
链接:https://pan.baidu.com/s/1KJGR7YGnrztC5xI6WPCunA 提取码:qc5u    支持在线升级

决策系统的登录帐号和密码是多少啊
 楼主| 2316361 发表于 2020-2-27 16:12
狐狸爱葡萄 发表于 2020-2-27 14:14
楼主能编译一个成品吗,

看帖子最下面一行,嘿嘿
heiketian10 发表于 2020-2-27 16:22
本帖最后由 heiketian10 于 2020-9-9 13:10 编辑

测试环境支持数据抽取演示
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-24 00:06

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表