Aspose最版本aspose-words:jdk17:24.6 版本,代码分析心得
aspose 为收费软件,以下仅仅用于学习技术,请勿做任何商业用途,如果需要请到官网购买正版!
POM配置如下:
<dependency>
<groupId>com.aspose</groupId>
<artifactId>aspose-words</artifactId>
<version>24.6</version>
<classifier>jdk17</classifier>
</dependency>
<dependency>
<groupId>com.aspose</groupId>
<artifactId>aspose-words</artifactId>
<version>24.6</version>
<classifier>javadoc</classifier>
</dependency>
<repositories>
<repository>
<id>AsposeJavaAPI</id>
<name>Aspose Java API</name>
<url>https://releases.aspose.com/java/repo/</url>
</repository>
</repositories>
代码逆向分析:
License类:
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package com.aspose.words;
import com.aspose.words.internal.zzWvg;
import com.aspose.words.internal.zzYea;
import java.io.InputStream;
public class License {
public License() {
zzYea.zzWkC();
}
public void setLicense(String licenseName) throws Exception {
if (licenseName == null) {
throw new NullPointerException(zzYea.zzWkC().zzWd(new byte[]{105, 108, 101, 99, 115, 110, 78, 101, 109, 97, 101}));
} else {
(new zzWst()).zz5D(licenseName, zzWvg.zzYB8());
}
}
public void setLicense(InputStream stream) throws Exception {
if (stream == null) {
throw new NullPointerException(zzYea.zzWkC().zzWd(new byte[]{116, 115, 101, 114, 109, 97}));
} else {
new zzWst();
zzWst.zz6t(stream);
}
}
}
zzWst类 zz6t方法:
static void zz6t(InputStream var0) throws Exception {
if (var0 == null) {
throw new NullPointerException(zzYea.zzWkC().zzWd(new byte[]{116, 115, 101, 114, 109, 97}));
} else {
zzVTV var1 = zzXcX(var0);
zzmP(var1);
if (var1.zzYZ0()) {
throw new IllegalStateException(zzW9L.zzXa(zzZUL.zzYnA(zzXsx.zzYhr()), new Object[]{var1.zzXRc().zzXa(zzYea.zzWkC().zzWd(new byte[]{100, 100, 77, 32, 77, 77, 121, 32, 121, 121, 121}), zzWhn.zzsw()), zzVTV.zzKA().zzXa(zzYea.zzWkC().zzWd(new byte[]{100, 100, 77, 32, 77, 77, 121, 32, 121, 121, 121}), zzWhn.zzsw())}));
} else if (var1.zzZJk()) {
throw new IllegalStateException(zzZUL.zzYnA(zzXsx.zzWau()));
} else {
/* 把注册成功的解析完成的注册信息放到数组中
这里很关键,最终我们要构造一个 zzVTV 对象放到 zzZXG数组中去
*/
synchronized(zzZcF) {
if (zzZXG.indexOf(var1) == -1) {
zzZXG.add(var1);
}
}
}
}
}
// zzXcX方法 ,主要看 几个会抛异常的方法 var7.zzXJl() 和 (!zzWJL(var7.getData(), var7.zzYUB(), var7.zzYA1())
private static zzVTV zzXcX(InputStream var0) throws Exception {
DocumentBuilderFactory var1 = zzVZj.zzXmW();
DocumentBuilder var2 = var1.newDocumentBuilder();
Document var3 = var2.parse(var0);
Element var4 = var3.getDocumentElement();
Element var5 = zzVT3(var4, zzYea.zzWkC().zzWd(new byte[]{97, 68, 97, 116}));
Element var6 = zzVT3(var4, zzYea.zzWkC().zzWd(new byte[]{105, 83, 110, 103, 116, 97, 114, 117, 101}));
if (var5 != null && var6 != null) {
zzVTV var7 = zzmP(var5, var6);
if (var7.zzXJl() == 0) {
throw new IllegalStateException(zzZUL.zzYnA(zzXsx.zzW0O()));
} else if (!zzWJL(var7.getData(), var7.zzYUB(), var7.zzYA1())) {
throw new IllegalStateException(zzZUL.zzYnA(zzXsx.zzZzh()));
} else {
return var7;
}
} else {
throw new IllegalStateException(zzZUL.zzYnA(zzXsx.zzZHM()));
}
}
破解Java方法(只需要在程序启动的时候调用这个方法一次即可):
/**
* aspose-words:jdk17:24.6 版本
*/
public static void registerWord246() {
// 构造一个注册信息
try {
Class<?> zzXgCClass = Class.forName("com.aspose.words.zzVTV");
Constructor<?> constructors = zzXgCClass.getDeclaredConstructors()[0];
constructors.setAccessible(true);
Object instance = constructors.newInstance(null, null);
// zzZoV = 1
Field zzXFN = zzXgCClass.getDeclaredField("zzXAm");
zzXFN.setAccessible(true);
zzXFN.set(instance, 1);
Field zzYXJ = zzXgCClass.getDeclaredField("zzYXJ");
zzYXJ.setAccessible(true);
zzYXJ.set(instance, 1);
// zzW8s = 0
// zzX6D = "8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7" // SerialNumber
// zzw9 SubscriptionExpiry
// zzZq3 LicenseExpiry
// zzW5k <Data> ...
// zzYON 签名 Signature
// zzXjC zzZoT 对象 空
Class<?> zzWXGClass = Class.forName("com.aspose.words.zzWst");
constructors.setAccessible(true);
Object zzWXGInstance = constructors.newInstance(null, null);
Field zzZzA = zzWXGClass.getDeclaredField("zzZXG");
zzZzA.setAccessible(true);
ArrayList<Object> zzwPValue = new ArrayList<>();
zzwPValue.add(instance);
zzZzA.set(null, zzwPValue);
// 生成文档会掉这个来判断 zzVSF
Class<?> zzXQoClass = Class.forName("com.aspose.words.zzYfR");
Field zzHA = zzXQoClass.getDeclaredField("zzX8G");
zzHA.setAccessible(true);
zzHA.set(null, 128);
Field zzWod = zzXQoClass.getDeclaredField("zz3R");
zzWod.setAccessible(true);
zzWod.set(null, false);
} catch (Exception e) {
e.printStackTrace();
}
}