`
阅读更多
开场白就不说了,直接切入正题吧。
本破解的前提是安装了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年后,卡巴斯基就过期了,将时间调回来后卡巴斯基被锁死,保持过期状态,最后只能重装。所以大家在调系统时间的时候可要考虑周到啊。

分享到:
评论

相关推荐

    FastRequest idea插件免登陆

    使用FastRequest,你可以方便地创建、编辑和发送各种HTTP请求,包括GET、POST、PUT、DELETE等常见方法。插件支持添加请求头、设置查询参数、发送JSON或表单数据,还能直接查看响应结果。对于开发者来说,这些功能极...

    idea连接redis可视化工具插件

    在开发过程中,为了方便管理和调试Redis数据库,IntelliJ IDEA(简称Idea)提供了多种连接Redis的可视化工具插件,如"Iedis"。这些插件极大地提高了开发者的工作效率,使他们能够直接在IDE中查看和操作Redis数据。 ...

    IDEA、方法.docx

    8. 将破解补丁jetbrains-agent.jar拖入IDEA界面,按照提示重启IDEA。 9. 配置助手会提示选择激活方式,这里选择“Activation Code”并通过注册码激活。 10. 重启IDEA后,可以通过"Help" -&gt; "Register"验证激活状态,...

    Squaretest,idea插件

    Squaretest插件将使这个过程更加便捷高效。以下是一些关键知识点: 1. **集成测试环境**:Squaretest与IntelliJ IDEA的集成使得在编写和运行测试时无需离开IDE。它提供了一种无缝的工作流,可以快速地创建、编辑和...

    Idea 无法访问插件市场终极解决方法.rar

    Idea 无法访问插件市场终极解决方法,网上查到的有各种方法,试过后不起效,我给他设置的一个自定义的市场,问题解决了

    JFormDesigner7.0.3intellijidea.zip

    总的来说,JFormDesigner 7.0.3在IntelliJ IDEA中的应用,为Swing GUI开发提供了一种高效且直观的方法,使得开发者能够以更少的精力创造更具吸引力的用户界面。无论是新手还是经验丰富的开发者,都能从中受益,提升...

    2021.2.3idea安装lombok插件方法.zip

    IDEA是一款广受欢迎的Java开发集成环境,由JetBrains公司开发。Lombok是一个非常实用的Java库,能够通过注解的方式简化代码,自动处理getter、setter、equals、hashCode、toString等常见方法,使得代码更加简洁易读...

    ideaIU-2021.1.3.zip

    7. **集成构建工具**:Maven、Gradle和Ant的集成使得构建和测试过程更加便捷。 8. **插件系统**:丰富的插件库扩展了IDE的功能,满足不同开发者的需求。 总而言之,"ideaIU-2021.1.3.zip"是一个包含IntelliJ IDEA ...

    Oracle环境下的IDEA加密方法

    加密过程分为四个主要步骤:异或、替换、线性变换和再次异或,这些步骤重复进行多次,使得破解难度极大。解密过程则是加密过程的逆操作。 在Oracle环境中,我们通常会使用Java编程语言来实现IDEA加密。以下是一般的...

    Ubuntu系统使用的idea-IU-203.7717.56

    2. **IntelliJ IDEA**: IntelliJ IDEA是Java开发者常用的一款IDE,它拥有强大的代码自动补全、重构和调试功能,还支持诸如Spring、Hibernate等框架的集成,使得开发过程更为高效。 3. **源码软件**: IntelliJ IDEA...

    IntelliJ IDEA 使用教程

    同时,IDE还有代码检查功能,可以在编码过程中实时发现潜在的问题,并提供修复建议。另外,重构工具也是IDE的一大特色,比如提取方法、重命名变量等,这些都能帮助你更安全、高效地修改代码结构。 对于调试,...

    jr-ide-idea-6.3.1-idea-13-15附带破解账户

    安装JRebel插件后,用户在IDEA中编写代码时,可以直接看到对类、方法或者资源文件所做的修改实时生效,无需手动停止、重新启动应用。 **实测IntelliJ IDEA 2017.2 x64可用:** 这表明JRebel 6.3.1版本已经在...

    JFormDesigner-7.0.2.4-intellij-idea(改)idea插件

    9. **预览功能**:可以在设计过程中实时预览界面效果,确保在编码阶段就能得到预期的界面。 10. **丰富的组件库**:提供大量预定义的组件,包括标准Java Swing组件以及第三方库的组件,满足各种需求。 11. **可...

    idea2019.3+lombok.zip

    总结一下,Lombok 是一种简化 Java 开发的工具,而 "idea2019.3+lombok.zip" 压缩包提供了在 IntelliJ IDEA 2019.3 版本中使用 Lombok 的方法。安装 Lombok 插件后,IDE 能够理解和处理 Lombok 注解,从而提升开发...

    IDEA Fast xxx Request

    资源名称暂时避嫌,名称以及操作需要注意。 本资源为IDEA中的插件,插件版本是1.7,如果有使用或者需要使用的,请把插件名称写在评论区供他人了解,谢谢! 插件地址: ...插件详细使用方法自己处理。

    idea 插件 Restful Fast Request - API Buddy

    它是一个功能强大的Restful API工具包插件,可以根据已有的方法快速生成接口调试用例。它有一个漂亮的界面来完成请求、检查服务器响应、存储你的API请求和导出API请求,该插件能帮助你在IDEA内更快更高效地调试API!...

    idea插件MybatisX-1.6.1

    MybatisX是一款针对IntelliJ IDEA的高效MyBatis开发插件,...总之,MybatisX是IntelliJ IDEA用户在使用MyBatis框架时的得力助手,它通过丰富的特性简化了MyBatis开发过程,提高了开发效率,值得广大开发者尝试和使用。

    idea插件-Material-Theme-UI

    接下来,我们将深入探讨这款插件的功能、安装方法以及如何自定义你的IDE界面。 1. **插件简介** Material Theme UI 插件旨在改变 IntelliJ IDEA 的默认界面,使其符合 Google 推出的 Material Design 设计规范。...

    mybatis_plugin 2.92 IDEA 2017亲测可用

    这个过程可以通过IDEA的插件管理界面完成,选择“卸载”后再搜索并安装2.92版本。安装完成后,重启IDEA,MyBatis Plugin的功能应该可以恢复正常,如自动完成、智能提示、Mapper XML文件的关联等。 值得注意的是,...

    idea fast XXX Request 2023最新版

    "Restful Fast Request - API Buddy"是专为IntelliJ IDEA设计的一款功能强大的HTTP客户端工具,旨在简化API的测试和调试过程。该插件的最新版1.7,已经在实际应用中得到了验证,确保了其稳定性和实用性。下面我们将...

Global site tag (gtag.js) - Google Analytics