Aspose.Words,强大的word操作软件,支持中文,且胜过于docx4j、poi,无愧商业软件。好了,废话不多说,开始吧。
首先,说明下本破解过程纯粹是研究学习的,需要商业版的请绕行。
其次,该破解过程,是参考借鉴gitee上liuzy88所开源代码,但还是有所差异。再次感谢liuzy88。更多详见其破解操作,https://gitee.com/liuzy1988/aspose-words-crack
最后,开始正题。请大神多多赐教。
1、下载jar文件:see官网地址:https://releases.aspose.com/words/java/22-12/,如图所示:
2、为了方便查看编译后的java代码,建议在idea中查看(2023.1和谐版),通过maven引入到自己的测试工程中,如图所示:
1 2 3 4 5 6 7 8 9
| <dependency> <groupId>com.aspose</groupId> <artifactId>aspose-words</artifactId> <version>22.12</version> <!-- <classifier>jdk17</classifier>--> <scope>system</scope> <systemPath>/Downloads/aspose-words-crack-master/aspose-words-22.12-jdk17.jar</systemPath> <!-- <systemPath>/Downloads/aspose-words-crack-master/aspose-words-22.12-jdk17-cracked.jar</systemPath>--> </dependency>
|
4、好了,三个待破解的文件已经找到,现在,正式开始破解。程序如下:(注意过程中需要javassist-3.29.2-GA.jar的支持,这是关键点,具体原理大家可百度一下。)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| import javassist.ClassPool; import javassist.CtClass; import javassist.CtMethod; import java.lang.reflect.Field; public class AsposeWords_22_12 { public static void main(String[] args) throws Exception { ClassPool.getDefault().insertClassPath("aspose-words-22.12-jdk17.jar"); CtClass clazz = ClassPool.getDefault().getCtClass("com.aspose.words.zzYvW"); clazz.getDeclaredMethod("zzY34").setBody("{return com.aspose.words.zzZ8h.zzW8b;}"); clazz.getDeclaredMethod("zzjS").setBody("{this.zzWbe = com.aspose.words.zzZ8h.zzW8b; zzZAO = this; }"); CtMethod[] methodA = clazz.getDeclaredMethods(); for (CtMethod ctMethod : methodA) { CtClass[] ps = ctMethod.getParameterTypes(); if (ps.length == 1 && ctMethod.getName().equals("zzjS") && ps[0].getName().equals("java.io.InputStream")) { ctMethod.setBody("{this.zzWbe = com.aspose.words.zzZ8h.zzW8b; zzZAO = this; }"); } } clazz.getDeclaredConstructors()[0].setBody("{System.out.println(\"do nothing at zzYvW.\");}"); clazz.writeFile(); CtClass clazz2 = ClassPool.getDefault().getCtClass("com.aspose.words.zzWS8"); clazz2.getDeclaredMethod("zzQG").setBody("{System.out.println(\"do nothing. this.zzW67(); this.zzW5m();\");}"); clazz2.getDeclaredMethod("zzH0").setBody("{return com.aspose.words.zzY7H.zzZPG;}"); clazz2.writeFile(); CtClass clazz3 = ClassPool.getDefault().getCtClass("com.aspose.words.zzYJa"); clazz3.getDeclaredMethod("zzXuq").setBody("{zzYOl = 29273535023874148L;}"); clazz3.writeFile(); } }
|
为了方便操作,借鉴liuzy88所开源出的shell脚本,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| #!/bin/sh set -e SRC='aspose-words-22.12-jdk17.jar' DST='aspose-words-22.12-jdk17-cracked.jar' echo '==> 官网下载(新下载的此破解已失效,请直接下载破解版)'
echo '==> 重命名' rm -f $DST cp $SRC $DST echo '==> 执行破解,生成类' javac -classpath .:javassist-3.29.2-GA.jar AsposeWords_22_12.java java -classpath .:javassist-3.29.2-GA.jar AsposeWords_22_12 echo '==> 用jar命令更新jar内的类' echo '替换前' jar -uvf0 $DST com/aspose/words/*.class echo '==> 替换UCCESS。' echo '==> 用压缩工具打开,并删除 /MANIFEST.MF 目录下的*.SF,*.RSA文件,以及删除 versions 目录。' echo '==> DONE.'
|
另外,执行shell脚本,所需文件:crack.sh(源码上面)、aspose-words-22.12-jdk17.jar(官网下载)、AsposeWords_22_12.java(源码上面)、javassist-3.29.2-GA.jar、MANIFEST.MF(主要更新如下两行:Manifest-Version: 1.0
Created-By: 1.8.0_231,即可。)
另外,有需要处理PDF的,顺带也一起提供给大家研究学习。Aspose.pdf(aspose-pdf-22.12-jdk17.jar) 下载地址是:https://releases.aspose.com/java/repo/com/aspose/aspose-pdf/22.12/aspose-pdf-22.12-jdk17.jar 关键代码,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| import javassist.ClassPool; import javassist.CtClass; import javassist.CtMethod; import java.lang.reflect.Field; public class AsposePdf_22_12 { public static void main(String[] args) throws Exception { ClassPool.getDefault().insertClassPath("aspose-pdf-22.12-jdk17.jar");//路径自己定义。 // 类文件1,从com.aspose.pdf.License类文件找到。这是主入口。 CtClass clazz = ClassPool.getDefault().getCtClass("com.aspose.pdf.l10n"); CtMethod[] methodA = clazz.getDeclaredMethods(); for (CtMethod ctMethod : methodA) { CtClass[] ps = ctMethod.getParameterTypes(); if (ps.length == 1 && ctMethod.getName().equals("lI") && ps[0].getName().equals("java.io.InputStream")) { ctMethod.setBody("{this.l0t = com.aspose.pdf.l10f.lf; com.aspose.pdf.internal.imaging.internal.p71.Helper.help1(); lI(this); lI = true; }"); } } clazz.getDeclaredConstructors()[0].setBody("{System.out.println(\"do nothing at l10n.\"); this.l0t = com.aspose.pdf.l10f.lf;}"); clazz.writeFile(); // 类文件2,从类com.aspose.pdf.l22hW的方法lI()进。 CtClass clazz2 = ClassPool.getDefault().getCtClass("com.aspose.pdf.internal.l21l.l22y"); CtMethod[] method2 = clazz2.getDeclaredMethods(); for (CtMethod ctMethod : method2) { CtClass[] ps = ctMethod.getParameterTypes(); if (ps.length == 1 && ctMethod.getName().equals("lI") && ps[0].getName().equals("java.io.InputStream")) { ctMethod.setBody("{ this.l0t = com.aspose.pdf.internal.l21l.l22k.lf; lI(this); lI = true; }"); } } clazz2.getDeclaredConstructors()[0].setBody("{ this.l0t = com.aspose.pdf.internal.l21l.l22k.lf;}"); clazz2.writeFile(); // 类文件3,突破页面的限制,默认最大是4页。 CtClass clazz3 = ClassPool.getDefault().getCtClass("com.aspose.pdf.ADocument"); CtMethod[] method3 = clazz3.getDeclaredMethods(); for (CtMethod ctMethod : method3) { CtClass[] ps = ctMethod.getParameterTypes(); if("lt".equals(ctMethod.getName()) && ps.length == 0){ ctMethod.setBody("{ return true; }"); } if (ps.length == 2 && "lI".equals(ctMethod.getName()) && ps[0].getName().equals("com.aspose.pdf.ADocument") && ps[1].getName().equals("int") ) { ctMethod.setBody("{ return false; }"); } } clazz3.writeFile(); } }
|
其他处理逻辑,基本与Aspose.word是一致的,没有太大的差异。
仅限学习研究,若商业用途请绕行。