王颂毓ID:ChinaOk
18503次访问,排名6023好友0人,关注者0
ChinaOk的文章
原创 29 篇
翻译 0 篇
转载 0 篇
评论 2 篇
最近评论
mghueh:wow power leveling
oddoooooooo:三个文件的Zip包
无法打开
文章分类
收藏
    相册
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 Jive笔记3----Jive2.1.1 License保护原理分析收藏

     | 旧一篇: jive setup tips

    从Jive2.0开始,需要购买License才能够将Jive用于商业应用。
    现在简单分析一下Jive2中的License验证的实现。
    要访问论坛,必然要用到ForumFactory.getInstance(authorization)。J
    ive就是在这个函数中进行了License验证。看看Jive_2_1_1版本中对应的代码:
    ForumFactory getInstance(Authorization authorization)
    {
    ...
    // Note, the software license expressely forbids
    // tampering with this check.
    LicenseManager.validateLicense("Jive Forums Basic", "2.0");
     //如果验证失败,LicenseManager会抛出一个LicenseException
    ...
    }

      所以,如果希望使用破解版本的Jive,我们只要简单的屏蔽掉上面的语句就可以了。可是,看看程序上面注释,如果你是君子,就不该改动这个Source。我当然不愿意随随便便做小人,所以要是能搞一个注册机什么的大批量生产Enterprise级别的Jive License就爽啦。

      接下来研究License究竟是什么回事情。

      首先从jivesoftware.com上下载一个试用版本的jive.license文件。打开一看,一堆数据:
    D94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxsaWNlbnNlP
    ................
    MzEwMjRmY2EzNGRlYTFkOGMwNWFhOGFhMWIxYTk4MDRiZGEyM2E1PC9zaWduYXR1cmU+PC9saWNlbnNlPg0K
      看起来是base64加密过的,所以还是看代码先。

      ok,研究LicenseManager这个类。可是找遍了Jive2_1_1source,就是没有找到。原来Jivesoftware没有提供Source,只好找到对应的Class反编译。
      反编译得到两个类LicenseManager.java和License.java。
      通过分析发现,LicenseManager.validateLicense()中调用了函数loadLicense()来加载License文件。
    在loadLicense()中找到了下面的代码:
    String s1 = StringUtils.decodeBase64(stringbuffer.toString());
    license = License.fromXML(s1);
      由此确定java.license是经过base64编码的xml文件。同时封装到了License类中
      解密的License内容如下:
    <?xml version="1.0" encoding="UTF-8"?>
    <license>
    <licenseID>3</licenseID>
    <product>Jive Forums Basic</product>
    <licenseType>Evaluation</licenseType>
    <name />
    <company />
    <version>2.1</version>
    <numCopies>1</numCopies>
    <url />
    <expiresDate>2001/11/01</expiresDate>
    <creationDate>2001/10/13</creationDate>
    <signature>302d02145a27545abb3c89bbc34a3900476dfd3fd9495047021500831024fca34dea1d8c05aa8aa1b1a9804bda23a5</signature>
    </license>

      似乎我们只要修改<tag></tag>中的内容就能获得Commercial License了。

      真的这么简单?继续看下去。

      经过分析LicenseManager.validate(license),发现JiveSoft使用了DSA数字签名算法确保License不被修改。fAINT...

    static boolean validate(License license1)
    throws Exception
    {
      //生成公钥
      String s = "308201b......d06d854a";
    byte abyte0[] = StringUtils.decodeHex(s);
    X509EncodedKeySpec x509encodedkeyspec = new X509EncodedKeySpec(abyte0);
    KeyFactory keyfactory = KeyFactory.getInstance("DSA");
    java.security.PublicKey publickey = keyfactory.generatePublic(x509encodedkeyspec);
    Signature signature = Signature.getInstance("DSA");
    signature.initVerify(publickey);
      //更新指纹,也就是License中的所有内容(除了最后的signature)。
    signature.update(license1.getFingerprint());
      //进行校验,如果内容被改动,则返回false;
    return signature.verify(StringUtils.decodeHex(license1.getSignature()));
    }

      由此可见,JiveSoftware通过DSA算法生成钥匙对,用私钥签署License,生成signagure,随同jive.license发放。并同时在程序中保存钥匙对中的公钥,利用Java.Security.*中的API进行验证。如果要自己造License,必须得到那个私钥,这一般不大可能实现。

    得出结论:搞不定,不过做个小人也不错,Let's Crack it!

    注:我对于DSA算法不是十分清楚,有些地方似乎妄下断言了。若有牛人看到,请不吝指正!

     

    发表于 @ 2003年05月30日 15:21:00|评论(loading...)|编辑

     | 旧一篇: jive setup tips

    评论:没有评论。

    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © ChinaOk