的确,早就有高手提供了完全破解方法http://idea.lanyus.com/,就是把Jetbrains.2.5.3.jar加入到IDEA启动选项vm.options里作为javaagent,让他运行时经过这个agent做代码替换,把取得LicenseData的api替换了。这个方法自然完美,谢谢!
只是有时实在不好意思用这个crack版,原因就不说了...
于是我还是老套路,把试用期限信息删除了,就可以重新试用了。
虽说粗暴的把注册表(Mac下叫defaults)里相关的信息和用户目录/.IntelliJIdea2016.1删除肯定就可以,但是以前的设定就没了,还得重新折腾一下,于是想精确的删除试用期信息,这个比起那些大牛的活儿应该简单太多了吧,于是练练手,
最终结论,共3步。偷偷作怪的就是这第3步。
2016/08/30: Mac上干脆做了个脚本,连options.xml修改都做了,全自动了。
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下,还是零散的搞得。
1. 删除注册表里的试用信息
reg delete HKEY_CURRENT_USER\Software\JavaSoft\Prefs\jetbrains
2. 删除设定目录里的试用证书信息
Windows: (通配符用不了,只好固定写了版本号,临时替换吧)
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,看起来不是直接的时间。
就没搞了。