Aptana的破解

---工欲善其事、必先利其器

最近写JS比较多,常常苦恼与没有一个顺手的IDE。Editplus虽然用的熟,不过那个的效率太低而且代码看起来也很不方便,经过一个多月的试用,发现了一款好用的编写JS的IDE--Aptana,一个基于Eclipse的JS开发环境。

今天先来说一下破解,因为我是用到试用期快满的时候才想起来破解的。如果不破解,在右下角会有一个剩余多少时间的提示,那怎么破解呢。

关键在\Aptana\Aptana Studio\plugin\com.aptana.ide.core_1.1.7.015414.jar中,只要修改其中的license类,编译并替换后就可以了。

代码如下:

package com.aptana.ide.core.licensing;

import java.math.BigInteger;
import java.util.Calendar;
import java.util.TimeZone;
import java.util.zip.CRC32;

public final class ClientKey {
    private static class Decrypt {

        private BigInteger modulus;
        private BigInteger exponent;

        public String decrypt(String encrypted) {
            long crc32Value;
            byte bytes[];
            CRC32 crc32;
            if (encrypted == null) {
                encrypted = "";
            } else {
                encrypted = ClientKey.trimEncryptedLicense(encrypted);
            }
            BigInteger big = new BigInteger(encrypted);
            BigInteger decrypted = big.modPow(exponent, modulus);
            crc32Value = (long) decrypted.intValue() & 0xffffffffL;
            decrypted = decrypted.shiftRight(32);
            bytes = decrypted.toByteArray();
            crc32 = new CRC32();
            crc32.update(bytes);
            if (crc32Value == crc32.getValue()) {
                return new String(bytes);
            }
            return null;
        }

        Decrypt(String exponent, String modulus) {
            this.modulus = new BigInteger(modulus);
            this.exponent = new BigInteger(exponent);
        }
    }

    public static final String BEGIN_LICENSE_MARKER = "--begin-aptana-license--";
    public static final String END_LICENSE_MARKER = "--end-aptana-license--";
    private static final TimeZone GMT = TimeZone.getTimeZone("GMT");
    private static final String EMAILS_NON_MATCHING = "EMAILS_NON_MATCHING";
    private static final int PRO = 0;
    private static final int TRIAL = 1;
    private String email;
    private long expiration;
    private int type;

    private ClientKey(int type, String email, long expiration) {
        this.type = type;
        this.email = email;
        this.expiration = expiration;
    }

    public static ClientKey decrypt(String encrypted, String email) {
        String modulus = "115801190261221214754334668902722425936509505416457970789287297728816388753627896293249501578830570324705253515546383166989625001335561947096747210280001245977114030627247212292377290543869343996595819188362915644707269064020812435233012510929338706599216007185654748959001143012936618501934698642942289379979";
        String exponent = "65537";
        if (encrypted != null) {
            encrypted = encrypted.trim();
        }
        Decrypt decrypter = new Decrypt(exponent, modulus);
        return decrypt(decrypter, encrypted, email);
    }

    private static ClientKey decrypt(Decrypt decrypter, String encrypted,
            String email) {
        String value = decrypter.decrypt(encrypted);
        if (value == null) {
            return new ClientKey(1, null, 0L);
        }
        String values[] = value.split(";");
        int type = 1;
        String genedEmail = null;
        long expiration = 0L;
        if (values.length == 3) {
            if ("p".equals(values[0].toLowerCase())) {
                type = 0;
            }
            genedEmail = values[1];
            if (genedEmail != null) {
                if (!genedEmail.equalsIgnoreCase(email)) {
                    genedEmail = "EMAILS_NON_MATCHING";
                }
            } else {
                genedEmail = null;
            }
            try {
                expiration = Long.parseLong(values[2]);
            } catch (Exception _ex) {
                expiration = 0L;
            }
        }
        return new ClientKey(type, genedEmail, expiration);
    }

    public boolean isCloseToExpiring() {
        return false;
    }

    public boolean isValid() {
        return true;
    }

    public boolean isCloseToMatching() {
        return false;
    }

    public boolean isExpired() {
        return false;
    }

    public String getEmail() {
       //把此处的Email修改为你自己的Email地址
        return "heimazhao@gmail.com";
    }

    public Calendar getExpiration() {
        Calendar expirationCal = Calendar.getInstance(GMT);
          //把此处的时间修改为授权到期时间
        expirationCal.set(2010, 9, 9);

        return expirationCal;
    }

    public boolean isTrial() {
        return false;
    }

    public boolean isPro() {
        return true;
    }

    public boolean shouldProPluginsRun() {
        return true;
    }

    public static String trimEncryptedLicense(String encrypted) {
     String newEncrypted = encrypted;
     newEncrypted = newEncrypted.trim();
    newEncrypted = newEncrypted.replaceAll("--begin-aptana-license--", "");
     newEncrypted = newEncrypted.replaceAll("--end-aptana-license--", "");
     newEncrypted = newEncrypted.replaceAll("/s+", "");
    return newEncrypted;
}
}

完成后改成名字和原来一样的jar包替换就行了,我是用的版本是com.aptana.ide.core_1.1.7.015414.jar,破解没出现问题。

今后在总结一些使用上的技巧,希望能够在自己手中发挥Aptana的强大威力。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据处理

leetcode222求完全二叉树节点个数

3774
来自专栏WindCoder

数据统计第一弹-按时/天/周/月补全某一段时间的数据-Java核心逻辑

本代码均结合之前的发布的DateUtil使用,之后的mysql查询部分看心情发布,就这么任性~ ~

1331
来自专栏猿人谷

双向链表

双向链表       在线性链式存储结构的结点中只有一个指示直接后继的指针域,由此,从某个结点出发只能顺指针往后寻查其他结点。若要寻查结点的直接前趋,则需从表...

2715
来自专栏灯塔大数据

每周学点大数据 | No.25二叉搜索树回顾(二)

No.25期 二叉搜索树回顾(二) Mr. 王:既然提到了有序的状态,那么我们就来谈谈有根树的遍历问题。 小可:我知道,遍历就是访问一个数据集合中的所...

3516
来自专栏尾尾部落

[剑指offer] 重建二叉树

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6...

1491
来自专栏技术小黑屋

Java性能调优之容器扩容问题

在Java和Android编程中,我们经常使用类似ArrayList,HashMap等这些容器。这些容器少则存储几条,多则上千甚至更多。作为性能调优的一部分,容...

1131
来自专栏Petrichor的专栏

leetcode: 75. Sort Colors

1593
来自专栏Java后端技术栈

为什么MySQL数据库索引选择使用B+树?

在进一步分析为什么MySQL数据库索引选择使用B+树之前,我相信很多小伙伴对数据结构中的树还是有些许模糊的,因此我们由浅入深一步步探讨树的演进过程,在一步步引出...

4061
来自专栏项勇

笔记26 | 总结Android的获取系统时间的几种方法

1985
来自专栏大史住在大前端

野生前端的数据结构基础练习(7)——二叉树

一棵树最上面的点称为根节点,如果一个节点下面连接多个节点,那么该节点称为父节点,下面的节点称为子节点,二叉树的每一个节点最多有2个子节点,一个节点子节点的个数称...

862

扫码关注云+社区

领取腾讯云代金券