声明,本文章不提供任何破解工具,只是探讨消除水印的思路,以及给后续做类似加密的朋友提供一些增加破解难度的建议。

  • 搜索License类(个人觉得如果要做授权,不提供License,让用户授权文件放在指定位置,程序自动搜索授权文件实现授权,能够一定程度上增加破解难度):

java实现视频去水印 java去水印jar_jar

  • 发现License类调用的zzZDR类完成了初始化,找到该类:

java实现视频去水印 java去水印jar_jar_02

  • 发现只有zzZ3w和zzZ3v可以被外部调用,加上断点(可以把真实调用的方法改成private,然后通过Class.getName反射调用private的方法,可以稍微增加下破解难度):

java实现视频去水印 java去水印jar_java实现视频去水印_03

  • 断点进入后,无授权文件的情况下返回的是zzZDQ.zzYAC的值,通过idea提供的工具修改返回值为zzZDQ.zzYAB,发现转换的pdf已经没有水印了。那么只需要让两个方法均返回zzZDQ.zzYAB即可完成水印的消除了。
  • 打开zzZDQ类,发现只是两个常量:

java实现视频去水印 java去水印jar_xml_04

  • 结论:我们只需要在第一次转换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);
    }

再次强调:此消除水印的方式仅用于学习和探讨,生产使用的时候还是要购买授权,支持正版,同时使用这种方法可能会有其他意想不到的问题出现。