SwisSql Oracle to Sql Server3.0(一個從Oracle遷移到SqlServer數(shù)據(jù)庫工具)的破解手記
Posted on 2006-03-31 23:26 云自無心水自閑 閱讀(5675) 評論(23) 編輯 收藏 所屬分類: 數(shù)據(jù)庫最近做一個項目的時候,需要將數(shù)據(jù)庫從原先的SqlServer遷移到Oracle中。
需要遷移的不僅是數(shù)據(jù)還需要將表結構、存儲過程、視圖、觸發(fā)器.... 所有東西都遷過去。
于是在網上搜索了一下,很快找到了www.swissql.com中提供了這樣的工具。
但是能下載的是30天有效。只能轉換2000行Sql文本的試用版。
自己動手、豐衣足食。開始破解:
1. 安裝SwisSql
2. 把SwisSql的Lib目錄下的SwisSql.jar, TSQL2PLSP.jar, TSQL2PLSPGUI.jar文件都反編譯了.
我在NetBeans中新建了一個項目(因為看到, AbsoluteLayout.jar中有com.netbeans.的內容, 所以去下載安裝了NetBeans,
不過根據(jù)其后的進程來看, 選用哪種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, 發(fā)現(xiàn)明顯是經過混淆的, 比較復雜, 于是放棄了從頭了解的念頭, 專注于注冊號生成的破解.
5. 運行SwisSql
6. 點擊注冊. 出來一個注冊號輸入框.
7. 選擇對話框中提示字符串"Trial User"在項目中全字符, 大小寫匹配搜索, 很快在中com.vembu.project.gui.a.java中找到. 而且整個項目中只有一個.
8. 在a.java中搜索一下"OK"字符串, 發(fā)現(xiàn)OK按鈕的事件處理函數(shù)是_mthnew(actionevent); 在IDE中跳轉到_mthnew的定義
9. 發(fā)現(xiàn)此函數(shù)的核心是
??????? 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)函數(shù)
12. b b1 = new b();? String[] as = b1._mthif();
13. 仔細看一下b, 構造函數(shù)很長, 其實實際內容不多, 主要是取 MAC地址, 本機機器名, 本機IP地址. 其中_mthif()就返回MAC地址數(shù)組(因為可能有多個網卡, 所有是數(shù)組). b1._mthnew()返回機器名.
14. 將輸入的注冊號作為參數(shù)用_mthtry算出一個整數(shù).
15. 將MAC地址, 機器名和 "Registered User for Multi File Select" 拼成一個字符串
16. 將第15步的字符串和14步算出的整數(shù)作為參數(shù) 用_mthdo算出一個新的字符串,
如果此字符串與注冊號相同, 則此注冊號是正確的.
17. _mthtry函數(shù)和_mthdo函數(shù)都是頗復雜的函數(shù).
18. 想一個辦法, 首先找一個8位的整數(shù)(作為14步生成的結果), 由于MAC地址和機器名是定的.
所以可以調用第16步_mthdo函數(shù). 算出一個注冊號, 再用這個注冊號作為參數(shù)調用_mthtry,
去算那個整數(shù), 如果這個整數(shù)與初始整數(shù)相等, 則此注冊號有效.
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);
????????????}
????????}
????}
}

需要遷移的不僅是數(shù)據(jù)還需要將表結構、存儲過程、視圖、觸發(fā)器.... 所有東西都遷過去。
于是在網上搜索了一下,很快找到了www.swissql.com中提供了這樣的工具。
但是能下載的是30天有效。只能轉換2000行Sql文本的試用版。
自己動手、豐衣足食。開始破解:
1. 安裝SwisSql
2. 把SwisSql的Lib目錄下的SwisSql.jar, TSQL2PLSP.jar, TSQL2PLSPGUI.jar文件都反編譯了.
我在NetBeans中新建了一個項目(因為看到, AbsoluteLayout.jar中有com.netbeans.的內容, 所以去下載安裝了NetBeans,
不過根據(jù)其后的進程來看, 選用哪種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, 發(fā)現(xiàn)明顯是經過混淆的, 比較復雜, 于是放棄了從頭了解的念頭, 專注于注冊號生成的破解.
5. 運行SwisSql
6. 點擊注冊. 出來一個注冊號輸入框.
7. 選擇對話框中提示字符串"Trial User"在項目中全字符, 大小寫匹配搜索, 很快在中com.vembu.project.gui.a.java中找到. 而且整個項目中只有一個.
8. 在a.java中搜索一下"OK"字符串, 發(fā)現(xiàn)OK按鈕的事件處理函數(shù)是_mthnew(actionevent); 在IDE中跳轉到_mthnew的定義
9. 發(fā)現(xiàn)此函數(shù)的核心是
??????? 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)函數(shù)
12. b b1 = new b();? String[] as = b1._mthif();
13. 仔細看一下b, 構造函數(shù)很長, 其實實際內容不多, 主要是取 MAC地址, 本機機器名, 本機IP地址. 其中_mthif()就返回MAC地址數(shù)組(因為可能有多個網卡, 所有是數(shù)組). b1._mthnew()返回機器名.
14. 將輸入的注冊號作為參數(shù)用_mthtry算出一個整數(shù).
15. 將MAC地址, 機器名和 "Registered User for Multi File Select" 拼成一個字符串
16. 將第15步的字符串和14步算出的整數(shù)作為參數(shù) 用_mthdo算出一個新的字符串,
如果此字符串與注冊號相同, 則此注冊號是正確的.
17. _mthtry函數(shù)和_mthdo函數(shù)都是頗復雜的函數(shù).
18. 想一個辦法, 首先找一個8位的整數(shù)(作為14步生成的結果), 由于MAC地址和機器名是定的.
所以可以調用第16步_mthdo函數(shù). 算出一個注冊號, 再用這個注冊號作為參數(shù)調用_mthtry,
去算那個整數(shù), 如果這個整數(shù)與初始整數(shù)相等, 則此注冊號有效.
19. 結果很快出來一堆的注冊號, 在SwisSql中一用. OK了. 注冊成功.
下面貼出我生成注冊號的源代碼.

































































































































































































































































































































































































































