吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 11626|回复: 54
上一主题 下一主题
收起左侧

[原创] 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/,如图所示:


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

[Java] 纯文本查看 复制代码
1
2
3
4
5
6
7
8
9
        <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截图如下:

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

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


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

4、好了,三个待破解的文件已经找到,现在,正式开始破解。程序如下:(注意过程中需要javassist-3.29.2-GA.jar的支持,这是关键点,具体原理大家可百度一下。)
[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/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脚本执行过程中,会生成3个带路径的class文件,并替换覆盖jar包中原来的class文件(mac环境下OK),如下图所示:

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

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();
    }
}

破解版的效果:


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

免费评分

参与人数 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] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
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
3#
jacken2019 发表于 2023-8-23 14:35
4#
Senyu566 发表于 2023-8-23 14:38
谢谢分享
5#
kosmo 发表于 2023-8-23 14:43
感谢大佬分享
6#
leigevip 发表于 2023-8-23 14:48
谢谢分享,可以照着学习
7#
lpawuu 发表于 2023-8-23 14:58
不明所以
8#
905407220 发表于 2023-8-23 15:10
怎么知道要找这两个关键词?
9#
yunzheyueer 发表于 2023-8-23 16:47
没看明白是干啥的
10#
schoolclub 发表于 2023-8-23 17:16
这个有什么作用?比微软的office好用?
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2025-5-20 01:31

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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