吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 8459|回复: 45
收起左侧

[原创] Aspose.Words22.12破解-跳过License进行去除水印

  [复制链接]
gdRover 发表于 2023-8-23 01:16
Aspose.Words,强大的word操作软件,支持中文,且胜过于docx4j、poi,无愧商业软件。好了,废话不多说,开始吧。

首先,说明下本破解过程纯粹是研究学习的,需要商业版的请绕行。

其次,该破解过程,是参考借鉴gitee上liuzy88所开源代码,但还是有所差异。再次感谢liuzy88。更多详见其破解操作,https://gitee.com/liuzy1988/aspose-words-crack

最后,开始正题。请大神多多赐教。

1、下载jar文件:see官网地址:https://releases.aspose.com/words/java/22-12/,如图所示:

aspose官网地址

aspose官网地址


2、为了方便查看编译后的java代码,建议在idea中查看(2023.1和谐版),通过maven引入到自己的测试工程中,如图所示:

maven引入

maven引入

[Java] 纯文本查看 复制代码
        <dependency>
            <groupId>com.aspose</groupId>
            <artifactId>aspose-words</artifactId>
            <version>22.12</version>
<!--            <classifier>jdk17</classifier>-->
            <scope>system</scope>
            <systemPath>/Downloads/aspose-words-crack-master/aspose-words-22.12-jdk17.jar</systemPath>
<!--            <systemPath>/Downloads/aspose-words-crack-master/aspose-words-22.12-jdk17-cracked.jar</systemPath>-->
        </dependency>

上图方便切换使用,故没有install到maven本地私库。

3、破解-1,找主入口、及其他需破解的文件。刚刚也说了,为了方便看编译后的源代码,建议在idea中操作。
通过 License license = new License(); 进入到破解主入口中。15M的代码,若一个一个找的话,还是非常吃力的。License截图如下:

Licenes主入口

Licenes主入口

1)待破解文件1,上图的两个红框,都可以进入到类文件zzYvW中。点击即可。
2)待破解文件2,通过在破解文件1(zzYvW)中搜索关键词2099或者zzZ8h.zzW8即可,如下图:我们找到了类文件zzWS8

破解文件2

破解文件2

3)待破解文件3,通过在破解文件2(zzWS8)中,找到其空参构造函数,操作有点陌生,以截图方式呈现,大致如下截图:

zzQG

zzQG

zzW5m

zzW5m

有点不好找,但也还是很容易的。即找到:类文件zzYJa

4、好了,三个待破解的文件已经找到,现在,正式开始破解。程序如下:(注意过程中需要javassist-3.29.2-GA.jar的支持,这是关键点,具体原理大家可百度一下。)
[Java] 纯文本查看 复制代码
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import java.lang.reflect.Field;

public class AsposeWords_22_12 {
    public static void main(String[] args) throws Exception {
        ClassPool.getDefault().insertClassPath("aspose-words-22.12-jdk17.jar"); //注意路径
        // 类文件1,从com.aspose.words.License类文件找到。
        CtClass clazz = ClassPool.getDefault().getCtClass("com.aspose.words.zzYvW");
        clazz.getDeclaredMethod("zzY34").setBody("{return com.aspose.words.zzZ8h.zzW8b;}");
        clazz.getDeclaredMethod("zzjS").setBody("{this.zzWbe = com.aspose.words.zzZ8h.zzW8b; zzZAO = this; }");
        CtMethod[] methodA = clazz.getDeclaredMethods();
        for (CtMethod ctMethod : methodA) {
            CtClass[] ps = ctMethod.getParameterTypes();
            if (ps.length == 1 && ctMethod.getName().equals("zzjS") && ps[0].getName().equals("java.io.InputStream")) {
                ctMethod.setBody("{this.zzWbe = com.aspose.words.zzZ8h.zzW8b; zzZAO = this; }");
            }
        }
        clazz.getDeclaredConstructors()[0].setBody("{System.out.println(\"do nothing at zzYvW.\");}");
        clazz.writeFile();

        // 类文件2,从类com.aspose.words.zzYvW的方法zzY34()进。大概是第171行。
        CtClass clazz2 = ClassPool.getDefault().getCtClass("com.aspose.words.zzWS8");
        clazz2.getDeclaredMethod("zzQG").setBody("{System.out.println(\"do nothing. this.zzW67(); this.zzW5m();\");}");
        clazz2.getDeclaredMethod("zzH0").setBody("{return com.aspose.words.zzY7H.zzZPG;}");
        //clazz2.getDeclaredConstructors()[0].setBody("{System.out.println(\"do nothing at zzWS8.\");}");
        clazz2.writeFile();

        // 类文件3(关键点:删除水印)从类com.aspose.words.zzWS8W的方法zzW5m()进,大概是665行。
        CtClass clazz3 = ClassPool.getDefault().getCtClass("com.aspose.words.zzYJa");
        clazz3.getDeclaredMethod("zzXuq").setBody("{zzYOl = 29273535023874148L;}");
        clazz3.writeFile();
    }
}


