前言 工欲善其事,必先利其器
源码分析
1. 下载Aspose.Cells for Java21.11官方jar包
2. 开始分析
- 调用授权方法
InputStream is = new FileInputStream("..license.xml");
License license = new License();
license.setLicense(is);
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>
- 分析License类的setLicense方法找到关键代码
public void setLicense(InputStream stream) {
this.b = null;
Document var2 = null;
if (stream != null) {
try {
DocumentBuilder var3 = zad.b();
var2 = var3.parse(stream);
} catch (Exception var4) {
throw new CellsException(9, zt.a(new byte[]{25, 30, -34, 99, 29, -128, -118, 102, -66, 81, 29, 9, 82, 98, 7, 2, 0, 10, 103, 56, -54, 18, 27, 39, 12, -70, -62, 59, 15, -77, 3, 39, 12, 113, -14, -32, -127, -20, -57, 11, -69, 11}) + var4.getMessage());
}
}
this.a(var2);
if (this.b != null) {
throw new CellsException(9, this.b);
}
}
public void setLicense(String licenseFileName) {
this.b = null;
File var2 = this.a(licenseFileName);
if (var2 == null) {
throw new CellsException(9, zt.a(new byte[]{62, 82, -34, 74, -39, 83, -127, 41, 95, -33, 55, 12, -96, -91, -57, 73, -53, 64, 41, 64, 75, 29, 8, -45, -17, -109, 9, 87, 15, 29, 9, -74, 125, 84, -98, 107, 14, -117, 11}) + licenseFileName);
} else {
if (zl.a()) {
zl.a(zt.a(new byte[]{-8, -105, -61, -25, -87, -42, -99, -126, 38, 93, 12, -94, -110, 14, -117, -3, 50, 45, 11, -100, 10, 14, -117, -92, 86, -100, -18, 83, 10, 107, 11}) + var2.getAbsolutePath());
}
Document var3 = null;
try {
DocumentBuilder var4 = zad.b();
var3 = var4.parse(var2);
} catch (CellsException var5) {
throw var5;
} catch (Exception var6) {
throw new CellsException(9, zt.a(new byte[]{58, 3, -1, -25, -78, 77, 47, 82, 0, 78, -53, -67, -47, -90, 0, 10, 39, -65, -115, 15, -114, -117, -67, 18, -21, -121, -125, 29, 8, -45, -17, -109, 9, 87, 15, 29, 9, -74, 125, 84, -98, 107, 14, -117, 11}) + var6.getMessage());
}
this.a(var3);
if (this.b != null) {
throw new CellsException(9, this.b);
}
}
}
public void setLicense(Reader reader) {
this.b = null;
Document var2 = null;
if (reader != null) {
try {
DocumentBuilder var3 = zad.b();
var2 = var3.parse(new InputSource(reader));
} catch (Exception var4) {
throw new CellsException(9, zt.a(new byte[]{58, -56, 89, -37, 18, -121, -101, -46, 0, 78, -53, -67, -47, -90, 0, 10, 39, -65, -115, 15, -114, -117, -67, 18, -21, -121, -125, 29, 8, -45, -17, -109, 9, 87, 15, 29, 8, -74, 119, 92, 54, 94, -5, 11, 83, 11}) + var4.getMessage());
}
}
this.a(var2);
if (this.b != null) {
throw new CellsException(9, this.b);
}
}
观察发现setLicense的三个重载方法最终都调用了this.a(var2);
进入方法 a
private void a(Document var1) {
if (var1 != null) {
.
..
...
a = this;
zblc.a();
return;
.
..
}
}
private void a(Document var1)
方法里面一大堆代码,静下心来仔细观察一下你会发现其实在上方中间代码的上方都是做了一大堆授权验证不符合规则或者错误过期时间什么的校验,老方法不管它们验证什么的直接返回验证成功的321~322行最终执行,修改试一试。
a = this;
zblc.a();
3. 分析结果
- 修改
License
类下的private void a(Document var1)
方法为
private void a(Document var1) {
a = this;
zblc.a();
}
执行操作
1. 添加Javassist修改class字节码文件
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.28.0-GA</version>
</dependency>
2. 添加修改方法
/**
* 修改cells.jar包里面的校验
*/
public static void modifyExcelJar() {
try {
//这一步是完整的jar包路径,选择自己解压的jar目录
ClassPool.getDefault().insertClassPath("D:\\aspose-cells-21.11-java\\JDK 1.6\\aspose-cells-21.11-java\\lib\\aspose-cells-21.11.jar");
//获取指定的class文件对象
CtClass zzZJJClass = ClassPool.getDefault().getCtClass("com.aspose.cells.License");
//从class对象中解析获取所有方法
CtMethod[] methodA = zzZJJClass.getDeclaredMethods();
for (CtMethod ctMethod : methodA) {
//获取方法获取参数类型
CtClass[] ps = ctMethod.getParameterTypes();
//筛选同名方法,入参是Document
if (ps.length == 1 && ctMethod.getName().equals("a") && ps[0].getName().equals("org.w3c.dom.Document")) {
System.out.println("ps[0].getName==" + ps[0].getName());
//替换指定方法的方法体
ctMethod.setBody("{a = this;com.aspose.cells.zblc.a();}");
}
}
//这一步就是将破译完的代码放在桌面上
zzZJJClass.writeFile("C:\\Users\\roc\\Desktop\\");
} catch (Exception e) {
System.out.println("错误==" + e);
}
}
运行修改方法后会在桌面生成 com 修改后的文件夹
3. 修改jar包里面的数据
为了不修改原jar包建议复制一份重命名。
- 打开jar包将桌面com文件夹覆盖到jar包com文件夹
2. 删除jar包里面的
.RSA
和.SF
文件
4. 重新导入修改后的jar包进行测试
- maven移除旧的jar包,导入修改后的jar包
- 调用测试方法进行测试转换后的文件是否去除水印和数量限制成功
String sourceFile = "D:\\b.xlsx";//输入的文件
String targetFile = "D:\\转换后.pdf";//输出的文件
/**
* Excel转PDF操作
*
* @param sourceFile 源文件
* @param targetFile 目标文件
*/
public static void excelToPdf(String sourceFile, String targetFile) {
try {
long old = System.currentTimeMillis();
FileOutputStream os = new FileOutputStream(targetFile);
Workbook excel = new Workbook(sourceFile);//加载源文件数据
excel.save(os, com.aspose.cells.SaveFormat.PDF);//设置转换文件类型并转换
os.close();
long now = System.currentTimeMillis();
System.out.println("共耗时:" + ((now - old) / 1000.0) + "秒"); //转化用时
} catch (Exception e) {
e.printStackTrace();
}
}
声明 本方法只做个人研究学习使用,切勿用于商用。 其他参考 Aspose.Words for Java21.11去除水印和数量限制
Aspose.PDF for Java21.11去除水印和数量限制
Aspose.Slides for Java21.10去除水印和数量限制