Aspose.Slides组件注册机制研究

前言:

    有个兄弟让我帮忙研究一下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在黑名单中,则可以把黑名单中的内容清空再试。

你可能感兴趣的:(asp)