前言:
有个兄弟让我帮忙研究一下AspXXX.Slides组件的注册机制, 我答应了,以前曾经研究过AspXXX.Words组件,我想AspXXX.Slides组件也应该相似。
根据以前研究 AspXXX.Words组件的经验,知道AspXXX系列组件是用SHA1withRSA算法对License进行签名的,在没办法拿到RSA私钥的情况下想要做注册机是十分困难的,我自认没这个能力,所以就简单处理了:用蛮力解决!
1、先随便写个license,可以参考我以前研究所得的Aspose.Words组件的License格式来写,以减少后面分析License格式的工作量,不然的话,随便构造结构不对的License,在测试过程中会带来很大麻烦;
2、然后写个测试程序。可以直接使用发布自带的examples的例子,我使用的是cloneslide那个例子,不过这个例子有问题,他提示的命令格式是:
java ppt2ppt <source file> <destination file>
是错误的,正确的应该是:
java CloneSlide <source file 1> <source file 2> <destination file>
该例子的实际功能是把两个ppt文件合并成一个,而不是原来那个命令行格式所表示的把一个PPT复制一份;
3、先运行测试程序:
java CloneSlide test.ppt test1.ppt test_copy.ppt
抛错如下:
com.aspose.slides.license.AsposeLicenseException: License parsing error.
at com.aspose.slides.obfuscated.alu.if(SourceFile:316)
at com.aspose.slides.obfuscated.alu.do(SourceFile:206)
at com.aspose.slides.License.setLicense(SourceFile:31)
at CloneSlide.main(CloneSlide.java:27)
Caused by: com.aspose.slides.license.AsposeLicenseException: Signature check error.
at com.aspose.slides.obfuscated.alu.do(SourceFile:354)
at com.aspose.slides.obfuscated.alu.if(SourceFile:303)
... 3 more
Caused by: com.aspose.slides.license.AsposeLicenseException: The signature is invalid.
at com.aspose.slides.obfuscated.alu.do(SourceFile:351)
... 4 more
4、把组件包aspose.slides-2.7.0.jar(我处理的是2.7.0版)用JD-GUI打开(反编译),查找以下关键字词:
License parsing error
Signature check error.
The signature is invalid.
找到之后,分别记下它们都位于哪个类中,我发现三个抛错信息都是在:
com.aspose.slides.obfuscated.alu.class
类中。
根据反编译的源码,我分析出只需要抛出“Signature check error.”异常的地方,直接屏蔽抛出异常的代码或直接删除,就不会再抛出License签名验证失败的异常了。
5、用rej工具(我用的是0.7版)打开aspose.slides-2.7.0.jar,并找到类 com.aspose.slides.obfuscated.alu.class,双击后就出现类似汇编语言的代码,直接用查找功能查找
Signature check error.
,找到后,就把构造签名验证失败异常并抛出的代码都删除,然后保存;
6、再次测试,抛出如下:
java.lang.SecurityException: SHA1 digest error for com/aspose/slides/obfuscated/alu.class
at sun.security.util.ManifestEntryVerifier.verify(ManifestEntryVerifier.java:194)
at java.util.jar.JarVerifier.processEntry(JarVerifier.java:201)
at java.util.jar.JarVerifier.update(JarVerifier.java:188)
at java.util.jar.JarVerifier$VerifierStream.read(JarVerifier.java:411)
at sun.misc.Resource.getBytes(Resource.java:97)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:256)
at java.net.URLClassLoader.access$000(URLClassLoader.java:56)
at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
at com.aspose.slides.License.setLicense(SourceFile:30)
at CloneSlide.main(CloneSlide.java:27)
SHA1 digest error for com/aspose/slides/obfuscated/alu.class
该组件对类有签名验证,我改了类,签名验证过不了了。类的签名数据放在哪里我是知道的:
META-INF\LE-E14C6.SF 和
META-INF\MANIFEST.MF
我尝试着去掉com/aspose/slides/obfuscated/alu.class 类的签名条目,再次测试又抛错:
Exception in thread "main" java.lang.SecurityException: cannot verify signature block file META-INF/
LE-E14C6
at sun.security.util.SignatureFileVerifier.processImpl(SignatureFileVerifier.java:202)
at sun.security.util.SignatureFileVerifier.process(SignatureFileVerifier.java:176)
at java.util.jar.JarVerifier.processEntry(JarVerifier.java:234)
at java.util.jar.JarVerifier.update(JarVerifier.java:188)
at java.util.jar.JarFile.initializeVerifier(JarFile.java:321)
at java.util.jar.JarFile.getInputStream(JarFile.java:386)
at sun.misc.URLClassPath$JarLoader$2.getInputStream(URLClassPath.java:689)
at sun.misc.Resource.cachedInputStream(Resource.java:59)
at sun.misc.Resource.getByteBuffer(Resource.java:154)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:249)
at java.net.URLClassLoader.access$000(URLClassLoader.java:56)
at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
Could not find the main class: CloneSlide. Program will exit.
原来对LE-E14C6.SF文件本身也有签名验证。到这里好象事情变得复杂了。
7、仔细看了一下 META-INF\LE-E14C6.SF 文件, 文件头:
Signature-Version: 1.0
SHA1-Digest-Manifest-Main-Attributes: HCoI2/EgEodlAzoVNOdp6dzZpdk=
Created-By: 1.6.0_22 (Sun Microsystems Inc.)
SHA1-Digest-Manifest: HzZmiMdRKEbSSchubBi0VBe87Zk=
应该就是 LE-E14C6.SF 文件本身的签名数据了,那我能不能干脆直接把LE-E14C6.SF整个文件都删除、把MANIFEST.MF文件中的所有签名数据也都删除呢?试试吧。
8、分三种情况分别处理测试:
a、把 LE-E14C6.SF 文件删除,MANIFEST.MF文件中的所有签名数据删除:再测试,不再抛出文件签名验证失败的异常(抛出其他异常了,下面会讲到);
b、把 LE-E14C6.SF 文件删除,其他文件保留:再测试,情况跟a相同;
c、把 LE-E14C6.SF和LE-E14C6.RSA都删除,然后把MANIFEST.MF文件中的所有签名数据删除:再测试,情况跟a相同;
以上三个测试说明要让系统跳过文件签名验证,只需删除 LE-E14C6.SF 文件即可。
到这里,文件签名验证已经跳过去了,现在抛出的异常如下:
com.aspose.slides.license.AsposeLicenseException: This license is disabled, please contact Aspose to obtain a new license.
at com.aspose.slides.obfuscated.alu.if(SourceFile:372)
at com.aspose.slides.obfuscated.alu.do(SourceFile:208)
at com.aspose.slides.License.setLicense(SourceFile:31)
at CloneSlide.main(CloneSlide.java:27)
9、再次用JD-GUI打开类包,找到“This license is disabled, please contact Aspose to obtain a new license.”所在的类和位置,在rej中把构造并抛出该异常的代码删除并保存;再次测试,程序不再抛异常,在当前目录下也生成了我们期望的合并文件。
至此,本次研究算是完成了。
后话:
从上次研究Aspose.Words文件我知道了在Aspose组件中都包含一个黑名单文件,里面包含了被厂商禁止使用的正版License的序列号。Aspose.Slides组件的黑名单文件位置是:
com\aspose\metafiles\resources\Aspose.License.BlackList.xml,如果系统提示License在黑名单中,则可以把黑名单中的内容清空再试。