美文网首页
【一键启动】IntelliJ IDEA 破解版

【一键启动】IntelliJ IDEA 破解版

作者: Deeglose | 来源:发表于2017-09-28 15:30 被阅读137次

    IntelliJ IDEA 版本

    image.png

    破解工具和原理

    使用代理服务器进行伪装认证,截图如下:

    image.png

    当启动IDEA后,自动发送认证字符串:

    image.png

    一键认证工具

    使用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替代呢?因为我们确实需要版本控制。

    相关文章

      网友评论

          本文标题:【一键启动】IntelliJ IDEA 破解版

          本文链接:https://www.haomeiwen.com/subject/pdtvextx.html