IntelliJ IDEA 版本
破解工具和原理
使用代理服务器进行伪装认证,截图如下:
当启动IDEA后,自动发送认证字符串:
一键认证工具
使用Java开发,过程如下:
先开启认证服务器,然后开启IDEA,当IDEA发送认证字符串之后,服务器可以关闭,这样可以避免占用系统资源。但是在IDEA只需要一天之内认证一次,因此可以使用一个文件来记录是否已经认证过,如果已经认证过了,则直接启动IDEA。
上述认证服务器的执行文件、IDEA的执行文件、配置文件都可以由命令行指定。
最后导出即可
package fulton.util.java_pc.process;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.RandomAccessFile;
import java.util.Calendar;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class StartIntellijIDE {
public static final Logger logger = LogManager.getLogger();
public static void main(String[] args) throws IOException {
if(args.length < 2)
{
logger.info("arguments not enough");
System.out.println("example : StartIntellijIDE server ide [ini]");
return;
}
StartIntellijIDE starter=new StartIntellijIDE();
starter.setServerExe(args[0]);
starter.setIdeExe(args[1]);
if(args.length>=3)
{
logger.info("ini file is specified, default file is overridden");
starter.setStatusFile(args[2]);
}
starter.start();
}
/**
* contains a long & a boolean
*/
public static final String DEFAULT_STATUS_FILE="status.ini";
private String statusFile;
private String serverExe;
private String ideExe;
public StartIntellijIDE()
{
statusFile = DEFAULT_STATUS_FILE;
}
public String getStatusFile() {
return statusFile;
}
public void setStatusFile(String statusFile) {
this.statusFile = statusFile;
}
public String getServerExe() {
return serverExe;
}
public void setServerExe(String serverExe) {
this.serverExe = serverExe;
}
public String getIdeExe() {
return ideExe;
}
public void setIdeExe(String ideExe) {
this.ideExe = ideExe;
}
public static boolean fieldsEqual(Calendar c1,Calendar c2,int...fields)
{
for(int field:fields)
{
if(c1.get(field)!=c2.get(field))return false;
}
return true;
}
public void init()
{
File f=new File(getStatusFile());
if(!f.exists())
{
logger.info("ini file["+getStatusFile()+"] not exits, create it");
try(RandomAccessFile iniFile=new RandomAccessFile(f,"rw"))
{
iniFile.writeLong(0l);
iniFile.writeBoolean(false);
} catch (FileNotFoundException e) { //impossible
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) { //maybe
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void start() throws IOException
{
init();
RandomAccessFile iniFile=new RandomAccessFile(new File(getStatusFile()),"rw");
Calendar date=new Calendar.Builder().setInstant(iniFile.readLong()).build();
Calendar today=Calendar.getInstance();
boolean hasSet=iniFile.readBoolean();
//====IDE Process must be stared
ProcessBuilder pide=new ProcessBuilder(ideExe);
if(fieldsEqual(date, today, Calendar.YEAR,Calendar.MONTH,Calendar.DATE) && hasSet)
{
logger.info("the activation is set, start the ide directly");
pide.start();
finished();
return;
}
logger.info("starting server to wait for activiation");
ProcessBuilder pb=new ProcessBuilder(serverExe);
pb.redirectErrorStream(true);
Process serverProcess=pb.start();
BufferedReader br=new BufferedReader(new InputStreamReader(serverProcess.getInputStream()));
pide.start();
meetRequest(br);
serverProcess.destroyForcibly();
try {
serverProcess.waitFor();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
iniFile.seek(0);
iniFile.writeLong(today.getTimeInMillis());
iniFile.writeBoolean(true);
logger.info("activation finished, ini file written");
finished();
}
public void finished()
{
logger.info("ide started");
logger.info("goodbye.");
}
public static boolean meetRequest(BufferedReader reader)
{
String line=null;
try {
while( (line=reader.readLine())!=null)
{
if(line.contains("buildDate="))
{
logger.info("meetRequest found");
return true;
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
return true;
}
return true;
}
}
无关的后序
写软件一定要保证: 文档是随着软件发布的
因为我感觉到,一个分离的软件和文档总是容易弄丢,到最后,软件还在,文档早就丢失了;软件因此而失去了作用。
软件说明书的组成:标准接口部分
作用:
名称:
用法:
案例[n]:(满足正交性,覆盖场景多)
开发时间:
开发原因:
开发工具:
开发耗时:
版本号:
版本代号:
下一个版本:
发布日期:
环境(将在哪里能够运行):
依赖(由Java的jar包依赖启发,如果依赖已经包含,则注明;没有包含,应当指出在哪里下载,版本号,怎么导入这个依赖):
相关链接:
软件说明书的组成:程序开发部分
开发者(开发者和职责,尽管可能只有一个人开发,但是一个好的想法应该能够考虑更多的情况):
收付者(是谁的需求):
目标客户(潜在的需求):
价格(以RMB计算):
源码链接:
二进制代码链接:
框图和原理:
开发过程记录(记录开发过程中遇到的问题、感想):
版本变迁(增加和移除的功能):
CHANGELOG:
潜在的特性:
这或许是我们开始标准化一切的开始。
思考一点:CHANGELOG是否能够被Git替代呢?因为我们确实需要版本控制。