GalaxyPilot —— D.S


                  生命不熄,戰(zhàn)斗不止
          數(shù)據(jù)加載中……

          JProfiler 4.2 注冊分析

          JProfiler?4.2?注冊分析

          作者:舵手
          申明:如轉(zhuǎn)載請保證文章的完整性以及出處

          摘要:JProfiler是一款Java剖析器。JProfiler直觀的用戶界面能夠幫助你找到性能瓶頸,并指明你的內(nèi)存漏洞和解決線程問題。

          ????JProfiler是通過EXE來執(zhí)行,用十六進(jìn)制編輯器很容易找到程序的入口類:com.jprofiler.frontend.FrontendApplication?如果你要通過命令行運行,得看看這個類的main方法,它需要兩個參數(shù)才能運行。簡單分析了一下該類,發(fā)現(xiàn)方法H完成了注冊碼的驗證,讓我們順藤摸瓜找到計算注冊碼的位置。

          ????public?boolean?H()
          ????{
          ????????E?e1?=?com.jprofiler.frontend.E.H.A3().A2();
          ??//由于代碼經(jīng)過了混淆,以E命名的類有n多,所以千萬要找正確,否則會浪費你的保寶貴時間
          ??//com.jprofiler.frontend.E.D.E——E的完整類路徑
          ????????int?i1?=?e1.A(null,?this);
          ????????switch(i1)
          ????????{
          ????????case?-2:?
          ????????????if(l())
          ????????????{
          ????????????????System.err.println("Your?license?key?has?expired.");
          ????????????????return?false;
          ????????????}
          ????????????int?j1?=?A(p,?"Your?license?key?has?expired.\nIf?you?were?not?able?to?evaluate?JProfiler,?
          please\nrequest?a?new?key?at?"?+?L(),?new?String[]?{
          ????????????????"Enter?new?key",?"Send?mail"
          ????????????},?0);
          ????????????if(j1?==?1)
          ????????????{
          ????????????????O();
          ????????????????return?false;
          ????????????}
          ????????????if(!A(((String)?(null)),?true))
          ????????????????return?false;
          ????????????break;

          ????????case?-1:?
          ????????????break;

          ????????case?-3:?
          ????????????if(!A("Your?license?key?is?invalid.?Please?check?your?key.",?true))
          ????????????????return?false;
          ????????????break;

          ????????case?-5:?
          ????????????if(!A("There?was?an?error?communicating?with?the?license?server.\n
          Please?check?your?license?key.",?true))
          ????????????????return?false;
          ????????????break;

          ????????case?-4:?
          ????????????if(!A("The?license?server?is?invalid.?\nPlease?check?your?license?key.",?true))
          ????????????????return?false;
          ????????????break;

          ????????case?-6:?
          ????????????A(com.jprofiler.frontend.E.D.C.B(),?false);
          ????????????return?false;

          ????????default:
          ????????????if(i1?<?0)
          ????????????????throw?new?RuntimeException("Unknown?license?status?"?+?i1);
          ????????????e1.A(i1);
          ????????????break;
          ????????}
          ????????e1.AA();
          ????????return?true;
          ????}
          ????如果讓e1.A(null,?this)返回-1,那問題就解決了。如果想暴破可以從這個方法入手,我們這里的任務(wù)是追出注冊算法:)
          ????首先我們跟進(jìn)com.jprofiler.frontend.E.H.A3().A2();這兩個方法,發(fā)現(xiàn)只是對類做一些初始化,我們略過。

          ????跟進(jìn)e1.A(null,?this),它又調(diào)用了重載方法A
          ????public?int?A(String?s,?C._A?_pa)
          ????{
          ????????return?A(s,?_pa,?true);
          ????}
          ????
          ????public?int?A(String?s,?C._A?_pa,?boolean?flag)
          ????{
          ????????if(s?==?null)
          ????????????s?=?F4;?//在該類初始化時已經(jīng)給F4給了值,如果注冊文件存在,該值為注冊碼
          ????????if(flag?&&?!s.startsWith("FLOAT:")?&&?!s.startsWith("S-"))
          ????????????com.A.A.E.C.A(s,?_pa);//跟進(jìn)這里,發(fā)現(xiàn)是網(wǎng)絡(luò)驗證,由于我訪問不了IP?228.7.6.9?所以沒有詳細(xì)分析,
          ??????//有時間了再補上。如果你那里通不過網(wǎng)絡(luò)驗證,把com.A.A.E.C$_B(C的內(nèi)部類)里的IP改一下應(yīng)該就沒問題
          ??????//可別問我怎么改,十六進(jìn)制編輯器就可以了:)
          ????????return?S(s);?//我們再看這個方法
          ????}

          ????public?int?S(String?s)
          ????{
          ????????if(s?==?null)
          ????????????s?=?F4;//在該類初始化時已經(jīng)給F4給了值,如果注冊文件存在,該值為注冊碼
          ????????if(s.startsWith("FLOAT:"))?//不知道這代表什么,直覺上不是好東西,先不進(jìn)入,直接到else
          ????????{
          ????????????String?s1?=?s.substring("FLOAT:".length());
          ????????????int?i?=?-1;
          ????????????int?j?=?s1.lastIndexOf(':');
          ????????????if(j?>?-1)
          ????????????{
          ????????????????try
          ????????????????{
          ????????????????????i?=?Integer.parseInt(s1.substring(j?+?1));
          ????????????????}
          ????????????????catch(NumberFormatException?numberformatexception)?{?}
          ????????????????s1?=?s1.substring(0,?j);
          ????????????}
          ????????????int?k?=?C3();
          ????????????int?l?=?com.A.A.E.E.A(s1,?i,?k,?C7());
          ????????????FD?=?E.C();
          ????????????D(l?>?0?||?l?==?-1);
          ????????????return?l;
          ????????}?else
          ????????{
          ????????????return?Q(s);
          ????????}
          ????}

          ????Q(s)直接調(diào)用下面方法
          ????public?static?int?G(String?s)
          ????{//s為注冊碼
          ????????if(s?==?null)
          ????????????return?-3;
          ????????s?=?s.trim();
          ????????if(s.length()?<?3?||?s.charAt(1)?!=?'-'?||?s.indexOf('#')?==?-1)//長度大于3,第二位字符必須為-,必段有#
          ????????????return?-3;
          ????????switch(s.charAt(0))//取注冊碼中的第一個字符
          ????????{
          ????????case?69:?//?'E'??試用版
          ????????????int?i?=?A(s);//查檢當(dāng)前日期是否過了試用期
          ????????????if(!F(s))
          ????????????????return?-3;
          ????????????else
          ????????????????return?i;

          ????????case?65:?//?'A'
          ????????case?76:?//?'L'//這三個有什么區(qū)別還沒有搞清
          ????????case?83:?//?'S'
          ????????????return?H(s);??//讓這里返回-1
          ????????}
          ????????return?-3;
          ????}

          ????private?static?int?H(String?s)
          ????{
          ????????if(B(s)?!=?2)//license串中的"-"必須等于兩個,B函數(shù)的作用是計算串中的"-"字符的個數(shù)
          ????????????return?-3;
          ????????return?F(s)???-1?:?-3;//這里F必須反回true
          ????}

          ????private?static?boolean?F(String?s)
          ????{
          ????????A?a?=?new?A(s);//傳入注冊碼,進(jìn)行截取處理
          ????????if(!a.E())
          ????????????return?false;
          ????????String?s1?=?a.A();//返回注冊碼中第二個“-”后的所有字符
          ????????String?s2?=?E(s1);//把上面得到的字符串以“#”為界分開,“#”前的給s2
          ????????String?s3?=?D(s1);//“#”后的給s3
          ????????if(s3?==?null?||?s2?==?null)
          ????????????return?false;
          ????????else
          ????????????return?A(s3,?s2,?11,?7,?29);//重點所在
          ????}

          ????protected?static?boolean?A(String?s,?String?s1,?int?i,?int?j,?int?k)
          ????{
          ????????char?ac[]?=?s1.toCharArray();“#”前的串轉(zhuǎn)換為char
          ????????int?l?=?0;
          ????????char?ac1[]?=?ac;
          ????????int?i1?=?ac1.length;
          ????????for(int?j1?=?0;?j1?<?i1;?j1++)
          ????????{
          ????????????char?c?=?ac1[j1];
          ????????????l?+=?c;?//累加
          ????????}

          ????????String?s2?=?String.valueOf(l?%?i)?+?String.valueOf(l?%?j)?+?String.valueOf(l?%?k);
          ??//分別模11、7、29,結(jié)果相加,結(jié)果要和“#”后的那部分相等
          ????????return?s.equals(s2);
          ????}

          ????到這里我們已經(jīng)知道注冊的算法了,其實很簡單:注冊碼必須以A、S、L其中一個字母開頭,第二個字符必須為“-”,“-”字符必須為兩個,至少一個“#”字符,從目前的分析可以看出注冊碼長度已以大于等于四了,程序代碼中<3時完蛋。接下來載取注冊碼中從第二個“-”字符位置加1開始到“#”前一個字符的子串,轉(zhuǎn)換為char后累加,再分別模11、7、29,把三次模運算的結(jié)果相加,這個值等于注冊碼中“#”后面的所有字符。

          ????下面給寫出它的注冊機(jī)
          import?java.util.*;
          /**
          ?*?<p>Title:?JProfiler4.2?注冊機(jī)</p>
          ?*?<p>Description:?每執(zhí)行一次得到一個注冊碼</p>
          ?*?<p>Copyright:?Copyright?()?2006</p>
          ?*?@author?舵手
          ?*?@version?1.0
          ?*/
          public?class?jprofiler4_keygen??
          {
          ??public?static?void?main(String[]?args)?
          ??{
          ????String?s1?=?"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
          ????String?s2?=?"ALS";
          ????String?license?=?"";
          ????String?key?=?"";
          ????Random?rd?=?new?Random();
          ????int?j?=?rd.nextInt(3);
          ????license?+=?s2.substring(j,j+1)+"--";
          ????for?(int?i?=0?;?i?<?12?;?i++?)
          ????{
          ??????j?=?rd.nextInt(62);
          ??????license?+=?s1.substring(j,j+1);
          ??????key?+=?s1.substring(j,j+1);
          ????}
          ????license?+=?"#";
          ????char?ac[]?=?key.toCharArray();
          ????????int?l?=?0;
          ????????char?ac1[]?=?ac;
          ????????int?i1?=?ac1.length;
          ????????for(int?j1?=?0;?j1?<?i1;?j1++)
          ????????{
          ????????????char?c?=?ac1[j1];
          ????????????l?+=?c;
          ????????}
          ????????String?s3?=?String.valueOf(l?%?11)?+?String.valueOf(l?%?7)?+?String.valueOf(l?%?29);
          ????license?+=?s3;
          ????System.out.println(license);
          ??}
          }
          ????通過上面的分析,我們可以用正則表達(dá)式表示出注冊碼[A|L|S]-.-[a-zA-Z0-9]#[0-9],第二個“-”后的字符到“#”字符前的字符串的長度并沒有限制,當(dāng)然,不能為0,我只測試了長度為1和12,計算的注冊碼都沒有問題,有興趣的可以多試幾個:)“.”這個位置可以插入任意長度的任意字符。
          ????從注冊算法上說,這個程序的保護(hù)很簡單,但如果加上混淆和錯綜復(fù)雜的方法調(diào)用,會讓你頭痛好一陣子。這里我只列出了和計算注冊碼有關(guān)的一些方法,而在實際跟蹤中,牽扯到的類和方法數(shù)量是很大的,這就需要耐心。我一直以來都認(rèn)為這樣的文章對那些想要從這里學(xué)到東西的人沒有什么用處,因為這種文章充其量只能算是授人以魚而不是授人以漁。對那些正在分析這個軟件的注冊算法的人來說,也許有那么一點點用處:)
          ????分析這個軟件的注冊只是個人愛好,由于水平有限,錯誤疏漏在所難免,歡迎大家提出寶貴意見!

          posted on 2006-10-12 15:07 舵手 閱讀(22876) 評論(11)  編輯  收藏

          評論

          # re: JProfiler 4.2 注冊分析  回復(fù)  更多評論   

          佩服樓主的精神,破解是一件比較累的事情,尤其是看那些混淆代碼。
          2006-10-12 18:29 | 布衣郎

          # re: JProfiler 4.2 注冊分析  回復(fù)  更多評論   

          實際使用該軟件時才發(fā)現(xiàn)上述的破解只完成了一部分,對注冊碼的另一部分校驗在native 本地代碼中完成。本文的初衷是追出注冊算法,但試了多次都無法對該程序調(diào)用的dll進(jìn)行動態(tài)跟蹤。進(jìn)行了靜態(tài)分析也沒得到結(jié)果,所以只好用暴力破解它,這違背了我的初衷,但也無可奈何!
          等有有空了再試試,如果找出完整算法,馬上公布。需要使用該軟件的朋友可以從http://www.aygfsteel.com/Files/galaxyp/jprofiler.rar下破我修改過的dll文件,覆蓋bin\windows下相應(yīng)的dll,再用上面給出的算法注冊就能完整的使用該軟件。
          2006-10-20 09:05 | 舵手 QQ:8117892

          # re: JProfiler 4.2 注冊分析  回復(fù)  更多評論   

          非常抱歉,已經(jīng)覆蓋bin\windows下相應(yīng)的dll啦,但是還是出錯,幫忙看看是什么原因,信息如下:
          JProfiler> Protocol version 22
          JProfiler> Using JVMTI
          JProfiler> 32-bit library
          JProfiler> Listening on port: 8849.
          JProfiler> Native library initialized
          JProfiler> Waiting for a connection from the JProfiler GUI ...
          JProfiler> Using dynamic instrumentation
          JProfiler> Time measurement: elapsed time
          JProfiler> CPU profiling enabled
          JProfiler> ERROR: Invalid license key. Aborting.
          請按任意鍵繼續(xù). . .
          JProfiler> Disconnected.
          2006-11-01 15:25 | ellie

          # re: JProfiler 4.2 注冊分析  回復(fù)  更多評論   

          可能和操作系統(tǒng)有關(guān),windows目下有兩個dll,可能會根據(jù)不同的操作系統(tǒng)裝載不同的dll,而我只破解了一下,我的win2000正常,另一個就沒處理。你可以試用我提供的dll把兩個原dll都替換了
          2006-11-02 10:13 | 舵手 QQ:8117892

          # re: JProfiler 4.2 注冊分析  回復(fù)  更多評論   

          感謝LZ的分析。哈哈!

          Name: License for You
          Lincese Code: A-G667#42616F-10kg1r134fq9m#2217
          2006-11-08 15:29 | qinqinxiatiao

          # re: JProfiler 4.2 注冊分析  回復(fù)  更多評論   



          A-G666#12226F-1kt7iz01b6zpgt#239
          2006-11-27 22:21 | sz

          # re: JProfiler 4.2 注冊分析  回復(fù)  更多評論   

          太牛了,希望以前以我們大破一些國外的好軟件
          2006-12-04 14:12 | ps

          # re: JProfiler 4.2 注冊分析  回復(fù)  更多評論   

          龍簇的朋友?

          可以現(xiàn)在好像不能訪問了

          我在國外的一個網(wǎng)站上找到一個注冊機(jī)

          可以直接使用喲
          2006-12-08 11:11 | arfa

          # re: JProfiler 4.2 注冊分析  回復(fù)  更多評論   

          大N啊
          2007-10-22 17:22 | zsg

          # re: JProfiler 4.2 注冊分析  回復(fù)  更多評論   

          大牛,你好,我最近也在使用jprofiler,在本機(jī)(windows)和linux服務(wù)器上都安裝了,但服務(wù)器老報異常:JProfiler> ERROR: Invalid license key. Aborting.
          但本機(jī)的key是可以用的(當(dāng)然是覆蓋了安裝文件下bin的windows,windows-x86),很奇怪這個異常,你能幫我解決下嗎?我用的都是5.1.2版本的
          email: zhanglidavid@gmail.com
          期待你的解答,謝謝
          2008-10-22 19:24 | 張力

          # re: JProfiler 4.2 注冊分析  回復(fù)  更多評論   

          版本不同了,估計注冊算法變了
          2008-10-22 23:27 | galaxyp

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 塘沽区| 邯郸县| 武强县| 广宗县| 昆明市| 额济纳旗| 清远市| 大同市| 宽甸| 房产| 清水县| 小金县| 苏州市| 赤峰市| 察雅县| 十堰市| 沙湾县| 上杭县| 西吉县| 荆州市| 华池县| 永新县| 唐海县| 砀山县| 万盛区| 本溪| 土默特左旗| 分宜县| 云南省| 开远市| 巨鹿县| 唐山市| 广宗县| 晋中市| 江源县| 平遥县| 加查县| 都江堰市| 同心县| 正阳县| 静安区|