午夜拍鍵驚奇
          子夜 編程 代碼與我同在
          posts - 48,comments - 118,trackbacks - 79
          開場白就不說了,直接切入正題吧。
          本破解的前提是安裝了IDEA 5.0并獲得了30天的評估序列號,即IDEA可以啟動但有30天的時間限制。
          首先根據bin目錄下idea.bat的內容確定入口類:



          SET CLASS_PATH
          =%IDEA_HOME%\lib\idea.jar
          SET CLASS_PATH
          =%CLASS_PATH%;%IDEA_HOME%\lib\openapi.jar
          SET CLASS_PATH
          =%CLASS_PATH%;%IDEA_HOME%\lib\jdom.jar
          SET CLASS_PATH
          =%CLASS_PATH%;%IDEA_HOME%\lib\log4j.jar
          SET CLASS_PATH
          =%CLASS_PATH%;%IDEA_HOME%\lib\extensions.jar
          SET CLASS_PATH
          =%CLASS_PATH%;%IDEA_JDK%\lib\tools.jar


          第一行中的idea.jar即是啟動jar包。
          用Win RAR打開idea.jar,依次進入com、intellij目錄,可發現intellij下包甚多,應該就是IDEA的核心。接下來就是憑運氣和“天賦”了,序列號的校驗模塊就在這些包中,找出來只是時間問題。
          最終我把焦點定在com.intellij.licensecommon.license.LicenseDataImpl(LicenseData是個抽象類)。使用DJ Java Decompiler對LicenseDataImpl.class進行反編譯,得到的源代碼如下:

            1package com.intellij.licensecommon.license;
            2
            3import com.intellij.licensecommon.util.*;
            4import java.util.*;
            5
            6public class LicenseDataImpl
            7    extends AbstractLicenseData{
            8  static Date makeDate(int i,int j,int k){
            9    Calendar calendar = GregorianCalendar.getInstance(TimeZone.getTimeZone("Europe/Prague"));
           10    calendar.clear();
           11    calendar.set(i,j,k);
           12    return calendar.getTime();
           13  }

           14
           15  public LicenseDataImpl(String s,String s1){
           16    super(s,s1);
           17    g = null;
           18  }

           19
           20  public LicenseDataImpl(String s,String s1,long l){
           21    super(s,s1,l);
           22    g = null;
           23  }

           24
           25  public String toString(){
           26    return getUserName() + ":" + getKey();
           27  }

           28
           29  public boolean willNeedUpgrade(){
           30    a();
           31    if(g.majorVersion >= 5)
           32      return false;
           33    if(g.generationDate == null)
           34      return true;
           35    else
           36      return a(g.generationDate,FREE_UPGRADE_DATE);
           37  }

           38
           39  private boolean a(Date date,Date date1){
           40    long l = date.getTime();
           41    long l1 = date1.getTime();
           42    return l < l1 - 0xa4cb80L;
           43  }

           44
           45  public boolean needsUpgrade(Date date){
           46    if(date == null)
           47      return false;
           48    if(date.before(DEAD_LINE_DATE))
           49      return false;
           50    else
           51      return willNeedUpgrade();
           52  }

           53
           54  public boolean isEvaluationExpired(Date date){
           55    if(date == null)
           56      return false;
           57    if(!willExpire())
           58      return false;
           59    else
           60      //return date.after(g.expirationDate);
           61      return false;
           62  }

           63
           64  public boolean isValid(){
           65    a();
           66    //return b();
           67
           68    return true;
           69  }

           70
           71  private void a(){
           72    if(b())
           73      return;
           74    try{
           75      g = LicenseDecoder.decodeLicenseKey(getUserName(),getKey());
           76    }

           77    catch(InvalidLicenseKeyException invalidlicensekeyexception){}
           78  }

           79
           80  private boolean b(){
           81    return g != null;
           82  }

           83
           84  public boolean willExpire(){
           85    return getExpirationDate() != null;
           86  }

           87
           88  public Date getExpirationDate(){
           89    a();
           90    return g.expirationDate;
           91  }

           92
           93  public boolean isNonCommercial(){
           94    a();
           95    return g.licenseType == 1;
           96  }

           97
           98  public boolean isCommercial(){
           99    a();
          100    return g.licenseType == 0;
          101  }

          102
          103  public boolean isSite(){
          104    a();
          105    return g.licenseType == 2;
          106  }

          107
          108  public boolean isOpenSource(){
          109    a();
          110    return g.licenseType == 3;
          111  }

          112
          113  public boolean isYearAcademic(){
          114    a();
          115    return g.licenseType == 5;
          116  }

          117
          118  public boolean shouldDetectDuplicates(){
          119    return!isSite() && !willExpire();
          120  }

          121
          122  public Date getUpgradeDeadline(){
          123    return DEAD_LINE_DATE;
          124  }

          125
          126  public boolean isPersonal(){
          127    a();
          128    return g.licenseType == 4;
          129  }

          130
          131  public Date getGenerationDate(){
          132    a();
          133    return g.generationDate;
          134  }

          135
          136  public int getMajorVersion(){
          137    a();
          138    return g.majorVersion;
          139  }

          140
          141  public int getMinorVersion(){
          142    a();
          143    return g.minorVersion;
          144  }

          145
          146  public static LicenseDataImpl create(String s,String s1){
          147    return new LicenseDataImpl(s,s1);
          148  }

          149
          150  public static LicenseDataImpl createFromUser(String s,String s1){
          151    LicenseDataImpl licensedataimpl = new LicenseDataImpl(s,s1);
          152    licensedataimpl.setFromUser(true);
          153    licensedataimpl.setAccepted(false);
          154    return licensedataimpl;
          155  }

          156a
          157  public static LicenseDataImpl create(String s,String s1,long l){
          158    return new LicenseDataImpl(s,s1,l);
          159  }

          160
          161  public static final int CURRENT_MAJOR_VERSION = 5;
          162  public static final int CURRENT_MINOR_VERSION = 0;
          163  public static final Date DEAD_LINE_DATE = makeDate(2005,8,1);
          164  public static final Date FREE_UPGRADE_DATE = makeDate(2005,4,1);
          165  private static final long f = 0xa4cb80L;
          166  public static final String IDEA_VERSION = "IntelliJ IDEA 5";
          167  private LicenseInfo g;
          168}

          169


          順便說一句,對于Alloy來說,IDEA基本沒有做混淆(可能是公共方法太多的原因),因此反編譯后源代碼的可讀性很好,而且反編譯后的源代碼基本可以正確編譯。
          見第60行和66行,原先是調用了兩個方法進行驗證。根據方法名推測isEvaluationExpired()應該是校驗評估序列號是否到期,isValid()則是驗證授權的合法性,這樣只要直接使用boolean常量繞開檢查就行了(第61行和68行)。這樣修改后重新編譯生成新的LicenseDataImpl.class,放回jar包覆蓋原先的class文件就行了。
          最后是驗證。我在我的機器上將時間調到2006年8月,啟動IDEA,雖然界面仍顯示“Expiration date: September, 1, 2005”,但是IDE依然正常工作,破解成功
          補充一句,在驗證時需要了解操作系統中的其它軟件是否對系統時間更改有保護性措施。像在我的機器上將時間調后1年后,卡巴斯基就過期了,將時間調回來后卡巴斯基被鎖死,保持過期狀態,最后只能重裝。所以大家在調系統時間的時候可要考慮周到啊。

          posted on 2005-08-05 19:11 ^ Mustang ^ 閱讀(6161) 評論(13)  編輯  收藏 所屬分類: 破解

          FeedBack:
          # re: IDEA破解過程
          2005-08-05 19:38 | Cinderella
          總是 子夜 編程 代碼與我同在
          會老得很快的
          身體才是革命的本錢  回復  更多評論
            
          # re: IDEA破解過程
          2005-08-05 19:44 | ^ Mustang ^
          我白天睡到很晚啊:)嘿嘿  回復  更多評論
            
          # re: IDEA破解過程
          2005-08-05 19:52 | Cinderella
          那可羨慕ing,竟然不用上班  回復  更多評論
            
          # re: IDEA破解過程
          2005-08-05 20:14 | ^ Mustang ^
          還在讀書:)  回復  更多評論
            
          # re: IDEA破解過程
          2005-08-05 21:11 | anders0913
          不錯,不過有注冊機的說。  回復  更多評論
            
          # re: IDEA破解過程
          2005-08-06 22:30 | 呆呆向前沖的blog
          注冊機在哪?
          給個地址。
          或者 ^ Mustang ^ 兄可不可以做個補丁啊。^_^
            回復  更多評論
            
          # re: IDEA破解過程
          2005-08-06 22:47 | ^ Mustang ^
          我這兒有破解了的class文件(jar太大了,38M),誰要的留個email,我發過去。  回復  更多評論
            
          # re: IDEA破解過程
          2005-08-13 16:09 | 水尤寒
          ^ Mustang ^ 給個破解的CLASS文件
          謝謝了
          我EMAIL:lpp333444@yahoo.com.cn  回復  更多評論
            
          # re: IDEA破解過程
          2005-08-14 02:08 | kkkjjjxxx
          不用這么煩,用idea4.5x版的注冊機就行。  回復  更多評論
            
          # re: IDEA破解過程
          2005-08-22 01:25 | 李超群
          能不能把破解后的class給我呀?另外我想問一下,就是破解后的java文件怎樣再用javac指令編譯,我的會提示找不到所依賴的包。謝謝。
          achilles.lee@gmail.com  回復  更多評論
            
          # re: IDEA破解過程
          2005-11-03 12:02 | 阿里巴巴
          破解了的class文件

          給我也發一個吧

          謝謝了!

          我的email: albb_2223@163.com  回復  更多評論
            
          # re: IDEA破解過程
          2006-11-07 17:19 | CCT
          破解了的class文件
          給我也發一個吧
          謝謝了!

          我的email: s9027059@gmail.com  回復  更多評論
            
          # re: IDEA破解過程
          2007-01-17 17:58 | huhaitao
          破解了的class文件
          給我也發一個吧
          謝謝了!

          email:huhaitao1231@gmail.com  回復  更多評論
            

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

          網站導航:
           
          主站蜘蛛池模板: 临沂市| 射阳县| 丹江口市| 米泉市| 寿宁县| 乐陵市| 禄劝| 西宁市| 镇坪县| 靖西县| 岑溪市| 丽水市| 连城县| 资讯 | 尉氏县| 南丹县| 黑河市| 巴楚县| 清流县| 巍山| 南康市| 夏河县| 抚顺市| 恩施市| 靖边县| 合作市| 长子县| 本溪市| 济阳县| 南城县| 荔浦县| 资中县| 防城港市| 丹棱县| 华池县| 开阳县| 安阳市| 旌德县| 板桥市| 郁南县| 海盐县|