|
posted on 2006-03-31 23:26 云自无心水自闲 阅读(5546) 评论(23) 所属分类: 数据库
最近做一个项目的时候,需要将数据库从原先的sqlserver迁移到oracle中。 需要迁移的不仅是数据还需要将表结构、存储过程、视图、触发器.... 所有东西都迁过去。 于是在网上搜索了一下,很快找到了www.swissql.com中提供了这样的工具。 但是能下载的是30天有效。只能转换2000行sql文本的试用版。 自己动手、丰衣足食。开始破解: 1. 安装swissql 2. 把swissql的lib目录下的swissql.jar, tsql2plsp.jar, tsql2plspgui.jar文件都反编译了. 我在netbeans中新建了一个项目(因为看到, absolutelayout.jar中有com.netbeans.的内容, 所以去下载安装了netbeans, 不过根据其后的进程来看, 选用哪种javaide并不重要) 3. 查看运行程序是 java -dsun.java2d.noddraw=true -djava.util.logging.config.file=%tsql2plsphome%\conf\internal_conf\logging.properties -cp %classpath% com.vembu.project.gui.pl2jsqlform 4. 看了一会pl2jsqlform, 发现明显是经过混淆的, 比较复杂, 于是放弃了从头了解的念头, 专注于注册号生成的破解. 5. 运行swissql 6. 点击注册. 出来一个注册号输入框. 7. 选择对话框中提示字符串"trial user"在项目中全字符, 大小写匹配搜索, 很快在中com.vembu.project.gui.a.java中找到. 而且整个项目中只有一个. 8. 在a.java中搜索一下"ok"字符串, 发现ok按钮的事件处理函数是_mthnew(actionevent); 在ide中跳转到_mthnew的定义 9. 发现此函数的核心是 if(!c._mthif(s1)) { d.settext("invalid key !!! please ensure that the key is applied in the same machine as the one in which the reginfo file was generated."); u.setsize(230, 125); u.setlocation(400, 300); u.show(); return; } 再次想跳转到_mthif的定义, 结果ide无法正确跳转. 10. 没关系, 使用搜索大法. 在ide中搜索 boolean _mthif(string , 搜索结果不多, 第一眼就看到了com.vembu.license.c.java, 再到a.java包头上一看果然有import com.vembu.license.c; 11. ok, 进入com.vembu.license.c.java, 找到_mthif(string)函数 12. b b1 = new b(); string[] as = b1._mthif(); 13. 仔细看一下b, 构造函数很长, 其实实际内容不多, 主要是取 mac地址, 本机机器名, 本机ip地址. 其中_mthif()就返回mac地址数组(因为可能有多个网卡, 所有是数组). b1._mthnew()返回机器名. 14. 将输入的注册号作为参数用_mthtry算出一个整数. 15. 将mac地址, 机器名和 "registered user for multi file select" 拼成一个字符串 16. 将第15步的字符串和14步算出的整数作为参数 用_mthdo算出一个新的字符串, 如果此字符串与注册号相同, 则此注册号是正确的. 17. _mthtry函数和_mthdo函数都是颇复杂的函数. 18. 想一个办法, 首先找一个8位的整数(作为14步生成的结果), 由于mac地址和机器名是定的. 所以可以调用第16步_mthdo函数. 算出一个注册号, 再用这个注册号作为参数调用_mthtry, 去算那个整数, 如果这个整数与初始整数相等, 则此注册号有效. 19. 结果很快出来一堆的注册号, 在swissql中一用. ok了. 注册成功. 下面贴出我生成注册号的源代码.  /**//*
* licensevalidate.java
*
* created on 2006年3月30日, 下午1:39
*
* to change this template, choose tools | template manager
* and open the template in the editor.
*/

package com.asiatom.dbmigrate;

 /** *//**
*
* @author ngcheng
*/
 public class licensevalidate {
 private static final char b[] = {
'h', 'z', 't', 'r', 'b', 'l', 'q', 'x'
};
 private static final char _fldbyte[] = {'u', 's', 'c', 'm', 'p', 'v', 'w', 'k', 'n'};
 public static final char _flddo[] = {
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
'u', 'v', 'w', 'x', 'y', 'z', 'a', 'b', 'c', 'd',
'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x',
'y', 'z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
'i', 'j', 'k', 'l'
};

 /** *//** creates a new instance of licensevalidate */
 public licensevalidate() {
}
public static string licenseok(string s)
 {
string as[];
int i;
s = s.replaceall(" ", "");
string macaddr = "00-0a-eb-9b-80-1b";
string clientname = "arthur";
i = 0;

string s1 = macaddr clientname "registered user for multi file select";
int j = _mthtry(s.touppercase());
string s2 = _mthdo(s1, j).touppercase();
// system.out.println("s2: [" s2 "]");
if(s2.equals(s.touppercase()))
return "ok";
//system.out.println("not");
return s2;
}
public static int _mthtry(string s)
 {
string s2 = "";
string s3 = "hztrblqx";
string s4 = "uscmpvwkn";
string s1 = s.substring(1, 3) s.substring(6, 8) s.substring(9, 10) s.substring(11, 13) s.substring(14, 15);
for(int j = 0; j < s1.length(); j)
 {
if(s3.indexof(s1.charat(j) "") != -1)
 {
s2 = s2 '9';
continue;
}
for(int k = 0; k < _fldbyte.length; k)
if(s1.charat(j) == _fldbyte[k])
s2 = s2 k;

}

int i = 0x5f5e0ff - integer.parseint(s2);
return i;
}

private static string _mthdo(string s, int i)
 {
int j = 0;
s = s.touppercase();
string s1 = new string();
string s2 = new string();
string s3 = new string();
for(int k = 0; k < s.length(); k)
if(!character.iswhitespace(s.charat(k)))
j ^= s.charat(k);

j ^= j << 6;
int l = i * 3 3214;
int _fldnew = _mthif(l);
s1 = (j ^ _fldnew) "";
s1 = _mthbyte(s1).touppercase();
s2 = a(i).touppercase();
s3 = s1.substring(0, 1) s2.substring(0, 2) s1.substring(1, 4) s2.substring(2, 4);
s3 = s3 s1.substring(4, 5) s2.substring(4, 5) s1.substring(5, 6) s2.substring(5, 6) s2.substring(6, 7) s1.substring(6, 7) s2.substring(7, 8) s1.substring(7, 8);
string s4 = s3;
return s4;
}

public static int _mthif(int i)
 {
int j = 0xb524b;
boolean flag = false;
 int ai[] = {
19, 29, 23, 59, 53, 23, 31, 37, 41, 47,
3, 2, 5, 7, 11, 13
};
string s = "";
j = i;
for(int k = 0; k < 16; k)
 {
string s1 = j "";
if(s1.length() == 6)
break;
if(s1.length() < 6)
 {
j *= ai[k];
continue;
}
if(s1.length() > 7)
 {
j /= 100;
continue;
}
if(s1.length() > 6)
j /= 10;
}

return j;
}

public static string _mthbyte(string s)
 {
return a(s.getbytes());
}

public static string a(byte abyte0[])
 {
char ac[] = new char[((abyte0.length - 1) / 3 1) * 4];
int k1 = 0;
int l1;
for(l1 = 0; l1 3 <= abyte0.length;)
 {
int i = (abyte0[l1] & 0xff) << 16;
i |= (abyte0[l1] & 0xff) << 8;
i |= (abyte0[l1] & 0xff) << 0;
int l = (i & 0xfc0000) >> 18;
ac[k1] = _flddo[l];
l = (i & 0x3f000) >> 12;
ac[k1] = _flddo[l];
l = (i & 0xfc0) >> 6;
ac[k1] = _flddo[l];
l = i & 0x3f;
ac[k1] = _flddo[l];
}

if(abyte0.length - l1 == 2)
 {
int j = (abyte0[l1] & 0xff) << 16;
j |= (abyte0[l1 1] & 0xff) << 8;
int i1 = (j & 0xfc0000) >> 18;
ac[k1] = _flddo[i1];
i1 = (j & 0x3f000) >> 12;
ac[k1] = _flddo[i1];
i1 = (j & 0xfc0) >> 6;
ac[k1] = _flddo[i1];
ac[k1] = '=';
} else
if(abyte0.length - l1 == 1)
 {
int k = (abyte0[l1] & 0xff) << 16;
int j1 = (k & 0xfc0000) >> 18;
ac[k1] = _flddo[j1];
j1 = (k & 0x3f000) >> 12;
ac[k1] = _flddo[j1];
ac[k1] = '*';
ac[k1] = '*';
}
return new string(ac);
}


public static string a(int i)
 {
string s1 = "";
int j = 0x5f5e0ff - i;
string s;
for(s = j ""; s.length() < 8; s = "0" s);
for(int k2 = 0; k2 < s.length(); k2)
switch(k2)
 {
default:
break;

case 0: // '\0'
if(s.charat(k2) == '9')
 {
s1 = s1 b[k2];
} else
 {
int k = integer.parseint(s.charat(k2) "");
s1 = s1 _fldbyte[k];
}
break;

case 1: // '\001'
if(s.charat(k2) == '9')
 {
s1 = s1 b[k2];
} else
 {
int l = integer.parseint(s.charat(k2) "");
s1 = s1 _fldbyte[l];
}
break;

case 2: // '\002'
if(s.charat(k2) == '9')
 {
s1 = s1 b[k2];
} else
 {
int i1 = integer.parseint(s.charat(k2) "");
s1 = s1 _fldbyte[i1];
}
break;

case 3: // '\003'
if(s.charat(k2) == '9')
 {
s1 = s1 b[k2];
} else
 {
int j1 = integer.parseint(s.charat(k2) "");
s1 = s1 _fldbyte[j1];
}
break;

case 4: // '\004'
if(s.charat(k2) == '9')
 {
s1 = s1 b[k2];
} else
 {
int k1 = integer.parseint(s.charat(k2) "");
s1 = s1 _fldbyte[k1];
}
break;

case 5: // '\005'
if(s.charat(k2) == '9')
 {
s1 = s1 b[k2];
} else
 {
int l1 = integer.parseint(s.charat(k2) "");
s1 = s1 _fldbyte[l1];
}
break;

case 6: // '\006'
if(s.charat(k2) == '9')
 {
s1 = s1 b[k2];
} else
 {
int i2 = integer.parseint(s.charat(k2) "");
s1 = s1 _fldbyte[i2];
}
break;

case 7: // '\007'
if(s.charat(k2) == '9')
 {
s1 = s1 b[k2];
} else
 {
int j2 = integer.parseint(s.charat(k2) "");
s1 = s1 _fldbyte[j2];
}
break;
}

return s1;
}
 private static string incstring(string s) {
string res = "";
s = s.touppercase();
boolean flag = false;
int i;
 for (i = s.length() - 1; i >= 0; i -- ) {
char ch = s.charat(i);
 if ( ch == 'z') {
flag = true;
res = "a" res ;
 } else {
res = (char)(ch 1) res;
break;
}
}
res = s.subsequence(0, i) res;
return res;
}

 public static void main(string args[]) {
//38238466
//licen

string smacaddr = "xx-xx-xx-xx-xx-xx";
string smachinename = "machinename";
string s1 = smacaddr smachinename "registered user for multi file select";
 for ( int i = 38200000; i < 38238466; i ) {
string s2 = _mthdo(s1, i);
int mid = _mthtry(s2);
 if ( mid == i ) {
system.out.println("got: " s2);
}
}
}
}

评论
# re: swissql oracle to sql server3.0(一个从oracle迁移到sqlserver数据库工具)的破解手记 回复
2006-04-01 23:10 by
可以直接修改class文件,让c._mthif函数返回true就可以了
# re: swissql oracle to sql server3.0(一个从oracle迁移到sqlserver数据库工具)的破解手记 回复
2006-04-03 09:15 by
不是这么简单的, 因为反编译出来的程序中出现了无数的错误.
根本无法编译通过.
所以采用了静态分析法.
# re: swissql oracle to sql server3.0(一个从oracle迁移到sqlserver数据库工具)的破解手记 回复
2006-04-05 15:54 by
搞不出来,方便的话给个注册码出来试试
# re: swissql oracle to sql server3.0(一个从oracle迁移到sqlserver数据库工具)的破解手记 回复
2006-04-06 16:42 by
注册码是和安装swissql机器的机器名和mac地址有关的.
我无法给出一个通用的注册码.
# re: swissql oracle to sql server3.0(一个从oracle迁移到sqlserver数据库工具)的破解手记 回复
2006-07-11 11:01 by
string smacaddr = "00-0f-ea-06-67-34";
string smachinename = "pc174";
string s1 = smacaddr smachinename "estc";
生成很多的类似“mwstiykwnszvmiwy”的码
我在 username 中输入 estc,
在下面的 key 中 依次输入 mwst-iykw-nszv-miwy,提示无效的code!怎么回事?多谢指教!
msn:estc.wu@hotmail.com
# re: swissql oracle to sql server3.0(一个从oracle迁移到sqlserver数据库工具)的破解手记 回复
2006-10-24 10:27 by
通过提供的java ,产生了一堆key。
但是通过尝试,较难获得验证通过!
请版主指教,谢谢!!!
我的msn :quexd@hotmail.com
# re: swissql oracle to sql server3.0(一个从oracle迁移到sqlserver数据库工具)的破解手记 回复
2006-10-24 15:15 by
你的swissql的版本是3.0吗?
# re: swissql oracle to sql server3.0(一个从oracle迁移到sqlserver数据库工具)的破解手记 回复
2006-10-26 09:35 by
我用的是3.0
请在msn加我,ok?
我上班白天都在线。
谢谢!!!
# re: swissql oracle to sql server3.0(一个从oracle迁移到sqlserver数据库工具)的破解手记 回复
2006-12-14 00:35 by
lz的方法可以用。
b[],_fldbyte[]和int l = i * 3 3214;中的3和3214以及各方法要相应替换。
# re: swissql oracle to sql server3.0(一个从oracle迁移到sqlserver数据库工具)的破解手记 回复
2006-12-16 20:44 by
@rui
能说得清楚点吗? 我没有看明白你的意思.
# re: swissql oracle to sql server3.0(一个从oracle迁移到sqlserver数据库工具)的破解手记 回复
2006-12-22 11:03 by
楼主大哥
不知道您给的这段代码不知道是在那里运行
方便的话,直接打包做成一个执行文件,运行就产生注册码
好像这样的东西叫做注册机
# re: swissql oracle to sql server3.0(一个从oracle迁移到sqlserver数据库工具)的破解手记 回复
2006-12-23 02:47 by
@在下
先将所有的代码都复制到一个文件中,licensevalidate.java,注意路径。
然后 javac licensevalidate.java,生成 licensevalidate.class
然后 java licensevalidate就可以运行了。
# re: swissql oracle to sql server3.0(一个从oracle迁移到sqlserver数据库工具)的破解手记 回复
2006-12-23 02:51 by
@estc
string s1 = smacaddr smachinename "registered user for multi file select";
这个语句不能改成
string s1 = smacaddr smachinename "estc";
那个字符串是不能动的,否则生成的验证码就不正确了。
不知道qxd是不是也是同样的问题。
# re: swissql oracle to sql server3.0(一个从oracle迁移到sqlserver数据库工具)的破解手记 回复
2006-12-27 18:42 by
你好请问一下这段话是什么意思
lz的方法可以用。
b[],_fldbyte[]和int l = i * 3 3214;中的3和3214以及各方法要相应替换。
谢谢了
# re: swissql oracle to sql server3.0(一个从oracle迁移到sqlserver数据库工具)的破解手记 回复
2007-01-27 16:34 by
谢谢版主的文章!
# re: swissql oracle to sql server3.0(一个从oracle迁移到sqlserver数据库工具)的破解手记 回复
2007-10-14 15:55 by
可以用了
# re: swissql oracle to sql server3.0(一个从oracle迁移到sqlserver数据库工具)的破解手记[未登录] 回复
2007-11-20 11:03 by
很好,完全没问题,我用的3.2 swissql的都能破解
# re: swissql oracle to sql server3.0(一个从oracle迁移到sqlserver数据库工具)的破解手记 回复
2008-03-11 11:02 by
楼主能给发破解版的吗
lbsfans(at)gmail.com
# re: swissql oracle to sql server3.0(一个从oracle迁移到sqlserver数据库工具)的破解手记 回复
2009-06-14 15:14 by
楼主我没搞定,按你说的:
先将所有的代码都复制到一个文件中,licensevalidate.java,注意路径。
然后 javac licensevalidate.java,生成 licensevalidate.class
然后 java licensevalidate就可以运行了。
运行时有错误,这几个文件要放在哪执行呀?我不懂java。。。
明白人帮解释一下吧,谢谢我急用呀!
# re: swissql oracle to sql server3.0(一个从oracle迁移到sqlserver数据库工具)的破解手记 回复
2010-05-26 14:04 by
那请问注册时 username 输入什么呢?
# re: swissql oracle to sql server3.0(一个从oracle迁移到sqlserver数据库工具)的破解手记 回复
2013-05-08 15:41 by
可以把swissql oracle to sql server3.0 软件给我发一份吗? 谢谢!
qq:450519363 mail: 450519363@qq.com
# re: swissql oracle to sql server3.0(一个从oracle迁移到sqlserver数据库工具)的破解手记[未登录] 回复
2016-04-18 12:16 by
可以使用
# re: swissql oracle to sql server3.0(一个从oracle迁移到sqlserver数据库工具)的破解手记[未登录] 回复
2016-04-18 12:17 by
把mac地址和机器名换成自己的,运行程序就可以了 string smacaddr = "xx-xx-xx-xx-xx-xx"; string smachinename = "machinename";
|