最近想试用一个图片放大镜特效,网上(国内)引用最多可能就是名为”Magic Zoom “的jQuery插件了。该插件是商业软件,试用版会在放大框底部或顶部加上一行提示升级到完整版本的提示(Please upgrade to full version of Magic Zoom)。其实该演示版功能是完整的,只是多了这行提示而已。
网上搜了一下,还没发现有人对该组件进行较全面的分析,只找到有人采用暴力的方法去掉那行提示信息。具体做法大家可以到这个地址(http://www.5icool.org/a/201004/379.html)去看,我就省了Ctrl+C And Ctrl+V操作了。
这个组件至今没有人去分析(或者是没分析出来),这勾起了我的兴趣,看看这个JS防盗到底有多强。于是就有了这次分析过程及本文。
首先,从官网下载本组件的DEMO版,打开magiczoom.js,搜索一下”Please upgrade to full version of Magic Zoom“这句话中的关键词,没找到。这在我意料之中,如果这几个词都不藏一下,那还防什么盗啊。
再看整个脚本,外面套了一个eval,那一般来说,eval中间的东西处理后肯定得到一段正常JS脚本,只要想办法把那段脚本给弄出来,基本就算成功了。按照这个思路,把eval暂时去掉,剩下的东西,有一大块是字符串,把那块字符串抽掉,剩下的东西就不多了,整理一下格式,如下:
function(p,a,c,k,e,d){ e=function(c){ return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36)); }; if(!''.replace(/^/,String)){ while(c--){ d[e(c)]=k[c]||e(c); } k=[ function(e){ return d[e] } ]; e=function(){ return'\\w+'; } c=1; }; while(c--){ if(k[c]){ p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]); } } return p; }( STR1, 62,639, STR2.split('|'),0,{});
其中: STR1, STR2就是抽出去的两个长字符串的位置。
分析一下这段代码,就比较清楚了,定义了一个匿名函数,然后传入6个参数执行,得到一个结果,最后由eval方法来执行一下。
接下来,我只要写一段代码,把这个函数返回的结果输出就可以了,我在EditPlus中写了一个HTML页面,把上面函数的执行结果输出到一个textarea:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <title> New Document </title> <meta name="Generator" content="EditPlus"> <meta name="Author" content=""> <meta name="Keywords" content=""> <meta name="Description" content=""> <script language="JavaScript"> <!-- var s1 = <省略>; var s2 = <省略>; function decode(p,a,c,k,e,d){ e=function(c){ return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36)); }; if(!''.replace(/^/,String)){ while(c--){ d[e(c)]=k[c]||e(c); } k=[ function(e){ return d[e]; } ]; e=function(){ return'\\w+'; }; c=1; }; while(c--){ if(k[c]){ p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]); } } return p; } window.onload=function(){ var srcTxt = decode(s1,62,650, s2.split('|'),0,{}); document.all.src.value = srcTxt; } //--> </script> </head> <body> <textarea name="src" rows="20" cols="100"></textarea> </body> </html>
在EditPlus中Ctrl+B,就得到了执行结果,整理一下,就是一段比较清晰的代码了,现在只要找到其中的那句提示语句,再想办法处理掉就完工了。
找那个字符串不算很麻烦的事。记得那行提示文字是红色的粗体字,我就直接找输出红色粗体字的地方,没费什么工夫就找到了:
if(i.indexOf(MagicZoom.x7("coigmzaablav mac"))==-1){
a=["^bko}k.{~i|ojk.za.h{bb.xk|}ga`.ah.Coigm.Taac(-6:6<5","#ff0000",10,"bold","center","100%"];
}
作者对字符串作了加密处理,具体的算法也懒得去分析了,直接把这三行注释掉,再测试一下,提示文字没有了。
=================================
另外再说一句,使用www.xieda.org 的JavaScript Analyser2.0 Alpha版软件直接就可以得到解密后的脚本,跟我手工分析出来的差不多。