|
Posted on 2006-03-31 23:26 云自無心水自閑 閱讀(5665) 評論(23) 編輯 收藏 所屬分類: 數(shù)據(jù)庫
最近做一個項目的時候,需要將數(shù)據(jù)庫從原先的SqlServer遷移到Oracle中。 需要遷移的不僅是數(shù)據(jù)還需要將表結構、存儲過程、視圖、觸發(fā)器.... 所有東西都遷過去。 于是在網(wǎng)上搜索了一下,很快找到了www.swissql.com中提供了這樣的工具。 但是能下載的是30天有效。只能轉換2000行Sql文本的試用版。 自己動手、豐衣足食。開始破解: 1. 安裝SwisSql 2. 把SwisSql的Lib目錄下的SwisSql.jar, TSQL2PLSP.jar, TSQL2PLSPGUI.jar文件都反編譯了. 我在NetBeans中新建了一個項目(因為看到, AbsoluteLayout.jar中有com.netbeans.的內(nèi)容, 所以去下載安裝了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)明顯是經(jīng)過混淆的, 比較復雜, 于是放棄了從頭了解的念頭, 專注于注冊號生成的破解. 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ù)很長, 其實實際內(nèi)容不多, 主要是取 MAC地址, 本機機器名, 本機IP地址. 其中_mthif()就返回MAC地址數(shù)組(因為可能有多個網(wǎng)卡, 所有是數(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地址和機器名是定的. 所以可以調(diào)用第16步_mthdo函數(shù). 算出一個注冊號, 再用這個注冊號作為參數(shù)調(diào)用_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);
????????????}
????????}
????}
}

