的确,早就有高手提供了彻底破解方法http://idea.lanyus.com/,就是把Jetbrains.2.5.3.jar加入到IDEA启动选项vm.options里做为javaagent,让他运行时通过这个agent作代码替换,把取得LicenseData的api替换了。这个方法天然完美,谢谢!javascript
只是有时实在很差意思用这个crack版,缘由就不说了...java
因而我仍是老套路,把试用期限信息删除了,就能够从新试用了。api
虽然说粗暴的把注册表(Mac下叫defaults)里相关的信息和用户目录/.IntelliJIdea2016.1删除确定就能够,可是之前的设定就没了,还得从新折腾一下,因而想精确的删除试用期信息,这个比起那些大牛的活儿应该简单太多了吧,因而练练手,bash
最终结论,共3步。偷偷做怪的就是这第3步。网络
2016/08/30: Mac上干脆作了个脚本,连options.xml修改都作了,全自动了。app
defaults delete com.apple.java.util.prefs 2> /dev/null for f in ~/Library/Preferences/jetbrains.*.plist; do if [[ -f $f ]]; then fn=${f##*/}; key=${fn%.plist} echo delete $key from pref and file $f defaults delete "${fn%.plist}" 2>/dev/null && rm "$f" fi done rm -fr ~/Library/Preferences/IntelliJIdea*/eval rm -fr ~/Library/Preferences/WebStorm*/eval rm -fr ~/Library/Preferences/WebIde*/eval rm -fr ~/Library/Preferences/PhpStorm*/eval rm -fr ~/Library/Preferences/CLion*/eval rm -fr ~/Library/Preferences/AppCode*/eval rm -fr ~/Library/Preferences/GoLand*/eval rm -fr ~/Library/Preferences/PyCharm*/eval # echo registred key is here: ~/Library/Preferences/XXX/*.key for f in ~/Library/Preferences/*/options/options.xml; do if [[ -f $f ]] && grep -HF evlsprt "$f"; then echo modify "$f" cp "$f" "$f".bak && grep -vF evlsprt "$f" > "$f".tmp && mv "$f".tmp "$f" && echo removed evlsprt from $f; fi done echo done
而Windows下,仍是零散的搞得。socket
1. 删除注册表里的试用信息ide
reg delete HKEY_CURRENT_USER\Software\JavaSoft\Prefs\jetbrains
2. 删除设定目录里的试用证书信息函数
Windows: (通配符用不了,只好固定写了版本号,临时替换吧)ui
del /s /q "%USERPROFILE%\IntelliJIdea2016.1\config\eval" del /s /q "%USERPROFILE%\WebStorm2016.1\config\eval" del /s /q "%USERPROFILE%\PhpStorm2016.1\config\eval" del /s /q "%USERPROFILE%\CLion2016.1\config\eval" del /s /q "%USERPROFILE%\AppCode2017.3\config\eval"
2016/11/30: 最近WebStorm2016.2.4的期限信息发现放在%USEPROFILE%\.WebStorm2016.2\concig\eval下了。因此得
del /s /q "%USEPROFILE%\.WebStorm2016.2\config\eval"
3. 删除options.xml里的使用期信息。(只需作一次,但一旦升级就重作一次)
<用户目录>/.IntelliJIdea2016.1/config/options.xml文件,删除evalsptr*设定行。 例如:
<property name="evlsprt3.15" value="18" /> <property name="evlsprt.15" value="153d6d7cdad" /> <property name="evlsprt2.15" value="1537a3dd4cd" /> <property name="evlsprt3.16" value="17" /> <property name="evlsprt.16" value="1542158f690" /> <property name="evlsprt2.16" value="153ca04a797" />
对于WebStorm, PhPStorm,得把IntelliJIdea换成相应的名称。
---------------------------------------------------------------
寻找通过也走了些弯路,debug进去查看了bytecode才找到evlsprt*设定的,之前没发现他会使用options.xml里的设定啊。
第一步是要找到那个该死的“过时强制退出对话框”里代码,我打算在Runtime.exit里设定一个断点从而找到调用者。
先是配置vm.options使得容许debug,启动一下IDEA(就算过时了也能够运行几分钟的),Help里有个vm选项配置,执行一下就会打开一个配置文件,加入:
-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8000
运行IDEA, 他会停住,看起来什么都没发生同样,实际它开了个8000端口等待debugger接入。
而后用Eclipse Luna版本+ Bytecode Visualizer插件,随便创建一个Java工程,
加一个Remote Java Applica型的Debug配置,端口号填写成8000。
图片上传限制的太狠,不传了,真烂,看来该换个地方了。
而后就到IntelliJ IDEA安装目录里找到自带的jdk的rt.jar,加入到Java工程的Build Path里,同时把默认的JDK从Build Path里删掉,
而后Navigate到java.lang.Runtime里,其实这就是到了刚才添加的rt.jar里了,
找到exit函数,设定一个断点,注意得正好在函数名称那一行设定断点最好,由于此时rt.jar还没被load进来,只能做为动态函数断点。
而后就运行刚刚配置好的Debug配置,这就经过8000端口接入到等待调试的IDEA进程里了。
而后就让IDEA继续运行,进入试用模式,过几分钟,IDEA会提醒“过时了,必须强制退出”的对话框,按退出按钮,就回进入断点,
这是能够看到调用层次,明显就在一个叫作com.intellij.ide.EvaluationSupport的class里,
因而到IDEA安装目录里寻找这个class的出处,就是编个脚本用unzip -l过滤EvaluationSupport就能够,结果在idea.jar里。
那么把这个idea.jar加入到这个Java工程的Build Path里,就能够进一步调试其中的代码了。
把这个EvaluationSupport的全部method所有设上断点,观察参数值,发现里面明显有包含时间信息的HashMap,key明就叫作evlsprt什么什么的,值就是数字,145开头或者146开头的,例如1465193637467,哦,彷佛记得是十六进制文字列,155什么什么的,反正就像日期。
那拿这个数字到Chrome的javascript console里输入new Date(1465193637467)就能够看出时间是最近的,
这应该就是了,这个时间从哪里来的呢?key文件和注册表信息都删除了,网络也是关闭的,者还能从哪里来的?
后来的弯路就省略了,其实直接用jd-gui打开idea.jar就能获得线索了,这个class里多次试用了evlsprt*关键字,
最终用这个关键字去到IDEA的设定目录 <用户目录>/.IntelliJIdea2016.1 下grep,发现时options.xml,因而去掉之后再试就行了。
要是再花些时间,应该能够搞清这几个evlsprt设定的含义,以及搞清楚evaluation.key文件里内容的加密方式,由于看起来很是简单,就是一个8 byte,0xffffaafeb0e1d82f,-93464110704640,看起来不是直接的时间。
就没搞了。