`

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呢?

相关推荐

    aspose.words操作word 一些关键方法

    在IT行业中,Aspose.Words是一款非常强大的文档处理组件,它允许开发者在不依赖Microsoft Office的情况下,进行Word文档的创建、阅读、修改和转换。这个资源聚焦于利用Aspose.Words进行一系列的关键操作,包括插入...

    Aspose.Words For JAVA 2024.01 无水印版本,加载模板.docx

    Aspose.Words for Java 是一个强大的文档处理库,专门用于在Java环境中创建、编辑和操作Microsoft Word文档。这个工具允许开发者无需使用Microsoft Word本身就能处理DOCX格式的文件,极大地提高了自动化文档处理的...

    aspose-words-15.8.0-jdk16.jar

    下面是一段简单的Java代码示例,展示如何使用Aspose.Words for Java将Word文档转换为PDF: ```java import com.aspose.words.*; public class DocumentConverter { public static void main(String[] args) { ...

    分享aspose 将PDF转WOR for java 去限制页码数量限制与水印版

    Aspose.Words for Java是Aspose公司专门为Java开发者设计的一个强大的文档处理组件,它允许开发者在Java应用中创建、编辑、转换和显示各种文档格式。在这个特定的场景中,我们将关注PDF转Word的功能,以及处理PDF中...

    aspose-words去水印jar包

    在IT行业中,Aspose.Words是一款著名的文档处理库,它为开发者提供了强大的API,用于创建、编辑、转换和呈现各种Microsoft Word文档格式。这个“aspose-words去水印jar包”显然是一款针对Aspose.Words功能的扩展,...

    aspose-words-20.2-android.via.java.zip

    标题 "aspose-words-20.2-android.via.java.zip" 暗示这是一个针对Android平台的Java库,用于处理Microsoft Word文档并将其转换为PDF格式。Aspose.Words是Aspose公司提供的一个强大的文档处理组件,它允许开发者在...

    Aspose.Words读取WORD组件+PDFBox-0.7.3

    Aspose.Words是一款强大的文档处理组件,主要用于在.NET和Java应用程序中操作Microsoft Word文档。它提供了丰富的API,允许开发者执行各种任务,如创建、编辑、转换、格式化和打印Word文档,无需安装Microsoft ...

    Aspose.Words.dll 和帮助手册

    Aspose.Words是一款著名的第三方库,专为程序员和开发者设计,用于在.NET、Java以及其他支持的平台上处理Microsoft Word文档。这个库提供了丰富的功能,允许用户无需安装Microsoft Word就能创建、编辑、转换和显示...

    aspose-words-18.4-java.zip

    Aspose.Words for Java是Aspose公司开发的一款强大的文档处理组件,主要针对Java开发者设计,用于在Java应用程序中创建、编辑、转换和呈现各种Microsoft Word文档格式。版本18.4是该组件的一个特定更新,提供了对新...

    使用aspose.words 18.6实现word文档转换为图片demo

    在IT行业中,Aspose.Words是一款著名的文档处理库,它提供了强大的API,使得开发者能够方便地在各种应用程序中处理Microsoft Word文档。在这个“使用Aspose.Words 18.6实现Word文档转换为图片demo”中,我们将深入...

    aspose-words-17.4.0-java

    Aspose.Words for Java是Aspose公司开发的一款强大的文档处理组件,主要针对Java开发者设计,用于在Java应用程序中创建、编辑、转换和呈现各种文档格式。版本17.4.0是一个更新版本,可能包含了对先前版本的改进、新...

    Java 使用 poi 和 aspose 实现 word 模板数据写入并转换 pdf 增加水印

    在Java开发中,有时我们需要处理文档模板,将动态数据填入到Word模板中,并且可能还需要将处理后的Word文档转换为PDF格式,同时在PDF上添加水印。在这个场景下,`Apache POI`和`Aspose.Words for Java`是两个常用的...

    aspose-words的license和jar

    Aspose.Words是一款强大的文档处理库,主要用于在Java、.NET、Android等平台上进行Microsoft Word文档的操作。这个压缩包文件包含的"aspose-words"是该库的相关组件,主要功能在于无须安装Microsoft Office环境就能...

    基于java的word转html

    Jacob允许Java程序调用COM组件,例如Microsoft Office应用程序,从而实现Word文档的读取和转换。 Jacob-1.18-x64.dll和Jacob-1.18-x86.dll是Jacob库的对应32位和64位版本的动态链接库,它们在运行时提供对COM组件的...

    Aspose18.4.Words.rar

    Aspose.Words是一款强大的文档处理组件,主要用于在.NET和Java应用程序中创建、操作和转换Microsoft Word文档。这个组件以其高效能、稳定性和丰富的功能而受到广大开发者青睐。Aspose.Words 18.4版本提供了许多特性...

    Apose.word for java (word转pdf 或jpeg)

    Apose.Word是一款强大的Java库,专门用于处理Microsoft Word文档,包括读取、写入、转换和操作Word文档。在这个特定的场景中,我们关注的是它将Word文档转换为PDF或JPEG图片的功能。以下是对这个主题的详细解释: 1...

    aspose-words word添加水印的jar和licence文件

    在IT行业中,Aspose.Words是一款著名的文档处理库,它提供了强大的API,使得开发者能够方便地在各种应用程序中创建、编辑和操作Microsoft Word文档。在这个特定的案例中,"aspose-words word添加水印的jar和licence...

    Aspose.words/cells/slides/pdf类包

    Aspose.words是这个系列中的一个组件,专注于处理Microsoft Word文档。它提供了丰富的API,允许开发者在不依赖Microsoft Office的情况下,对Word文档进行创建、读取、编辑和转换。 Aspose.words的功能非常广泛,...

    aspose.words dll+示例

    它提供了一个强大的API,使得程序员无需依赖Microsoft Office组件就能在.NET、Java、Android、iOS和更多平台上操作Word文档。 Aspose.Words的核心功能包括: 1. **文档创建**:从头开始创建新的Word文档,可以...

    Aspose.Words

    Aspose.Words是一款强大的文档处理库,主要用于在.NET环境...总的来说,Aspose.Words是一个强大的工具,它简化了.NET开发者在处理Word文档时的工作,极大地提高了工作效率,是企业级应用和自动化解决方案中的常用组件。

Global site tag (gtag.js) - Google Analytics