|
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";
|