云自无心水自闲

天平山上白云泉,云自无心水自闲。何必奔冲山下去,更添波浪向人间!
posts - 288, comments - 524, trackbacks - 0, articles - 6
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理
最近做一个项目的时候,需要将数据库从原先的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(13+ s.substring(68+ s.substring(910+ s.substring(1113+ s.substring(1415);
        
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(01+ s2.substring(02+ s1.substring(14+ s2.substring(24);
        s3 
= s3 + s1.substring(45+ s2.substring(45+ s1.substring(56+ s2.substring(56+ s2.substring(67+ s1.substring(67+ s2.substring(78+ s1.substring(78);
        String s4 
= s3;
        
return s4;
    }


    
public static int _mthif(int i)
    
{
        
int j = 0xb524b;
        
boolean flag = false;
        
int ai[] = {
            
19292359532331374147
            
32571113
        }
;
        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 sdlcc
可以直接修改class文件,让c._mthif函数返回true就可以了

# re: SwisSql Oracle to Sql Server3.0(一个从Oracle迁移到SqlServer数据库工具)的破解手记  回复  更多评论   

2006-04-03 09:15 by usherlight
不是这么简单的, 因为反编译出来的程序中出现了无数的错误.
根本无法编译通过.
所以采用了静态分析法.

# re: SwisSql Oracle to Sql Server3.0(一个从Oracle迁移到SqlServer数据库工具)的破解手记  回复  更多评论   

2006-04-05 15:54 by CRI
搞不出来,方便的话给个注册码出来试试

# re: SwisSql Oracle to Sql Server3.0(一个从Oracle迁移到SqlServer数据库工具)的破解手记  回复  更多评论   

2006-04-06 16:42 by usherlight
注册码是和安装SwisSql机器的机器名和Mac地址有关的.
我无法给出一个通用的注册码.

# re: SwisSql Oracle to Sql Server3.0(一个从Oracle迁移到SqlServer数据库工具)的破解手记  回复  更多评论   

2006-07-11 11:01 by estc
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 QXD
通过提供的java ,产生了一堆key。
但是通过尝试,较难获得验证通过!
请版主指教,谢谢!!!
我的MSN :quexd@hotmail.com

# re: SwisSql Oracle to Sql Server3.0(一个从Oracle迁移到SqlServer数据库工具)的破解手记  回复  更多评论   

2006-10-24 15:15 by usherlight
你的SwisSql的版本是3.0吗?

# re: SwisSql Oracle to Sql Server3.0(一个从Oracle迁移到SqlServer数据库工具)的破解手记  回复  更多评论   

2006-10-26 09:35 by QXD
我用的是3.0
请在MSN加我,ok?
我上班白天都在线。
谢谢!!! 

# re: SwisSql Oracle to Sql Server3.0(一个从Oracle迁移到SqlServer数据库工具)的破解手记  回复  更多评论   

2006-12-14 00:35 by rui
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 usherlight
@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 xiaoming
你好请问一下这段话是什么意思

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 SUNNY
很好,完全没问题,我用的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 wsl
楼主我没搞定,按你说的:

先将所有的代码都复制到一个文件中,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 sch
那请问注册时 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 s
可以使用

# re: SwisSql Oracle to Sql Server3.0(一个从Oracle迁移到SqlServer数据库工具)的破解手记[未登录]  回复  更多评论   

2016-04-18 12:17 by s
把MAC地址和机器名换成自己的,运行程序就可以了
String sMacAddr = "xx-xx-xx-xx-xx-xx";
String sMachineName = "machinename";