評論
# re: SwisSql Oracle to Sql Server3.0(一個從Oracle遷移到SqlServer數(shù)據(jù)庫工具)的破解手記 回復 更多評論
2006-04-01 23:10 by
可以直接修改class文件,讓c._mthif函數(shù)返回true就可以了
# re: SwisSql Oracle to Sql Server3.0(一個從Oracle遷移到SqlServer數(shù)據(jù)庫工具)的破解手記 回復 更多評論
2006-04-03 09:15 by
不是這么簡單的, 因為反編譯出來的程序中出現(xiàn)了無數(shù)的錯誤.
根本無法編譯通過.
所以采用了靜態(tài)分析法.
# re: SwisSql Oracle to Sql Server3.0(一個從Oracle遷移到SqlServer數(shù)據(jù)庫工具)的破解手記 回復 更多評論
2006-04-05 15:54 by
搞不出來,方便的話給個注冊碼出來試試
# re: SwisSql Oracle to Sql Server3.0(一個從Oracle遷移到SqlServer數(shù)據(jù)庫工具)的破解手記 回復 更多評論
2006-04-06 16:42 by
注冊碼是和安裝SwisSql機器的機器名和Mac地址有關的.
我無法給出一個通用的注冊碼.
# re: SwisSql Oracle to Sql Server3.0(一個從Oracle遷移到SqlServer數(shù)據(jù)庫工具)的破解手記 回復 更多評論
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數(shù)據(jù)庫工具)的破解手記 回復 更多評論
2006-10-24 10:27 by
通過提供的java ,產(chǎn)生了一堆key。
但是通過嘗試,較難獲得驗證通過!
請版主指教,謝謝!!!
我的MSN :quexd@hotmail.com
# re: SwisSql Oracle to Sql Server3.0(一個從Oracle遷移到SqlServer數(shù)據(jù)庫工具)的破解手記 回復 更多評論
2006-10-24 15:15 by
你的SwisSql的版本是3.0嗎?
# re: SwisSql Oracle to Sql Server3.0(一個從Oracle遷移到SqlServer數(shù)據(jù)庫工具)的破解手記 回復 更多評論
2006-10-26 09:35 by
我用的是3.0
請在MSN加我,ok?
我上班白天都在線。
謝謝!!!
# re: SwisSql Oracle to Sql Server3.0(一個從Oracle遷移到SqlServer數(shù)據(jù)庫工具)的破解手記 回復 更多評論
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數(shù)據(jù)庫工具)的破解手記 回復 更多評論
2006-12-16 20:44 by
@rui
能說得清楚點嗎? 我沒有看明白你的意思.
# re: SwisSql Oracle to Sql Server3.0(一個從Oracle遷移到SqlServer數(shù)據(jù)庫工具)的破解手記 回復 更多評論
2006-12-22 11:03 by
樓主大哥
不知道您給的這段代碼不知道是在那里運行
方便的話,直接打包做成一個執(zhí)行文件,運行就產(chǎn)生注冊碼
好像這樣的東西叫做注冊機
# re: SwisSql Oracle to Sql Server3.0(一個從Oracle遷移到SqlServer數(shù)據(jù)庫工具)的破解手記 回復 更多評論
2006-12-23 02:47 by
@在下
先將所有的代碼都復制到一個文件中,LicenseValidate.java,注意路徑。
然后 javac LicenseValidate.java,生成 LicenseValidate.class
然后 java LicenseValidate就可以運行了。
# re: SwisSql Oracle to Sql Server3.0(一個從Oracle遷移到SqlServer數(shù)據(jù)庫工具)的破解手記 回復 更多評論
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數(shù)據(jù)庫工具)的破解手記 回復 更多評論
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數(shù)據(jù)庫工具)的破解手記 回復 更多評論
2007-01-27 16:34 by
謝謝版主的文章!
# re: SwisSql Oracle to Sql Server3.0(一個從Oracle遷移到SqlServer數(shù)據(jù)庫工具)的破解手記 回復 更多評論
2007-10-14 15:55 by
可以用了
# re: SwisSql Oracle to Sql Server3.0(一個從Oracle遷移到SqlServer數(shù)據(jù)庫工具)的破解手記[未登錄] 回復 更多評論
2007-11-20 11:03 by
很好,完全沒問題,我用的3.2 SWISSQL的都能破解
# re: SwisSql Oracle to Sql Server3.0(一個從Oracle遷移到SqlServer數(shù)據(jù)庫工具)的破解手記 回復 更多評論
2008-03-11 11:02 by
樓主能給發(fā)破解版的嗎
lbsfans(at)gmail.com
# re: SwisSql Oracle to Sql Server3.0(一個從Oracle遷移到SqlServer數(shù)據(jù)庫工具)的破解手記 回復 更多評論
2009-06-14 15:14 by
樓主我沒搞定,按你說的:
先將所有的代碼都復制到一個文件中,LicenseValidate.java,注意路徑。
然后 javac LicenseValidate.java,生成 LicenseValidate.class
然后 java LicenseValidate就可以運行了。
運行時有錯誤,這幾個文件要放在哪執(zhí)行呀?我不懂JAVA。。。
明白人幫解釋一下吧,謝謝我急用呀!
# re: SwisSql Oracle to Sql Server3.0(一個從Oracle遷移到SqlServer數(shù)據(jù)庫工具)的破解手記 回復 更多評論
2010-05-26 14:04 by
那請問注冊時 username 輸入什么呢?
# re: SwisSql Oracle to Sql Server3.0(一個從Oracle遷移到SqlServer數(shù)據(jù)庫工具)的破解手記 回復 更多評論
2013-05-08 15:41 by
可以把SwisSql Oracle to Sql Server3.0 軟件給我發(fā)一份嗎? 謝謝!
QQ:450519363 mail: 450519363@qq.com
# re: SwisSql Oracle to Sql Server3.0(一個從Oracle遷移到SqlServer數(shù)據(jù)庫工具)的破解手記[未登錄] 回復 更多評論
2016-04-18 12:16 by
可以使用
# re: SwisSql Oracle to Sql Server3.0(一個從Oracle遷移到SqlServer數(shù)據(jù)庫工具)的破解手記[未登錄] 回復 更多評論
2016-04-18 12:17 by
把MAC地址和機器名換成自己的,運行程序就可以了 String sMacAddr = "xx-xx-xx-xx-xx-xx"; String sMachineName = "machinename";
|