好吧,其实我写这篇博客的目的就是要破解Spket,但是我又不想宣扬破解,所以就美其名曰:研究反编译技术。其实呢,这也没什么含量。
Spket IDE 是一个很酷的JavaScript和XML的开发工具,并且提供eclipse的插件。我主要是用来编写js的,支持主流的js框架——Extjs,YUI,jQuery等都可以很不错地支持。因为我对js其实不是很熟练,这东西很大程度地提高了我的工作效率。本来社区免费版也没什么不好的,只是只能用默认的设置。但是默认设置在格式化js代码的时候,超过80就开始换行,让我有点小不爽。刚好最近项目的一个deadline结束了,日子又开始过得轻松了,就花了点时间研究了下如何解决这个问题。单用户版的价格是$29.90,这超出了我的能力范围,如果¥29.90的话,我估计会毫不犹豫地购买-_-
Google了下,发现其注册程序在com.spket.ui_xxx.jar* 包里的com.spket.ui.internal.License.class中,据说没有混淆。这就大大降低了难度。这里再介绍一个免费的工具JD,和.NET中的reflector类似的东西,但是功能不如reflector强大。JD同样也有eclipse的插件,很好很强大。
下面就开始反编译,首先把jar包中的com.spket.ui.internal.License.class用JD反编译,结果很不错。这里就不去研究算法了,我也没想写注册机,自己玩玩就好了,采取最直接最暴力的方法——return true。
共三个校验相关的函数方法:
public boolean check(String paramString) {
return check(getKeyFromText(paramString));
}
public boolean check(File paramFile) {
try {
byte[] arrayOfByte = getLicenseData(paramFile);
return check(arrayOfByte);
} catch (IOException localIOException) {
} catch (RuntimeException localRuntimeException) {
}
return false;
}
private boolean check(byte[] paramArrayOfByte) {
if (paramArrayOfByte != null) {
BigInteger localBigInteger1 = new BigInteger(paramArrayOfByte);
paramArrayOfByte = new byte[bpn.length + bpd.length];
System.arraycopy(bpn, 0, paramArrayOfByte, 0, bpn.length);
System.arraycopy(bpd, 0, paramArrayOfByte, bpn.length, bpd.length);
BigInteger localBigInteger2 = new BigInteger(new String(paramArrayOfByte), 16);
BigInteger localBigInteger3 = BigInteger.valueOf(51419L);
BigInteger localBigInteger4 = localBigInteger1.modPow(localBigInteger3, localBigInteger2);
if (localBigInteger4 != null) {
byte[] arrayOfByte = localBigInteger4.toByteArray();
if ((arrayOfByte != null) && (arrayOfByte.length >= 39)) {
String str = new String(arrayOfByte);
if ((str.length() >= 39) && (str.charAt(0) == '1')) {
for (int i = 1; i < 39; ++i) {
int j = str.charAt(i);
if ((i == 17) || (i == 20))
if (j != 47)
return false;
else if ((j < 48) || (j > 57))
return false;
}
return true;
}
}
}
}
return false;
}
懒得去研究了,全部返回true。
下面就开始修改com.spket.ui.internal.License.class,这里需要用到Javassist,我只是看了部分文档,有别的需求的同学去自己 查找文档。
新建一个项目,然后再主函数中写入下面的代码
public static void main(String[] args) {
ClassPool pool = ClassPool.getDefault();
CtClass cc = null;
try {
cc = pool.get("com.spket.ui.internal.License");
if (cc != null) {
CtMethod[] methods = cc.getDeclaredMethods();
// methods[4].insertBefore("{return true;}");
for (CtMethod ctMethod : methods) {
String longName = ctMethod.getLongName();
System.out.println(longName);
if (longName.startsWith("com.spket.ui.internal.License.check")) {
ctMethod.insertBefore("{return true;}");
}
}
}
// cc.writeFile();
cc.writeFile("e:/workspace/HaveFun/CrackSpketIDE/bin");
} catch (Exception e) {
e.printStackTrace();
}
}
把生成出来的com.spket.ui.internal.License.class替换原文件,至此就搞定了。在eclipse的Spket中随便输入注册字符就可以了。如果还是不可以的话,在你的user.home的目录中看是不是有spket.lic文件,如果没有的话,手动建一个,里面随便输入几个字符就可以了。
注1:xxx代表版本号,在最新的com.spket.ui_1.6.18.jar上测试通过
注2:再装13地说一下,能支持的正版的话,还是支持下吧。
转载 http://ikoo.info/posts/java-decompiler/