-
-
java 程序 spket ide 1.6.5 的两种破解方法
-
发表于:
2008-1-21 16:37
18568
-
java 程序 spket ide 1.6.5 的两种破解方法
spket ide 是一个eclipse 的插件,对于javascript的调试还是不错的。
前两天看到 microcao 发了一个关于java程序的破解,很有感触。也来kanxue很久了,一直没怎么发过帖,刚好最近拿了几个java程序,练了一下手。原来是想发 intall4j 的破解的,但是od里面不小心清空了。昨天看到有人谈spket 1.6.5, 想起来以前破过,在2007-08的时候。原来是用的简单的爆破的方法,现在仔细看了一下代码。用了替换rsa密钥的方法。
在这里首先要感谢 vhly, 舵手 两位,在论坛发了一些关于java的破解教程。多我受益非浅。
下面就把两种方法,写一下。
spket 的注册程序在 com.spket.ui_1.6.5.jar 包里的 com.spket.ui.internal.License.class
这个文件,没有经过混淆,用jad反编译,代码还是非常清楚的。
其中的验证在 check(byte[] abyte0) 这个method中。
===========================================
private boolean check(byte abyte0[])
{
if(abyte0 != null)
{
BigInteger biginteger = new BigInteger(abyte0);
abyte0 = new byte[bpn.length + bpd.length];
System.arraycopy(bpn, 0, abyte0, 0, bpn.length);
System.arraycopy(bpd, 0, abyte0, bpn.length, bpd.length);
BigInteger biginteger1 = new BigInteger(new String(abyte0), 16);
BigInteger biginteger2 = BigInteger.valueOf(51419L);
BigInteger biginteger3 = biginteger.modPow(biginteger2, biginteger1);
if(biginteger3 != null)
{
byte abyte1[] = biginteger3.toByteArray();
if(abyte1 != null && abyte1.length >= 39)
{
String s = new String(abyte1);
if(s.length() >= 39 && s.charAt(0) == '1')
{
for(int i = 1; i < 39; i++)
{
char c = s.charAt(i);
if(i == 17 || i == 20)
{
if(c != '/')
return false;
continue;
}
if(c < '0' || c > '9')
return false;
}
return true;
}
}
}
}
return false;
}
==================================================
第一种方法 直接爆破,用javassist找到这个方法,把里面修改掉。
-------------------------------------------------------------------------------------------
// CtMethod[] cm = cc.getDeclaredMethods();
//
// cm[4].insertBefore("{return true;}");
-------------------------------------------------------------------------------------------
这个是javassist 修改代码的方法。具体写的话还要在前面把代码补全。
这个方法很简单。我在8月份的时候,就是这么干的。当时好像是1.6.1。
第二种方法 这个是重点拉。就是修改rsa的密钥。
经过分析
---------------------------------------------------------------------------------------------
private byte[] getKeyFromText(String s)
{
if(s == null)
return null;
if(s.length() != 172)
{
s = s.trim();
if(s.length() != 172)
return null;
}
return decode(s.getBytes());
}
-----------------------
static int decodeDigit(byte byte0)
{
char c = (char)byte0;
if(c <= 'Z' && c >= 'A')
return c - 65;
if(c <= 'z' && c >= 'a')
return (c - 97) + 26;
if(c <= '9' && c >= '0')
return (c - 48) + 52;
switch(c)
{
case 43: // '+'
return 62;
case 47: // '/'
return 63;
}
throw new IllegalArgumentException("Invalid char to decode: " + byte0);
}
--------------------------------------------------
private static byte[] decode(byte abyte0[])
{
if(abyte0.length == 0)
return abyte0;
int i;
for(i = abyte0.length - 1; abyte0[i] == 61; i--);
int j = abyte0.length - 1 - i;
int k = (abyte0.length * 6) / 8 - j;
byte abyte1[] = new byte[k];
int l = 0;
int i1 = 0;
boolean flag = false;
int i2 = (i + 1) / 4;
for(int j2 = 0; j2 < i2; j2++)
{
int j1 = 0;
for(int j3 = 0; j3 < 4; j3++)
j1 = j1 << 6 | decodeDigit(abyte0[l++]);
for(int k3 = i1 + 2; k3 >= i1; k3--)
{
abyte1[k3] = (byte)(j1 & 0xff);
j1 >>>= 8;
}
i1 += 3;
}
switch(j)
{
default:
break;
case 1: // '\001'
int k1 = 0;
for(int k2 = 0; k2 < 3; k2++)
k1 = k1 << 6 | decodeDigit(abyte0[l++]);
k1 <<= 6;
k1 >>>= 8;
for(int l2 = i1 + 1; l2 >= i1; l2--)
{
abyte1[l2] = (byte)(k1 & 0xff);
k1 >>>= 8;
}
break;
case 2: // '\002'
int l1 = 0;
for(int i3 = 0; i3 < 2; i3++)
l1 = l1 << 6 | decodeDigit(abyte0[l++]);
l1 <<= 6;
l1 <<= 6;
l1 >>>= 8;
l1 >>>= 8;
abyte1[i1] = (byte)(l1 & 0xff);
break;
}
return abyte1;
}
--------------------------------------------------------------------------------------
从上面可以看出注册码要172长,从decode 方法可以看出用了base64编码处理。
再仔细看check的方法,发现是rsa加密的方法。其中的e=(51419L),N是一个1024的大数。
一看到1024就可以说,只有用替换密钥的方法了。想分解是不可能的了。自己伪造一个rsa1024的密钥。
解码后的数据是一个最少39位的字符串,第一位为1,第17和20位为'/'斜杠。
这个时候看到N,发现竟然是两个数组组成。看了看javassist的手册,没有发现修改数组的方法。或者是我不知道。
卡住了,吐血中。。。 google了一下,也没有看到方法。
这个时候想到 microcao 的破文,进来又仔细看了一下。决定用winhex直接修改。
用javap 了一下。又查了vmspec。 发现数组的结构是一样的。自己写个class,然后找到 newarray (0xbc)把整个段用winhex复制,再粘贴一下。
大功告成。
把破解好的文件,打包。覆盖原来的文件。重起eclipse。用自己写的注册机算出的注册码,注册,提示有效。
最后
有一点想法,把N用两个数组保存,的确比用string保存要好一点。如果没有想到方法,的确比较棘手。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课