的確,早就有高手提供了徹底破解方法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,看起來不是直接的時間。
就沒搞了。