前言
工欲善其事,必先利其器
源码分析
1. 下载Aspose.Words for Java21.11官方jar包
2. 开始分析
- 调用授权方法
1 | java复制代码InputStream is = new FileInputStream("..license.xml"); |
license.xml文件内容这里是个过期的文件主要是格式
1 | xml复制代码<License> |
- 分析License类的setLicense方法找到关键代码
1 | java复制代码public void setLicense(String licenseName) throws Exception { |
setLicense的两个重载方法最终都调用了(new zzXDb()).zzY0J(stream);
中的zzY0J方法,进入zzY0J方法观察代码发现重点在于void
zzY0J方法下面的 (InputStream var1) throws Exception
这个重载方法里面,但是里面代码很多不太好找到关键代码,所以转头去寻找关于验证对外调用的静态方法,最终找到了在zzY0J
方法下面的
1 | java复制代码static byte[] zzX8p() { |
这两个方法主要在于对外返回了一个byte数组,返回值是zzYeQ
中的静态常量,所以重点就在于上面的判断语句boolean var0 = zzWiV == null || zzWiV.zzWSL == zzYeQ.zzX0q || (new Date()).after(zzWiV.zzZ3l) || zzYKk.zzWy3() == 4096;
让它返回什么数据。
这里需要分析zzWiV.zzWSL
zzWiV.zzZ3l
zzYKk.zzWy3()
这三个数据,在当前zzXDb
class文件中搜索找到在void zzY0J(InputStream var1) throws Exception
方法中关键的关键位置赋值了
1 | java复制代码this.zzWSL = zzYeQ.zzXgr; |
观察它上下位置代码发现看起来都是做验证错误的处理,所以可以尝试去掉上下的验证。
再来看zzWiV.zzZ3l
变量属性为Date应该是时间什么的可以直接给个最大值。
然后是zzYKk.zzWy3()
进入看到
1 | java复制代码static int zzWy3() { |
那么返回值就是256和4096二选一,尝试后选择返回256。
3. 分析结果
- 修改
void zzY0J(InputStream var1)
方法体为
1 | java复制代码this.zzZ3l = new java.util.Date(Long.MAX_VALUE);//Date赋值最大值 |
- 修改
zzYKk
类下的static int zzWy3()
方法体为
1 | java复制代码return 256; |
执行操作
1. 添加Javassist修改class字节码文件
1 | xml复制代码<dependency> |
2. 添加修改方法
1 | java复制代码/** |
运行修改方法后会在桌面生成 com 修改后的文件夹
3. 修改jar包里面的数据
为了不修改原jar包建议复制一份重命名。
- 打开jar包将桌面com文件夹覆盖到jar包com文件夹
2. 删除jar包里面的.RSA
和.SF
文件
4. 重新导入修改后的jar包进行测试
- maven移除旧的jar包,导入修改后的jar包
- 调用测试方法进行测试转换后的文件是否去除水印和数量限制成功
1 | java复制代码String sourceFile = "D:\\b.doc";//输入的文件 |
声明
本方法只做个人研究学习使用,切勿用于商用。
其他参考
Aspose.PDF for Java21.11去除水印和数量限制
本文转载自: 掘金