工具版本:IDEA

JDK版本:1.8

一、 pom.xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>cn.kiion</groupId>
    <artifactId>aspose-crack</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.aspose</groupId>
            <artifactId>aspose-words</artifactId>
            <version>18.6</version>
            <classifier>jdk16</classifier>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.javassist/javassist -->
        <dependency>
            <groupId>org.javassist</groupId>
            <artifactId>javassist</artifactId>
            <version>3.26.0-GA</version>
        </dependency>

    </dependencies>

    <repositories>
        <repository>
            <id>aliyun-repos</id>
            <url>https://maven.aliyun.com/nexus/content/groups/public/</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
        <repository>
            <id>AsposeJavaAPI</id>
            <name>Aspose Java API</name>
            <url>http://repository.aspose.com/repo/</url>
        </repository>
    </repositories>

</project>

二、创建一个license.xml

       放在项目根路径下

<License>
    <Data>
        <Products>
            <Product>Aspose.Total for Java</Product>
            <Product>Aspose.Words for Java</Product>
        </Products>
        <EditionType>Enterprise</EditionType>
        <SubscriptionExpiry>20991231</SubscriptionExpiry>
        <LicenseExpiry>20991231</LicenseExpiry>
        <SerialNumber>8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7</SerialNumber>
    </Data>
    <Signature>sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=</Signature>
</License>

 三、调试代码

package cn.kiion.aspose.util;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;

import com.aspose.words.Document;
import com.aspose.words.License;

/**
 * @author ZCF
 */
public class Word2PdfUtil {

    public static void main(String[] args) {
        wordConverterToPdf("C:\\Users\\zcf\\Desktop\\test.docx", "C:\\Users\\zcf\\Desktop\\test.pdf");
    }

    private static boolean getLicense() {
        boolean result = false;
        try {
            InputStream is = Word2PdfUtil.class.getClassLoader()
                    .getResourceAsStream("license.xml");
            License license = new License();
            license.setLicense(is);
            result = true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    public static void wordConverterToPdf(String wordPath, String pdfPath) {
        // 验证License 若不验证则转化出的pdf文档会有水印产生
        if (!getLicense()) {
            return;
        }
        try {
            long old = System.currentTimeMillis();
            // 新建一个pdf文档
            File file = new File(pdfPath);
            FileOutputStream os = new FileOutputStream(file);
            // Address是将要被转化的word文档
            Document doc = new Document(wordPath);
            // 全面支持DOC, DOCX, OOXML, RTF HTML, OpenDocument, PDF, EPUB, XPS, SWF 相互转换
            doc.save(os, com.aspose.words.SaveFormat.PDF);
            long now = System.currentTimeMillis();
            os.close();
            //转化用时
            System.out.println("word turn to pdf token:" + ((now - old) / 1000.0) + "s");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

四、调试过程

1. Debug 模式运行 Word2PdfUtil.main()

       Debug 模式运行,会抛出异常,跟踪代码发现是 com.aspose.words.zzZLX 类的 zzZ 方法抛出的异常

 2. 定位到抛出异常的方法 

       private static void zzZ(Node var0, Node var1) throws Exception

private static void zzZ(Node var0, Node var1) throws Exception {
    byte[] var2;
    if (var0 != null) {
        StringBuilder var3;
        zzZ(var3 = new StringBuilder(), var0);
        var2 = var3.toString().getBytes("UTF-16LE");
    } else {
        var2 = new byte[0];
    }

    byte[] var14;
    if (var1 != null) {
        var14 = zz35.decode(var1.getFirstChild().getNodeValue());
    } else {
        var14 = new byte[0];
    }

    Signature var4 = Signature.getInstance("SHA1withRSA");
    String var7 = "AQAB";
    String var6 = "0nRuwNEddXwLfXB7pw66G71MS93gW8mNzJ7vuh3Sf4VAEOBfpxtHLCotymv1PoeukxYe31K441Ivq0Pkvx1yZZG4O1KCv3Omdbs7uqzUB4xXHlOub4VsTODzDJ5MWHqlRCB1HHcGjlyT2sVGiovLt0Grvqw5+QXBuinoBY0suX0=";
    String var13 = "0nRuwNEddXwLfXB7pw66G71MS93gW8mNzJ7vuh3Sf4VAEOBfpxtHLCotymv1PoeukxYe31K441Ivq0Pkvx1yZZG4O1KCv3Omdbs7uqzUB4xXHlOub4VsTODzDJ5MWHqlRCB1HHcGjlyT2sVGiovLt0Grvqw5+QXBuinoBY0suX0=";
    byte[] var8 = zz35.decode("0nRuwNEddXwLfXB7pw66G71MS93gW8mNzJ7vuh3Sf4VAEOBfpxtHLCotymv1PoeukxYe31K441Ivq0Pkvx1yZZG4O1KCv3Omdbs7uqzUB4xXHlOub4VsTODzDJ5MWHqlRCB1HHcGjlyT2sVGiovLt0Grvqw5+QXBuinoBY0suX0=");
    byte[] var9 = zz35.decode(var7);
    var8 = zzZg(var8);
    var9 = zzZg(var9);
    BigInteger var10 = new BigInteger(1, var8);
    BigInteger var11 = new BigInteger(1, var9);
    RSAPublicKeySpec var12 = new RSAPublicKeySpec(var10, var11);
    PublicKey var5 = KeyFactory.getInstance("RSA").generatePublic(var12);
    var4.initVerify(var5);
    var4.update(var2);
    if (!var4.verify(var14)) {
        throw new IllegalStateException("The signature is invalid.");
    }
}

 3.  解决方案:使用 javassist 工具将这个方法体删除即可

       这个是验证签名的逻辑,删除掉这段校验的逻辑即可,使用下面的代码进行删除

package cn.kiion.aspose.crack.word;

import javassist.*;

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

/**
 *
 * @author ZCF
 */
public class WordCrack186 {

    public static void main(String[] args) throws NotFoundException, CannotCompileException, IOException {
        crackMethod("C:\\Users\\zcf\\Desktop\\aspose-words-18.6-jdk16.jar");
    }

    public static void crackMethod(String jarFile) throws NotFoundException, CannotCompileException, IOException {

        // 获取 Jar 包
        ClassPool.getDefault().insertClassPath(jarFile);
        // 获取 com.aspose.words.zzZLX 类
        ClassPool pool = ClassPool.getDefault();
        CtClass c2 = ClassPool.getDefault().getCtClass("com.aspose.words.zzZLX");
        // 查找并获取 private static void zzZ(Node var0, Node var1) 方法
        CtMethod aMethod = c2.getDeclaredMethod("zzZ", new CtClass[]{pool.get("org.w3c.dom.Node"), pool.get("org.w3c.dom.Node")});
        // 重置方法体
        aMethod.setBody("return;");
        c2.writeFile();

    }


}

4. 替换原 jar 包中的 com.aspose.words.zzZLX 类即可

       使用 jar 命令进行替换Jar中对应的 .class。参考博客:替换jar包指定的文件_giianhui的专栏-CSDN博客_winrar替换jar中文件

jar uvf aspose-words-18.6-jdk16.jar com/aspose/words/zzZLX.class

 5. 删除 Jar 中的指纹记录文件

7z d aspose-words-18.6-jdk16.jar META-INF/LE-9AD48.SF
 
7z d aspose-words-18.6-jdk16.jar META-INF/LE-9AD48.RSA

更多推荐