- 浏览: 39302 次
- 性别:
- 来自: 北京
文章分类
最新评论
IDEA破解过程
开场白就不说了,直接切入正题吧。
本破解的前提是安装了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进行反编译,得到的源代码如下:
本破解的前提是安装了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
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年后,卡巴斯基就过期了,将时间调回来后卡巴斯基被锁死,保持过期状态,最后只能重装。所以大家在调系统时间的时候可要考虑周到啊。
发表评论
-
在Java中使用Oracle blob
2005-02-13 22:27 773Oracle中的lob (Large Object)可以存储非 ... -
java.util.StringTokenization
2005-02-13 22:29 642今天室友老七做数据库大作业,其中要实现一个功能,就是输入一个以 ... -
JBuilder 2005中的Servlet mapping
2005-02-13 22:30 699使用JB进行Servlet好像很方便的样子,但是servlet ... -
static与final变量
2005-08-04 12:27 745一、illegal forward refrence 前天写一 ... -
使用策略模式(Strategy)实现多关键字排序
2005-08-04 12:37 791“策略模式”的出现,是为了提供一套相互之间可灵活替换的算法, ... -
Alloy
2005-08-04 13:09 658Alloy look and feel(http:// ... -
IDEA
2005-08-04 13:11 923今天在TSS上看到IntelliJ的IDEA 5.0终于rel ... -
原型模式(Prototype)
2005-08-05 10:54 742一、概述 原型模式属于对象创建模式,通过给出一个原型对象来指明 ... -
适配器模式(Adapter)
2005-08-06 19:39 619一、概述 类的适配器模式把被适配的类的API转换成为目标类的A ... -
A beginners guide to Dependency Injection [转载自TSS]
2005-08-08 22:30 817Scope This article presents a h ... -
Alloy破解过程
2005-08-09 15:42 8691package com.incors.plaf. ... -
接口与Object类的关系?
2005-08-19 13:53 1108今天凌晨coding的时候发现一个很有趣的现象。“Object ... -
缺省适配器模式(Default Adapter)
2005-09-06 12:01 779一、概述 当不需要全部实现适配器接口提供的方法时,可先设计一个 ... -
Object Modeling Strategies (I)
2005-09-08 10:12 590Activities and model components ... -
Joshua Bloch咏Tiger诗八首
2005-09-08 16:59 839“Ease of Development”是J2SE 1.5的 ... -
James Gosling
2005-09-14 22:01 770今天是Java China 2005的最后一天,下午没有去各个 ... -
Object Modeling Strategies (II)
2005-09-19 15:23 622Str#1d. "Invest an Hour&qu ... -
Object Modeling Strategies (III)
2005-09-19 15:26 563Identifying system purpose and ... -
Tomcat 5.5.9 不支持switch(<enum>)?
2005-09-19 18:51 811ServiceExceptionType: package p ... -
“软件危机”时总结的坏的编程习惯——我们是否依旧守着古风?
2005-10-09 14:23 7311、乱用GOTO语句(上下跳转看起来非常方便) 2、大量使用 ...
相关推荐
使用FastRequest,你可以方便地创建、编辑和发送各种HTTP请求,包括GET、POST、PUT、DELETE等常见方法。插件支持添加请求头、设置查询参数、发送JSON或表单数据,还能直接查看响应结果。对于开发者来说,这些功能极...
在开发过程中,为了方便管理和调试Redis数据库,IntelliJ IDEA(简称Idea)提供了多种连接Redis的可视化工具插件,如"Iedis"。这些插件极大地提高了开发者的工作效率,使他们能够直接在IDE中查看和操作Redis数据。 ...
8. 将破解补丁jetbrains-agent.jar拖入IDEA界面,按照提示重启IDEA。 9. 配置助手会提示选择激活方式,这里选择“Activation Code”并通过注册码激活。 10. 重启IDEA后,可以通过"Help" -> "Register"验证激活状态,...
Squaretest插件将使这个过程更加便捷高效。以下是一些关键知识点: 1. **集成测试环境**:Squaretest与IntelliJ IDEA的集成使得在编写和运行测试时无需离开IDE。它提供了一种无缝的工作流,可以快速地创建、编辑和...
Idea 无法访问插件市场终极解决方法,网上查到的有各种方法,试过后不起效,我给他设置的一个自定义的市场,问题解决了
总的来说,JFormDesigner 7.0.3在IntelliJ IDEA中的应用,为Swing GUI开发提供了一种高效且直观的方法,使得开发者能够以更少的精力创造更具吸引力的用户界面。无论是新手还是经验丰富的开发者,都能从中受益,提升...
IDEA是一款广受欢迎的Java开发集成环境,由JetBrains公司开发。Lombok是一个非常实用的Java库,能够通过注解的方式简化代码,自动处理getter、setter、equals、hashCode、toString等常见方法,使得代码更加简洁易读...
7. **集成构建工具**:Maven、Gradle和Ant的集成使得构建和测试过程更加便捷。 8. **插件系统**:丰富的插件库扩展了IDE的功能,满足不同开发者的需求。 总而言之,"ideaIU-2021.1.3.zip"是一个包含IntelliJ IDEA ...
加密过程分为四个主要步骤:异或、替换、线性变换和再次异或,这些步骤重复进行多次,使得破解难度极大。解密过程则是加密过程的逆操作。 在Oracle环境中,我们通常会使用Java编程语言来实现IDEA加密。以下是一般的...
2. **IntelliJ IDEA**: IntelliJ IDEA是Java开发者常用的一款IDE,它拥有强大的代码自动补全、重构和调试功能,还支持诸如Spring、Hibernate等框架的集成,使得开发过程更为高效。 3. **源码软件**: IntelliJ IDEA...
同时,IDE还有代码检查功能,可以在编码过程中实时发现潜在的问题,并提供修复建议。另外,重构工具也是IDE的一大特色,比如提取方法、重命名变量等,这些都能帮助你更安全、高效地修改代码结构。 对于调试,...
安装JRebel插件后,用户在IDEA中编写代码时,可以直接看到对类、方法或者资源文件所做的修改实时生效,无需手动停止、重新启动应用。 **实测IntelliJ IDEA 2017.2 x64可用:** 这表明JRebel 6.3.1版本已经在...
9. **预览功能**:可以在设计过程中实时预览界面效果,确保在编码阶段就能得到预期的界面。 10. **丰富的组件库**:提供大量预定义的组件,包括标准Java Swing组件以及第三方库的组件,满足各种需求。 11. **可...
总结一下,Lombok 是一种简化 Java 开发的工具,而 "idea2019.3+lombok.zip" 压缩包提供了在 IntelliJ IDEA 2019.3 版本中使用 Lombok 的方法。安装 Lombok 插件后,IDE 能够理解和处理 Lombok 注解,从而提升开发...
资源名称暂时避嫌,名称以及操作需要注意。 本资源为IDEA中的插件,插件版本是1.7,如果有使用或者需要使用的,请把插件名称写在评论区供他人了解,谢谢! 插件地址: ...插件详细使用方法自己处理。
它是一个功能强大的Restful API工具包插件,可以根据已有的方法快速生成接口调试用例。它有一个漂亮的界面来完成请求、检查服务器响应、存储你的API请求和导出API请求,该插件能帮助你在IDEA内更快更高效地调试API!...
MybatisX是一款针对IntelliJ IDEA的高效MyBatis开发插件,...总之,MybatisX是IntelliJ IDEA用户在使用MyBatis框架时的得力助手,它通过丰富的特性简化了MyBatis开发过程,提高了开发效率,值得广大开发者尝试和使用。
接下来,我们将深入探讨这款插件的功能、安装方法以及如何自定义你的IDE界面。 1. **插件简介** Material Theme UI 插件旨在改变 IntelliJ IDEA 的默认界面,使其符合 Google 推出的 Material Design 设计规范。...
这个过程可以通过IDEA的插件管理界面完成,选择“卸载”后再搜索并安装2.92版本。安装完成后,重启IDEA,MyBatis Plugin的功能应该可以恢复正常,如自动完成、智能提示、Mapper XML文件的关联等。 值得注意的是,...
"Restful Fast Request - API Buddy"是专为IntelliJ IDEA设计的一款功能强大的HTTP客户端工具,旨在简化API的测试和调试过程。该插件的最新版1.7,已经在实际应用中得到了验证,确保了其稳定性和实用性。下面我们将...