为了方便操作,借鉴liuzy88所开源出的shell脚本,如下:
[Shell] 纯文本查看 复制代码
#!/bin/sh

set -e
SRC='aspose-words-22.12-jdk17.jar'
DST='aspose-words-22.12-jdk17-cracked.jar'
echo '==> 官网下载(新下载的此破解已失效,请直接下载破解版)'
# stat $SRC || wget https://releases.aspose.com/java/repo/com/aspose/aspose-words/22.12/aspose-words-22.12-jdk17.jar
echo '==> 重命名'
rm -f $DST
cp $SRC $DST

echo '==> 执行破解,生成类'
javac -classpath .:javassist-3.29.2-GA.jar AsposeWords_22_12.java
java  -classpath .:javassist-3.29.2-GA.jar AsposeWords_22_12

echo '==> 用jar命令更新jar内的类'
echo '替换前'
jar -uvf0 $DST com/aspose/words/*.class

echo '==> 替换UCCESS。'
echo '==> 用压缩工具打开,并删除 /MANIFEST.MF 目录下的*.SF,*.RSA文件,以及删除 versions 目录。'
echo '==> DONE.'


另外,执行shell脚本,所需文件:crack.sh(源码上面)、aspose-words-22.12-jdk17.jar(官网下载)、AsposeWords_22_12.java(源码上面)、javassist-3.29.2-GA.jar、MANIFEST.MF(主要更新如下两行:Manifest-Version: 1.0
Created-By: 1.8.0_231,即可。)

5、执行shell脚本:进入命令行,执行:  sh crack.sh,结果如下图所示:会复制生成新jar文件:aspose-words-22.12-jdk17-cracked.jar

shell执行

shell执行

shell脚本执行过程中,会生成3个带路径的class文件,并替换覆盖jar包中原来的class文件(mac环境下OK),如下图所示:

jar更新

jar更新

最后,删除jar包的额外文件,并添加简单的MANIFEST.MF文件。如下图:

delFile

delFile

6、验证,在maven中调整新生成的破解jar文件,然后编写代码来验证即可。如下代码:

// 依赖的类文件。
import com.aspose.words.Document;
import com.aspose.words.License;
import javassist.*;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;


// 自定义class名称,验证代码如下:



public static void main(String[] args) throws Exception {
    //License license = new License(); //方便找主入口。
    word("/Users/Downloads/需求规格说明书1.1.docx");
}

private static void word(String src) {
    System.out.println(src);
    File file = new File(src + ".pdf");
    try (FileOutputStream os = new FileOutputStream(file)) {
        long start = System.currentTimeMillis();
        Document doc = new Document(src);
        doc.save(os, com.aspose.words.SaveFormat.PDF);
        System.out.println("共耗时:" + (System.currentTimeMillis() - start) + "ms");
    } catch (Exception e) {
        e.printStackTrace();
    }
}

未破解效果

未破解效果

破解版的效果:

OK,破解

OK,破解


注意要点:未删除 META-INF目录下的(主要是*.SF,*.RSA)所有文件,可能的错误,如下:

未删除MANIFEST.MF

未删除MANIFEST.MF

免费评分

参与人数 9吾爱币 +13 热心值 +9 收起 理由
LinkNow171 + 1 + 1 我很赞同!
笙若 + 1 + 1 谢谢@Thanks!
KricYi + 1 + 1 谢谢@Thanks!
Hmily + 5 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
不落夜星 + 1 + 1 我很赞同!
Neymar7788 + 1 + 1 用心讨论,共获提升!
kelvinl1987 + 1 + 1 我很赞同!
GKKK911 + 1 + 1 我很赞同!
XuLeo995 + 1 + 1 谢谢@Thanks!

查看全部评分

本帖被以下淘专辑推荐:

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

 楼主| gdRover 发表于 2023-8-24 23:26
另外,有需要处理PDF的,顺带也一起提供给大家研究学习。Aspose.pdf(aspose-pdf-22.12-jdk17.jar)
下载地址是:https://releases.aspose.com/java/repo/com/aspose/aspose-pdf/22.12/aspose-pdf-22.12-jdk17.jar

关键代码,如下:
[Java] 纯文本查看 复制代码
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import java.lang.reflect.Field;

public class AsposePdf_22_12 {

    public static void main(String[] args) throws Exception {
        ClassPool.getDefault().insertClassPath("aspose-pdf-22.12-jdk17.jar");//路径自己定义。
        // 类文件1,从com.aspose.pdf.License类文件找到。这是主入口。
        CtClass clazz = ClassPool.getDefault().getCtClass("com.aspose.pdf.l10n");
        CtMethod[] methodA = clazz.getDeclaredMethods();
        for (CtMethod ctMethod : methodA) {
            CtClass[] ps = ctMethod.getParameterTypes();
            if (ps.length == 1 && ctMethod.getName().equals("lI") && ps[0].getName().equals("java.io.InputStream")) {
                ctMethod.setBody("{this.l0t = com.aspose.pdf.l10f.lf; com.aspose.pdf.internal.imaging.internal.p71.Helper.help1(); lI(this); lI = true; }");
            }
        }
        clazz.getDeclaredConstructors()[0].setBody("{System.out.println(\"do nothing at l10n.\"); this.l0t = com.aspose.pdf.l10f.lf;}");
        clazz.writeFile();

        // 类文件2,从类com.aspose.pdf.l22hW的方法lI()进。
        CtClass clazz2 = ClassPool.getDefault().getCtClass("com.aspose.pdf.internal.l21l.l22y");
        CtMethod[] method2 = clazz2.getDeclaredMethods();
        for (CtMethod ctMethod : method2) {
            CtClass[] ps = ctMethod.getParameterTypes();
            if (ps.length == 1 && ctMethod.getName().equals("lI") && ps[0].getName().equals("java.io.InputStream")) {
                ctMethod.setBody("{ this.l0t = com.aspose.pdf.internal.l21l.l22k.lf; lI(this); lI = true; }");
            }
        }
        clazz2.getDeclaredConstructors()[0].setBody("{ this.l0t = com.aspose.pdf.internal.l21l.l22k.lf;}");
        clazz2.writeFile();

        // 类文件3,突破页面的限制,默认最大是4页。
        CtClass clazz3 = ClassPool.getDefault().getCtClass("com.aspose.pdf.ADocument");
        CtMethod[] method3 = clazz3.getDeclaredMethods();
        for (CtMethod ctMethod : method3) {
            CtClass[] ps = ctMethod.getParameterTypes();
            if("lt".equals(ctMethod.getName()) && ps.length == 0){
                ctMethod.setBody("{ return true; }");
            }
            if (ps.length == 2 && "lI".equals(ctMethod.getName()) && ps[0].getName().equals("com.aspose.pdf.ADocument") && ps[1].getName().equals("int") ) {
                ctMethod.setBody("{ return false; }");
            }
        }
        clazz3.writeFile();
    }
}


其他处理逻辑,基本与Aspose.word是一致的,没有太大的差异。
仅限学习研究,若商业用途请绕行。
pjy612 发表于 2023-8-23 13:19
jacken2019 发表于 2023-8-23 14:35
Senyu566 发表于 2023-8-23 14:38
谢谢分享
kosmo 发表于 2023-8-23 14:43
感谢大佬分享
leigevip 发表于 2023-8-23 14:48
谢谢分享,可以照着学习
lpawuu 发表于 2023-8-23 14:58
不明所以
905407220 发表于 2023-8-23 15:10
怎么知道要找这两个关键词?
yunzheyueer 发表于 2023-8-23 16:47
没看明白是干啥的
schoolclub 发表于 2023-8-23 17:16
这个有什么作用?比微软的office好用?
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-11-22 16:49

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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