- 浏览: 39919 次
- 性别:
- 来自: 北京
-
文章分类
最新评论
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的内容确定入口类:












第一行中的idea.jar即是启动jar包。
用Win RAR打开idea.jar,依次进入com、intellij目录,可发现intellij下包甚多,应该就是IDEA的核心。接下来就是凭运气和“天赋”了,序列号的校验模块就在这些包中,找出来只是时间问题。
最终我把焦点定在com.intellij.licensecommon.license.LicenseDataImpl(LicenseData是个抽象类)。使用DJ Java Decompiler对LicenseDataImpl.class进行反编译,得到的源代码如下:
1
package com.intellij.licensecommon.license;
2
3
import com.intellij.licensecommon.util.*;
4
import java.util.*;
5
6
public 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
}
156
a
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

3

4

5

6

7



8



9

10

11

12

13

14

15



16

17

18

19

20



21

22

23

24

25



26

27

28

29



30

31

32

33

34

35

36

37

38

39



40

41

42

43

44

45



46

47

48

49

50

51

52

53

54



55

56

57

58

59

60

61

62

63

64



65

66

67

68

69

70

71



72

73

74



75

76

77



78

79

80



81

82

83

84



85

86

87

88



89

90

91

92

93



94

95

96

97

98



99

100

101

102

103



104

105

106

107

108



109

110

111

112

113



114

115

116

117

118



119

120

121

122



123

124

125

126



127

128

129

130

131



132

133

134

135

136



137

138

139

140

141



142

143

144

145

146



147

148

149

150



151

152

153

154

155

156

157



158

159

160

161

162

163

164

165

166

167

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