声明,本文章不提供任何破解工具,只是探讨消除水印的思路,以及给后续做类似加密的朋友提供一些增加破解难度的建议。
- 搜索License类(
个人觉得如果要做授权,不提供License,让用户授权文件放在指定位置,程序自动搜索授权文件实现授权,能够一定程度上增加破解难度):
- 发现License类调用的zzZDR类完成了初始化,找到该类:
- 发现只有zzZ3w和zzZ3v可以被外部调用,加上断点(可以把真实调用的方法改成private,然后通过Class.getName反射调用private的方法,可以稍微增加下破解难度):
- 断点进入后,无授权文件的情况下返回的是zzZDQ.zzYAC的值,通过idea提供的工具修改返回值为zzZDQ.zzYAB,发现转换的pdf已经没有水印了。那么只需要让两个方法均返回zzZDQ.zzYAB即可完成水印的消除了。
- 打开zzZDQ类,发现只是两个常量:
- 结论:我们只需要在第一次转换pdf前,通过反射将zzZDQ.zzYAC的值修改掉,这样水印即可消除。
public static void xmlToPdf(File xmlFile, File pdfFile) throws Exception {
Document document=new Document(xmlFile.getAbsolutePath());
document.save(pdfFile.getAbsolutePath());
}
public static void main(String[] args) throws Exception {
Class<?> aClass = Class.forName("com.aspose.words.zzZDQ");
Field zzYAC = aClass.getDeclaredField("zzYAC");
zzYAC.setAccessible(true);
Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(zzYAC, zzYAC.getModifiers() & ~Modifier.FINAL);
zzYAC.set(null,new byte[]{76, 73, 67, 69, 78, 83, 69, 68});
File xmlFile=new File("D:\\tmp\\wd.xml");
File pdfFile=new File("D:\\tmp\\wd.pdf");
XmlToPdfUtils.xmlToPdf(xmlFile,pdfFile);
}
再次强调:此消除水印的方式仅用于学习和探讨,生产使用的时候还是要购买授权,支持正版,同时使用这种方法可能会有其他意想不到的问题出现。