`

Word文档处理组件 ★★★.Words for Java 注册方式的研究

阅读更多

      这几天,接了一项工作,要把Word文档进行采集并存入数据库,首先想到的是POI之HWPF,但试用之后发现HWPF还是很原始,基本上只能把Word的文本内容提取出来,原来Word文档里的段落层次无法采集,Word文档中的图片也没有找到相应的方法来提取,根本无法满足我的要求,于是只好放弃。

      第二个想到的是jacob,但該组件是使用JNI技术来实现的,要使用必须满足两个条件:一是必须是在Windows平台上,二是本机必须安装了MS Office,这样看来,如果是用JAVA做客户端软件,可能还马马虎虎,用在服务器上,局限太大,也只好放弃。

      然后继续找,找好久没发现合适的,于是想把Word文档转换为RTF格式,然后使用javax.swing.text.rtf.RTFEditorKit来解析,写了个小程序试了试,还不错,原文档的层次序号都保留并解析了出来,但仔细看了一下解析出来的内容,发现里面有少部分文字成了乱码,而且没有规律。乱码问题没法解决,RTF方案也被枪毙了。

      去www.theserversides.com上搜了搜,发现国外有套称为★★★的组件,可以比较好地处理MS Office的各种文档格式,于是就Google到★★★老家,把我需要的★★★.Words for Java下载下来,在下过程中顺便看了看这玩意儿卖多少钱。不看还好,一看吓一跳:单单★★★.Words for Java组件一年期的单用户开发版就要$899,赶上我不吃不喝一个多月工资啊,看来这玩意只能试试,想用正版不是我等穷程序员用得起的。

       闲话少说,把★★★.Words for Java下载下来后,写个简单Demo,弄个文件一解析,嘿,显示了Word文档开头一段之后扔给我这么一句:

This document was truncated here because it was created using ★★★.Words in Evaluation Mode.

提醒我用的是试用版,想看看实际解析效果都看不到。看来不弄个License是没办法看到这玩意实际使用效果了。于是咬咬牙,狠狠心,拼上一晚上不睡觉,研究一下它的注册机制。(本人郑重声明,此次研究仅仅限研究范畴,不提供破解版或注册码。)

      JAVA做的东西,最常见的防盗版手段无非下面几类:

      一、对代码进行混淆,增加反编译难度;

      二、对代码进行加密,自定义ClassLoader,在载入类时先解密然后运行;

      三、对代码进行加密,用Native语言写解密模块,然后同第二类;

用License来防止非法使用的软件,一般就是开发者自定一个License格式,然后写个Lincese处理类来读取License并判断是否合法用户,而License处理类就会采用上面所列的几种方法中的一种来进行保密处理。

     按照帮助文档,给它随便设个License,看看有什么结果。一试之后,抛出一个异常:

java.lang.IllegalStateException: The signature is invalid.
	at com.★★★.words.da.a(License.java:757)
	at com.★★★.words.da.a(License.java:617)
	at com.★★★.words.da.c(License.java:376)
	at com.★★★.words.da.ar(License.java:345)
	at com.★★★.words.License.setLicense(License.java:226)
	......

 

,哈哈,正是我想要的东西,于是用XXX工具打开★★★.Words.jdk15.jar文件,看到里面有一大堆的诸如a.class、ab.class、da.class之类的东西,看来真是混淆过的,先不管了,看看License.class再说。

      反编译一下License.class,看到里面一堆的代码,有点乱,静下心来理了理,发现真正解析并判断License是否有效的地方是在da.class中。顺藤摸瓜,反编译出da.class,看看里面有啥。里面比License.class里还乱,还引用了一堆的混淆类:(。再看看,里面有个字符串“SHA1withRSA”告诉我,想做个XX机是不太可能的了,如果还想试试,只能改改类的字节码,让它跳过License有效性校验。

      再仔细研究一下da.class,让我发现了好多线索,首先是License的结构被我分析出来了,License是个XML文件,文件结构如下(再声明一下,下面的代码只是为了说明License的结构,不是有效的Lincese,大家不用费力去试用了。):

<License>
  <Data>
    <Products>
      <Product>★★★.Total for Java</Product>
      <Product>★★★.Words for Java</Product>
    </Products>
    <EditionType>Enterprise</EditionType>
    <SubscriptionExpiry>20991231</SubscriptionExpiry>
    <LicenseExpiry>20991231</LicenseExpiry>
    <SerialNumber>23dcc79f-44ec-4a23-be3a-03c1632404e9</SerialNumber>
  </Data>
  <Signature>sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=</Signature>
</License

其中,<Products>节点下的内容是说明此Lincese适用哪些★★★组件,最关键的其实是<Signature>节点,这个节点的内容是用SHA1withRSA算法进行签名的,所以,如果拿不到PrivateKey,就别想做出真正与厂商兼容的山寨License。

      再回过头来,我已经知道了License的结构,我就自己写个License,让它去加载。但前面说了,没有PrivateKey,无法伪造签名,怎么办呢?没办法,只有去改类了,可是类又是混淆过的,难改不说,即使改了,可能也无法编译,看来只有改类的字节码一条路了。

      打开rej工具,找到da.class类中验证签名的位置,直接把抛出异常的那几句remove掉,再保存,可以了。不信?可以再把da.clsss类反编译一下看看,是不是验证签名后抛出异常的代码没有了?

      自己满以为研究工作结束了,可以正常试用該组件了。可以把测试代码一运行,又给我来了个下马威,扔给我这样一个异常:

java.lang.SecurityException: SHA1 digest error for com/★★★/words/da.class
	at sun.security.util.ManifestEntryVerifier.verify(Unknown Source)
	at java.util.jar.JarVerifier.processEntry(Unknown Source)
	at java.util.jar.JarVerifier.update(Unknown Source)
	at java.util.jar.JarVerifier$VerifierStream.read(Unknown Source)
	at sun.misc.Resource.getBytes(Unknown Source)
	at java.net.URLClassLoader.defineClass(Unknown Source)
	at java.net.URLClassLoader.access$100(Unknown Source)
	at java.net.URLClassLoader$1.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at java.lang.ClassLoader.loadClassInternal(Unknown Source)
	at com.★★★.words.License.setLicense(License.java:225)
	……

看来厂商早就想到别人会改类这一招了,对重要类进行了数字签名,哪怕改动一个空格都不行。

      做到这里,已经凌晨1点多了,没有耐心再去研究哪里校验类的签名信息了。于是就在jar包里找,看看原始类的签名信息放在哪里。天不负我,没多久就被我找到了,放在META-INF目录下。看来老外还是比国人厚道,上次有研究一个国内的程序,作者把加密密钥伪装成jpg文件,放在了一堆图片文件中,不过不幸的是还是被我找到了,呵呵。再说我把那个保存类签名信息的文件找到之后,打开看看,是明文(再次向老外的绅士风度表示一下敬意,如果换了我,怎么着也得把这个文件伪装一下,把文件加密一下,然后伪装成class文件或是图片文件之类的,即使起不到防盗作用,溜达溜达那些研究者也好啊,哈哈。),把这个文件先备份一下,然后找到da.class对应的签名信息项,直接删除,然后重新放回到jar包中。重新启动测试程序,这次反而不如刚才那么自信了,没敢想这次一定能运行成功。

      测试程序启动后,稍等了几秒,控制台上出现了一堆堆的文字,是整个Word文档的内容,没有再出现提取内容长度限制或提示是试用版本的问候语。再按照帮助文件的指示,测试了一下其他功能,段落层次OK,表格解析OK,图片提取OK,可以了,这些就满足我的要求了。至此,本次工作算暂告一个段落。

       再次声明,本文只研究Java程序的防盗版技术,不鼓励大家去Crack。

  • 大小: 57.9 KB
分享到:
评论
14 楼 wdmsyf 2014-11-29  
EEXXTTJJSS 写道
本人用的是Aspose.Pdf for Java 9.5.2目前最新版本。
求大神指点一二。

我找个时间看看,好久没动这个玩意儿了。
13 楼 EEXXTTJJSS 2014-11-25  
本人用的是Aspose.Pdf for Java 9.5.2目前最新版本。
求大神指点一二。
12 楼 EEXXTTJJSS 2014-11-25  
(用的是破解word的license格式)调用注册api,直接报一下异常

java.lang.ArrayIndexOutOfBoundsException
at java.lang.System.arraycopy(Native Method)
at com.aspose.pdf.z136.m1(Unknown Source)
at com.aspose.pdf.z136.m1(Unknown Source)
at com.aspose.pdf.z150.m1(Unknown Source)
at com.aspose.pdf.z103.m1(Unknown Source)
at com.aspose.pdf.z103.m1(Unknown Source)
at com.aspose.pdf.z103.m1(Unknown Source)
at com.aspose.pdf.License.m1(Unknown Source)
at com.aspose.pdf.License.setLicense(Unknown Source)
at other.PDFCreate.getLicense(PDFCreate.java:96)
at other.PDFCreate.main(PDFCreate.java:109)
求大神帮忙破解。

11 楼 EEXXTTJJSS 2014-11-25  
wdmsyf 写道
EEXXTTJJSS 写道
bigNing 写道

异常佩服,拜谢


根据大神的提示可以破解aspose.words for java.

能否给个破解aspose.pdf for java组件的思路呢?


理论上也可以处理 aspose.pdf for java,只要细心加耐心。


aspose.pdf for java 好像比较麻烦,直接反编译,太多错误了。并没有向aspose.words for
java 那么容易。大神可以一试
10 楼 wdmsyf 2014-11-22  
EEXXTTJJSS 写道
bigNing 写道

异常佩服,拜谢


根据大神的提示可以破解aspose.words for java.

能否给个破解aspose.pdf for java组件的思路呢?


理论上也可以处理 aspose.pdf for java,只要细心加耐心。
9 楼 EEXXTTJJSS 2014-11-21  
bigNing 写道

异常佩服,拜谢


根据大神的提示可以破解aspose.words for java.

能否给个破解aspose.pdf for java组件的思路呢?
8 楼 bigNing 2014-06-21  

异常佩服,拜谢
7 楼 whywen_MoJian 2013-05-22  
感谢楼主。。。。
6 楼 fdz2004 2013-05-22  
现在最新的13.4代码混淆的比较难受~~反编不出来了~~直接拿楼主的来用了~~
5 楼 fdz2004 2013-05-22  
hawk_0071 写道
请问为什么用了你的jar包word还是有水印?

loadLicense 中
is = this.getClass().getResourceAsStream("/aspose.word.license.xml");
改为
is = this.getClass().getResourceAsStream("/resources/aspose.word.license.xml");
就可以了~~~

作者牛掰,赞一个
4 楼 hawk_0071 2013-05-22  
请问为什么用了你的jar包word还是有水印?
3 楼 taitung2011 2012-11-29  
万分感谢版主所提供的方法, 已成功将xxx.words 11.9 版改成功了
还有感谢2楼所提 SF 和 RSA的处理方式
可以直接存成PDF方便多了.
2 楼 nullpointer2008 2012-10-11  
已参考,成功。在aspos.word 10.5.0.0版中,对应的类是 xf.class.
同时补充:
为避免出现修改后类的签名验证失败问题,无需修改manifest,只需将META-INF下的.SF和.RSA删除即可.

同时感叹:
1、reJ真乃神器!
2、Java代码保护真是不容易啊!
1 楼 wanfengwanfeng 2011-01-19  
我能冒昧的问一句这个包是否有帮助文档吗?

我应该如何使用这个jar包提供的api呢?

相关推荐

Global site tag (gtag.js) - Google Analytics