網上看到JSPlumb這個圖形庫還不錯,它本身提供一個開源版,但是開源版功能比較有限,還提供一個toolkit,這個版本功能比較強大,但是收費。本着學習的目的跟他們要了一個evaluation版本,當然在他們自己的網站demo里也可以自己下載toolkit版本。
下面是一些鏈接,如果不是特殊需求,請盡量使用開源版本:
下載鏈接,里面有開源版和收費版的介紹:https://jsplumbtoolkit.com/download
在線demo地址:https://jsplumbtoolkit.com/demos.html
在線文檔以及API:https://jsplumbtoolkit.com/docs.html
下載鏈接,里面有開源版和收費版的介紹:https://jsplumbtoolkit.com/download
在線demo地址:https://jsplumbtoolkit.com/demos.html
在線文檔以及API:https://jsplumbtoolkit.com/docs.html
如果使用開源版,我找到了兩個比較好的例子和插件,僅供參考:
http://yurigor.com/pan-zoom-jsplumb-dagrejs-jqueryui-draggable/
http://www.cnblogs.com/sggx/p/3836432.html
http://yurigor.com/pan-zoom-jsplumb-dagrejs-jqueryui-draggable/
http://www.cnblogs.com/sggx/p/3836432.html
下面繼續介紹這個evalution版本或者從demo頁面上下載的toolkit版本,都是壓縮過的:
從demo網頁上下載的版本如果直接在本地跑會拋出異常,也就是說這個版本做了一下限制,應該是針對域名的限制。
evalution版本跑起來倒是沒啥問題,但是據我的經驗,應該會針對時間有限制,比如到一定時間搞出幾個alert之類的。
從demo網頁上下載的版本如果直接在本地跑會拋出異常,也就是說這個版本做了一下限制,應該是針對域名的限制。
evalution版本跑起來倒是沒啥問題,但是據我的經驗,應該會針對時間有限制,比如到一定時間搞出幾個alert之類的。
這里我只介紹evalution版本是如何通過代碼做限制的,僅供學習參考:
打開它的壓縮代碼,如果你直接搜索alert,搜出來都是不相關的alert,所以需要自己看代碼,看有什么特別的地方,可以找到下面這段在很多地方重復的代碼,引起了我的注意:
_j = ~[], _j = { ___ : ++_j, $$$$ : (!1 + "")[_j], __$ : ++_j, $_$_ : (!1 + "")[_j], _$_ : ++_j, $_$$ : ({} + "")[_j], $$_$ : (_j[_j] + "")[_j], _$$ : ++_j, $$$_ : (!0 + "")[_j], $__ : ++_j, $_$ : ++_j, $$__ : ({} + "")[_j], $$_ : ++_j, $$$ : ++_j, $___ : ++_j, $__$ : ++_j}, _j.$_ = (_j.$_ = _j + "")[_j.$_$] + (_j._$ = _j.$_[_j.__$]) + (_j.$$ = (_j.$ + "")[_j.__$]) + (!_j + "")[_j._$$] + (_j.__ = _j.$_[_j.$$_]) + (_j.$ = (!0 + "")[_j.__$]) + (_j._ = (!0 + "")[_j._$_]) + _j.$_[_j.$_$] + _j.__ + _j._$ + _j.$, _j.$$ = _j.$ + (!0 + "")[_j._$$] + _j.__ + _j._ + _j.$ + _j.$$, _j.$ = _j.___[_j.$_][_j.$_], _j.$(_j.$(_j.$$ + '"\\' + _j.__$ + _j.$_$ + _j.__$ + _j.$$$$ + "\\" + _j.$__ + _j.___ + "(\\" + _j.__$ + _j.$_$ + _j.$$_ + _j.$$$_ + "\\" + _j.__$ + _j.$$_ + _j.$$$ + "\\" + _j.$__ + _j.___ + "\\" + _j.__$ + _j.___ + _j.$__ + _j.$_$_ + _j.__ + _j.$$$_ + "().\\" + _j.__$ + _j.$__ + _j.$$$ + _j.$$$_ + _j.__ + "\\" + _j.__$ + _j._$_ + _j.$__ + "\\" + _j.__$ + _j.$_$ + _j.__$ + "\\" + _j.__$ + _j.$_$ + _j.$_$ + _j.$$$_ + "()\\" + _j.$__ + _j.___ + ">\\" + _j.$__ + _j.___ + _j.__$ + _j.$__ + _j.$$$ + _j.$___ + _j.$$_ + _j.$$_ + _j.$__ + _j._$$ + _j.$$$ + _j.$_$ + _j.___ + _j.$$$ + _j.__$ + "){" + _j.$_$_ + (!1 + "")[_j._$_] + _j.$$$_ + "\\" + _j.__$ + _j.$$_ + _j._$_ + _j.__ + "('\\" + _j.__$ + _j.$_$ + _j._$_ + "\\" + _j.__$ + _j.$$_ + _j._$$ + "\\" + _j.__$ + _j._$_ + _j.___ + (!1 + "")[_j._$_] + _j._ + "\\" + _j.__$ + _j.$_$ + _j.$_$ + _j.$_$$ + "\\" + _j.$__ + _j.___ + "\\" + _j.__$ + _j._$_ + _j.$__ + _j._$ + _j._$ + (!1 + "")[_j._$_] + "\\" + _j.__$ + _j.$_$ + _j._$$ + "\\" + _j.__$ + _j.$_$ + _j.__$ + _j.__ + "\\" + _j.$__ + _j.___ + _j.$$$_ + "\\" + _j.__$ + _j.$$_ + _j.$$_ + _j.$_$_ + (!1 + "")[_j._$_] + _j._ + _j.$_$_ + _j.__ + "\\" + _j.__$ + _j.$_$ + _j.__$ + _j._$ + "\\" + _j.__$ + _j.$_$ + _j.$$_ + "\\" + _j.$__ + _j.___ + "\\" + _j.__$ + _j.$$_ + _j.___ + _j.$$$_ + "\\" + _j.__$ + _j.$$_ + _j._$_ + "\\" + _j.__$ + _j.$_$ + _j.__$ + _j._$ + _j.$$_$ + "\\" + _j.$__ + _j.___ + _j.$$$_ + "\\" + _j.__$ + _j.$$$ + _j.___ + "\\" + _j.__$ + _j.$$_ + _j.___ + "\\" + _j.__$ + _j.$_$ + _j.__$ + "\\" + _j.__$ + _j.$$_ + _j._$_ + _j.$$$_ + _j.$$_$ + ".');" + _j.__ + "\\" + _j.__$ + _j.$_$ + _j.___ + "\\" + _j.__$ + _j.$$_ + _j._$_ + _j._$ + "\\" + _j.__$ + _j.$$_ + _j.$$$ + "\\" + _j.$__ + _j.___ + "\\" + _j.__$ + _j.$_$ + _j.$$_ + _j.$$$_ + "\\" + _j.__$ + _j.$$_ + _j.$$$ + "\\" + _j.$__ + _j.___ + "\\" + _j.__$ + _j.___ + _j.$_$ + "\\" + _j.__$ + _j.$$_ + _j._$_ + "\\" + _j.__$ + _j.$$_ + _j._$_ + _j._$ + "\\" + _j.__$ + _j.$$_ + _j._$_ + '();}"')())()
評經驗這應該是版本限制的關鍵之處,由於evalution版本能直接跑起來,所以是不是這段代碼,還需要分析。如果是從demo頁上下載的版本,簡單的方法可以直接全文搜索,把這種代碼都去掉,看還會不會報錯,就知道是不是這段代碼做了限制,有興趣的自己去試。
打開它的壓縮代碼,如果你直接搜索alert,搜出來都是不相關的alert,所以需要自己看代碼,看有什么特別的地方,可以找到下面這段在很多地方重復的代碼,引起了我的注意:
_j = ~[], _j = { ___ : ++_j, $$$$ : (!1 + "")[_j], __$ : ++_j, $_$_ : (!1 + "")[_j], _$_ : ++_j, $_$$ : ({} + "")[_j], $$_$ : (_j[_j] + "")[_j], _$$ : ++_j, $$$_ : (!0 + "")[_j], $__ : ++_j, $_$ : ++_j, $$__ : ({} + "")[_j], $$_ : ++_j, $$$ : ++_j, $___ : ++_j, $__$ : ++_j}, _j.$_ = (_j.$_ = _j + "")[_j.$_$] + (_j._$ = _j.$_[_j.__$]) + (_j.$$ = (_j.$ + "")[_j.__$]) + (!_j + "")[_j._$$] + (_j.__ = _j.$_[_j.$$_]) + (_j.$ = (!0 + "")[_j.__$]) + (_j._ = (!0 + "")[_j._$_]) + _j.$_[_j.$_$] + _j.__ + _j._$ + _j.$, _j.$$ = _j.$ + (!0 + "")[_j._$$] + _j.__ + _j._ + _j.$ + _j.$$, _j.$ = _j.___[_j.$_][_j.$_], _j.$(_j.$(_j.$$ + '"\\' + _j.__$ + _j.$_$ + _j.__$ + _j.$$$$ + "\\" + _j.$__ + _j.___ + "(\\" + _j.__$ + _j.$_$ + _j.$$_ + _j.$$$_ + "\\" + _j.__$ + _j.$$_ + _j.$$$ + "\\" + _j.$__ + _j.___ + "\\" + _j.__$ + _j.___ + _j.$__ + _j.$_$_ + _j.__ + _j.$$$_ + "().\\" + _j.__$ + _j.$__ + _j.$$$ + _j.$$$_ + _j.__ + "\\" + _j.__$ + _j._$_ + _j.$__ + "\\" + _j.__$ + _j.$_$ + _j.__$ + "\\" + _j.__$ + _j.$_$ + _j.$_$ + _j.$$$_ + "()\\" + _j.$__ + _j.___ + ">\\" + _j.$__ + _j.___ + _j.__$ + _j.$__ + _j.$$$ + _j.$___ + _j.$$_ + _j.$$_ + _j.$__ + _j._$$ + _j.$$$ + _j.$_$ + _j.___ + _j.$$$ + _j.__$ + "){" + _j.$_$_ + (!1 + "")[_j._$_] + _j.$$$_ + "\\" + _j.__$ + _j.$$_ + _j._$_ + _j.__ + "('\\" + _j.__$ + _j.$_$ + _j._$_ + "\\" + _j.__$ + _j.$$_ + _j._$$ + "\\" + _j.__$ + _j._$_ + _j.___ + (!1 + "")[_j._$_] + _j._ + "\\" + _j.__$ + _j.$_$ + _j.$_$ + _j.$_$$ + "\\" + _j.$__ + _j.___ + "\\" + _j.__$ + _j._$_ + _j.$__ + _j._$ + _j._$ + (!1 + "")[_j._$_] + "\\" + _j.__$ + _j.$_$ + _j._$$ + "\\" + _j.__$ + _j.$_$ + _j.__$ + _j.__ + "\\" + _j.$__ + _j.___ + _j.$$$_ + "\\" + _j.__$ + _j.$$_ + _j.$$_ + _j.$_$_ + (!1 + "")[_j._$_] + _j._ + _j.$_$_ + _j.__ + "\\" + _j.__$ + _j.$_$ + _j.__$ + _j._$ + "\\" + _j.__$ + _j.$_$ + _j.$$_ + "\\" + _j.$__ + _j.___ + "\\" + _j.__$ + _j.$$_ + _j.___ + _j.$$$_ + "\\" + _j.__$ + _j.$$_ + _j._$_ + "\\" + _j.__$ + _j.$_$ + _j.__$ + _j._$ + _j.$$_$ + "\\" + _j.$__ + _j.___ + _j.$$$_ + "\\" + _j.__$ + _j.$$$ + _j.___ + "\\" + _j.__$ + _j.$$_ + _j.___ + "\\" + _j.__$ + _j.$_$ + _j.__$ + "\\" + _j.__$ + _j.$$_ + _j._$_ + _j.$$$_ + _j.$$_$ + ".');" + _j.__ + "\\" + _j.__$ + _j.$_$ + _j.___ + "\\" + _j.__$ + _j.$$_ + _j._$_ + _j._$ + "\\" + _j.__$ + _j.$$_ + _j.$$$ + "\\" + _j.$__ + _j.___ + "\\" + _j.__$ + _j.$_$ + _j.$$_ + _j.$$$_ + "\\" + _j.__$ + _j.$$_ + _j.$$$ + "\\" + _j.$__ + _j.___ + "\\" + _j.__$ + _j.___ + _j.$_$ + "\\" + _j.__$ + _j.$$_ + _j._$_ + "\\" + _j.__$ + _j.$$_ + _j._$_ + _j._$ + "\\" + _j.__$ + _j.$$_ + _j._$_ + '();}"')())()
評經驗這應該是版本限制的關鍵之處,由於evalution版本能直接跑起來,所以是不是這段代碼,還需要分析。如果是從demo頁上下載的版本,簡單的方法可以直接全文搜索,把這種代碼都去掉,看還會不會報錯,就知道是不是這段代碼做了限制,有興趣的自己去試。
分下一下這段代碼,看怎么個過程:
上來使用了一個js中的位操作符~處理了一個空數組,在Chrome中運行,結果是-1,關於~操作符的意義,自己去查吧。這里多說一句,我們經常使用indexOf方法,這個方法會返回-1,在用if判斷時候,還要和-1進行比較,其實可以用這個~操作符像下面這樣寫:
if(~str.indexOf("aaa")){//str.indexOf("aaa")==-1}//這樣寫比較難懂,so不建議這樣搞
接着是對_j變量的賦值,用Chrome運行一下,看結果:
上來使用了一個js中的位操作符~處理了一個空數組,在Chrome中運行,結果是-1,關於~操作符的意義,自己去查吧。這里多說一句,我們經常使用indexOf方法,這個方法會返回-1,在用if判斷時候,還要和-1進行比較,其實可以用這個~操作符像下面這樣寫:
if(~str.indexOf("aaa")){//str.indexOf("aaa")==-1}//這樣寫比較難懂,so不建議這樣搞
接着是對_j變量的賦值,用Chrome運行一下,看結果:
我們看到_j里面的變量已經得到0-9數字以及幾個字符,從代碼中你並沒有看到任何字符,它就得到了“abcdef”,主要是通過下面這種方法得到字符串,然后在通過數組索引提取字符:
(!1+"")=="false"(!0+"")=="true"({}+"")=="[object Object]"還可以通過越界訪問數組的方式得到“undefined”,例如:[][-1]+""_j.$_ = (_j.$_ = _j + "")[_j.$_$] + (_j._$ = _j.$_[_j.__$]) + (_j.$$ = (_j.$ + "")[_j.__$]) + (!_j + "")[_j._$$] + (_j.__ = _j.$_[_j.$$_]) + (_j.$ = (!0 + "")[_j.__$]) + (_j._ = (!0 + "")[_j._$_]) + _j.$_[_j.$_$] + _j.__ + _j._$ + _j.$
上面這段代碼得到了字符串“constructor”,接着
_j.$$ = _j.$ + (!0 + "")[_j._$$] + _j.__ + _j._ + _j.$ + _j.$$,上面這段代碼又得到了字符串“return”
_j.$ = _j.___[_j.$_][_j.$_],//0["constructor"]["constructor"]上面這代碼得到了Function對象,是通過Number對象找到Function對象,原型關系
(!1+"")=="false"(!0+"")=="true"({}+"")=="[object Object]"還可以通過越界訪問數組的方式得到“undefined”,例如:[][-1]+""_j.$_ = (_j.$_ = _j + "")[_j.$_$] + (_j._$ = _j.$_[_j.__$]) + (_j.$$ = (_j.$ + "")[_j.__$]) + (!_j + "")[_j._$$] + (_j.__ = _j.$_[_j.$$_]) + (_j.$ = (!0 + "")[_j.__$]) + (_j._ = (!0 + "")[_j._$_]) + _j.$_[_j.$_$] + _j.__ + _j._$ + _j.$
上面這段代碼得到了字符串“constructor”,接着
_j.$$ = _j.$ + (!0 + "")[_j._$$] + _j.__ + _j._ + _j.$ + _j.$$,上面這段代碼又得到了字符串“return”
_j.$ = _j.___[_j.$_][_j.$_],//0["constructor"]["constructor"]上面這代碼得到了Function對象,是通過Number對象找到Function對象,原型關系
通過得到Function對象就可以運行用字符串表示的代碼了,非常利於使用混淆的字符串進行操作。
最后我們把_j.$看成是Fucntion,看看Function里面是怎么構造的:_j.$$ + '"\\' + _j.__$ + _j.$_$ + _j.__$ + _j.$$$$ + "\\" + _j.$__ + _j.___ + "(\\" + _j.__$ + _j.$_$ + _j.$$_ + _j.$$$_ + "\\" + _j.__$ + _j.$$_ + _j.$$$ + "\\" + _j.$__ + _j.___ + "\\" + _j.__$ + _j.___ + _j.$__ + _j.$_$_ + _j.__ + _j.$$$_ + "().\\" + _j.__$ + _j.$__ + _j.$$$ + _j.$$$_ + _j.__ + "\\" + _j.__$ + _j._$_ + _j.$__ + "\\" + _j.__$ + _j.$_$ + _j.__$ + "\\" + _j.__$ + _j.$_$ + _j.$_$ + _j.$$$_ + "()\\" + _j.$__ + _j.___ + ">\\" + _j.$__ + _j.___ + _j.__$ + _j.$__ + _j.$$$ + _j.$___ + _j.$$_ + _j.$$_ + _j.$__ + _j._$$ + _j.$$$ + _j.$_$ + _j.___ + _j.$$$ + _j.__$ + "){" + _j.$_$_ + (!1 + "")[_j._$_] + _j.$$$_ + "\\" + _j.__$ + _j.$$_ + _j._$_ + _j.__ + "('\\" + _j.__$ + _j.$_$ + _j._$_ + "\\" + _j.__$ + _j.$$_ + _j._$$ + "\\" + _j.__$ + _j._$_ + _j.___ + (!1 + "")[_j._$_] + _j._ + "\\" + _j.__$ + _j.$_$ + _j.$_$ + _j.$_$$ + "\\" + _j.$__ + _j.___ + "\\" + _j.__$ + _j._$_ + _j.$__ + _j._$ + _j._$ + (!1 + "")[_j._$_] + "\\" + _j.__$ + _j.$_$ + _j._$$ + "\\" + _j.__$ + _j.$_$ + _j.__$ + _j.__ + "\\" + _j.$__ + _j.___ + _j.$$$_ + "\\" + _j.__$ + _j.$$_ + _j.$$_ + _j.$_$_ + (!1 + "")[_j._$_] + _j._ + _j.$_$_ + _j.__ + "\\" + _j.__$ + _j.$_$ + _j.__$ + _j._$ + "\\" + _j.__$ + _j.$_$ + _j.$$_ + "\\" + _j.$__ + _j.___ + "\\" + _j.__$ + _j.$$_ + _j.___ + _j.$$$_ + "\\" + _j.__$ + _j.$$_ + _j._$_ + "\\" + _j.__$ + _j.$_$ + _j.__$ + _j._$ + _j.$$_$ + "\\" + _j.$__ + _j.___ + _j.$$$_ + "\\" + _j.__$ + _j.$$$ + _j.___ + "\\" + _j.__$ + _j.$$_ + _j.___ + "\\" + _j.__$ + _j.$_$ + _j.__$ + "\\" + _j.__$ + _j.$$_ + _j._$_ + _j.$$$_ + _j.$$_$ + ".');" + _j.__ + "\\" + _j.__$ + _j.$_$ + _j.___ + "\\" + _j.__$ + _j.$$_ + _j._$_ + _j._$ + "\\" + _j.__$ + _j.$$_ + _j.$$$ + "\\" + _j.$__ + _j.___ + "\\" + _j.__$ + _j.$_$ + _j.$$_ + _j.$$$_ + "\\" + _j.__$ + _j.$$_ + _j.$$$ + "\\" + _j.$__ + _j.___ + "\\" + _j.__$ + _j.___ + _j.$_$ + "\\" + _j.__$ + _j.$$_ + _j._$_ + "\\" + _j.__$ + _j.$$_ + _j._$_ + _j._$ + "\\" + _j.__$ + _j.$$_ + _j._$_ + '();}"'
最后我們把_j.$看成是Fucntion,看看Function里面是怎么構造的:_j.$$ + '"\\' + _j.__$ + _j.$_$ + _j.__$ + _j.$$$$ + "\\" + _j.$__ + _j.___ + "(\\" + _j.__$ + _j.$_$ + _j.$$_ + _j.$$$_ + "\\" + _j.__$ + _j.$$_ + _j.$$$ + "\\" + _j.$__ + _j.___ + "\\" + _j.__$ + _j.___ + _j.$__ + _j.$_$_ + _j.__ + _j.$$$_ + "().\\" + _j.__$ + _j.$__ + _j.$$$ + _j.$$$_ + _j.__ + "\\" + _j.__$ + _j._$_ + _j.$__ + "\\" + _j.__$ + _j.$_$ + _j.__$ + "\\" + _j.__$ + _j.$_$ + _j.$_$ + _j.$$$_ + "()\\" + _j.$__ + _j.___ + ">\\" + _j.$__ + _j.___ + _j.__$ + _j.$__ + _j.$$$ + _j.$___ + _j.$$_ + _j.$$_ + _j.$__ + _j._$$ + _j.$$$ + _j.$_$ + _j.___ + _j.$$$ + _j.__$ + "){" + _j.$_$_ + (!1 + "")[_j._$_] + _j.$$$_ + "\\" + _j.__$ + _j.$$_ + _j._$_ + _j.__ + "('\\" + _j.__$ + _j.$_$ + _j._$_ + "\\" + _j.__$ + _j.$$_ + _j._$$ + "\\" + _j.__$ + _j._$_ + _j.___ + (!1 + "")[_j._$_] + _j._ + "\\" + _j.__$ + _j.$_$ + _j.$_$ + _j.$_$$ + "\\" + _j.$__ + _j.___ + "\\" + _j.__$ + _j._$_ + _j.$__ + _j._$ + _j._$ + (!1 + "")[_j._$_] + "\\" + _j.__$ + _j.$_$ + _j._$$ + "\\" + _j.__$ + _j.$_$ + _j.__$ + _j.__ + "\\" + _j.$__ + _j.___ + _j.$$$_ + "\\" + _j.__$ + _j.$$_ + _j.$$_ + _j.$_$_ + (!1 + "")[_j._$_] + _j._ + _j.$_$_ + _j.__ + "\\" + _j.__$ + _j.$_$ + _j.__$ + _j._$ + "\\" + _j.__$ + _j.$_$ + _j.$$_ + "\\" + _j.$__ + _j.___ + "\\" + _j.__$ + _j.$$_ + _j.___ + _j.$$$_ + "\\" + _j.__$ + _j.$$_ + _j._$_ + "\\" + _j.__$ + _j.$_$ + _j.__$ + _j._$ + _j.$$_$ + "\\" + _j.$__ + _j.___ + _j.$$$_ + "\\" + _j.__$ + _j.$$$ + _j.___ + "\\" + _j.__$ + _j.$$_ + _j.___ + "\\" + _j.__$ + _j.$_$ + _j.__$ + "\\" + _j.__$ + _j.$$_ + _j._$_ + _j.$$$_ + _j.$$_$ + ".');" + _j.__ + "\\" + _j.__$ + _j.$_$ + _j.___ + "\\" + _j.__$ + _j.$$_ + _j._$_ + _j._$ + "\\" + _j.__$ + _j.$$_ + _j.$$$ + "\\" + _j.$__ + _j.___ + "\\" + _j.__$ + _j.$_$ + _j.$$_ + _j.$$$_ + "\\" + _j.__$ + _j.$$_ + _j.$$$ + "\\" + _j.$__ + _j.___ + "\\" + _j.__$ + _j.___ + _j.$_$ + "\\" + _j.__$ + _j.$$_ + _j._$_ + "\\" + _j.__$ + _j.$$_ + _j._$_ + _j._$ + "\\" + _j.__$ + _j.$$_ + _j._$_ + '();}"'
通過Chrome運行可以看到上面這段代碼返回結果是:
return"\151f\40(\156e\167\40\104ate().\147et\124\151\155e()\40>\401478664375071){ale\162t('\152\163\120lu\155b\40\124ool\153\151t\40e\166aluat\151o\156\40\160e\162\151od\40e\170\160\151\162ed.');t\150\162o\167\40\156e\167\40\105\162\162o\162();}"
看上去亂了些,因為使用escape了,我們unescape一下就OK了:
return if (new Date().getTime() > 1478663379071){alert('jsPlumb Toolkit evaluation period expired.');throw new Error();}看到了吧,是不是很巧妙,在這里檢查了時間,如果大於某一時間就alert,並且拋異常。
return"\151f\40(\156e\167\40\104ate().\147et\124\151\155e()\40>\401478664375071){ale\162t('\152\163\120lu\155b\40\124ool\153\151t\40e\166aluat\151o\156\40\160e\162\151od\40e\170\160\151\162ed.');t\150\162o\167\40\156e\167\40\105\162\162o\162();}"
看上去亂了些,因為使用escape了,我們unescape一下就OK了:
return if (new Date().getTime() > 1478663379071){alert('jsPlumb Toolkit evaluation period expired.');throw new Error();}看到了吧,是不是很巧妙,在這里檢查了時間,如果大於某一時間就alert,並且拋異常。
這就是evalution版本的限制,估計demo版本里面肯定是檢查了域名,道理一樣。以上分析過程僅供學習參考,看看js的巧妙使用方法。
注:本人非常反對拿破解的js庫使用在收費或者商業的產品中,請盡量使用開源版本!
---------------------
作者:kittyjie
來源:CSDN
原文:https://blog.csdn.net/kittyjie/article/details/52836281
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
---------------------
作者:kittyjie
來源:CSDN
原文:https://blog.csdn.net/kittyjie/article/details/52836281
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!