加密解密:JavaScript加密解密的实现方法



 在做网页时(其实是网页木马呵呵)最让人烦恼是自己辛辛苦苦写出来客户端IE运行javascript代码常常被别人轻易拷贝实在让自己心里有点不是滋味要知道自己写点东西也挺累......^*^

  但我们也应该清楚地认识到javascript代码是在IE中解释执行要想绝对保密是不可能我们要做就是尽可能增大拷贝者复制难度让他知难而退(但愿~!~)下面我结合自己这几年来实战及个人研究心得体会和大家起来探讨下网页中javascript代码加密解密技术

  以加密下面javascript代码为例:

<SCRIPTLANGUAGE=\"javascript\">
alert(\"我爱\");
</SCRIPT>

  :最简单加密解密

  大家对于javascriptescape和unescape想必是比较了解啦(很多网页加密在用它们)分别是编码和解码比如例子代码用escape加密后变为如下格式:

alert%28%22%u9ED1%u5BA2%u9632%u7EBF%22%29%3B

  如何?还看懂吗?当然其中ASCII\"alert\"并没有被加密如果愿意我们可以写点javascript代码重新把它加密如下:

%61%6C%65%72%74%28%22%u9ED1%u5BA2%u9632%u7EBF%22%29%3B

  呵呵!如何?这次是完全都加密了!

  当然这样加密后代码是不能直接运行幸好还有eval(codeString)可用这个作用就是检查javascript代码并执行必选项codeString参数是包含有效javascript代码串值加上上面解码unescape加密后结果如下:

<SCRIPTLANGUAGE=\"javascript\">
varcode=unescape(\"%61%6C%65%72%74%28%22%u9ED1%u5BA2%u9632%u7EBF%22%29%3B\");
eval(code)
</SCRIPT>
  是不是很简单?不要高兴解密也就同样简单解密代码都摆给别人啦(unescape)!呵呵

   2:转义\"\"妙用

  大家可能对转义\"\"不太熟悉但对于javascript提供了些特殊如:n(换行)、r(回车)、’(单引号)等应该是有所了解吧?其实\"\"后面还可以跟 8进制或十 6进制数字\"a\"则可以表示为:\"141\"或\"x61\"(注意是小写\"x\")至于双字节如汉字\"黑\"则仅能用十 6进制表示为\"u9ED1\"(注意是小写\"u\")其中\"u\"表示是双字节根据这个原理例子代码则可以表示为:
   8进制转义串如下:
<SCRIPTLANGUAGE=\"javascript\">
eval(\"1411541451621645042u9ED1u5BA2u9632u7EBF425173\")
</SCRIPT>
  十 6进制转义串如下:
<SCRIPTLANGUAGE=\"javascript\">
eval(\"x61x6Cx65x72x74x28x22u9ED1u5BA2u9632u7EBFx22x29x3B\")
</SCRIPT>
  这次没有了解码javascript执行时会自行转换同样解码也是很简单如下:
<SCRIPTLANGUAGE=\"javascript\">
alert(\"x61x6Cx65x72x74x28x22u9ED1u5BA2u9632u7EBFx22x29x3B\")
</SCRIPT>
  就会弹出对话框告诉你解密后结果!

   3:使用Microsoft出品脚本编码器ScriptEncoder来进行编码

  工具使用就不多介绍啦!我是直接使用javascriptControl控件Scripting.Encoder完成编码!代码如下:
<SCRIPTLANGUAGE=\"javascript\">
varSenc=ActiveXObject(\"Scripting.Encoder\"); [Page]
varcode=’<SCRIPTLANGUAGE=\"javascript\">rnalert(\"我爱\");rn</SCRIPT>’;
varEncode=Senc.EncodeScriptFile(\".htm\",code,0,\"\");
alert(Encode);
</SCRIPT>
  编码后结果如下:
<SCRIPTLANGUAGE=\"JScript.Encode\">#@~^FgAAAA@#@&lsDD`J黑客防线r#p@#@&FgMAAA^#~@</SCRIPT>
  够难看懂得吧?但相应解密工具早已出来而且连解密网页都有!其解密网页代码过多我就不多说拉!给大家介绍下我独创解密代码如下:
<SCRIPTLANGUAGE=\"JScript.Encode\">
functiondecode
alert(decode.toString);
</SCRIPT>
  咋样?够简单吧?它是原理是:编码后代码运行前IE会先对其进行解码如果我们先把加密代码放入个自定义如上面decode然后对自定义decodetoString思路方法得到将是解码后代码!
  如果你觉得这样编码得到代码LANGUAGE属性是JScript.Encode很容易让人识破那么还有个几乎不为人知window对象思路方法execScript其原形为:
  window.execScript(sExpression,sLanguage)
  参数:

sExpression: 必选项串(String)要被执行代码

sLanguage : 必选项串(String)指定执行代码语言默认值为MicrosoftJScript

使用时前面\"window\"可以省略不写!
  利用它我们可以很好运行编码后javascript代码如下:
<SCRIPTLANGUAGE=\"javascript\">
execScript(\"#@~^FgAAAA@#@&lsDD`J我爱起r#p@#@&FgMAAA^#~@\",\"JScript.Encode\")
</SCRIPT>
  你可以利用思路方法 2对其中\"\"号内串再进行编码使得\"JScript.Encode\"以及编码特征码\"#@~^\"不出现效果会更好!
   4:任意添加NUL空(十 6进制00H)

  次偶然实验使我发现在HTML网页中任意位置添加任意个数\"空\"IE照样会正常显示其中内容并正常执行其中javascript代码而添加\"空\"我们在用编辑器查看时会显示形如空格或黑块使得原码很难看懂如用记事本查看则\"空\"会变成\"空格\"利用这个原理加密结果如下:(其中显示\"空格\"代表\"空\")
<SCRIPTLANGUAGE=\"JavaScript\">


alert(\"我爱起\");
</SCRIPT>
  如何?是不是显得乱 7 8糟?如果不知道思路方法人很难想到要去掉里面\"空\"(00H)

   5:无用内容混乱以及换行空格TAB大法

  在javascript代码中我们可以加入大量无用串或数字以及无用代码和注释内容等等使真正有用代码埋没在其中并把有用代码中能加入换行、空格、TAB地方加入大量换行、空格、TAB并可以把正常串用\"\"来进行换行这样就会使得代码难以看懂!如我加密后形式如下: [Page]
<SCRIPTLANGUAGE=\"javascript\">
\"xajgxsadffgds\";1234567890
625623216;var$=0;alert//@$%%&*(&(^%^
//cctvfunction//
(//hhsaasajxxc
/*
asjgdsgu*/
\"我爱起\"//ashjgfgf
/*
@#%$^&%$96667r45fggbhytjty
*/
//window
)
;\"#@$#%@#432hu\";212351436
</SCRIPT>
  至少如果我看到这样代码是不会有心思去分析它你哪?

   6:自写解密

  这个思路方法和、 2差不多只不过是自己写个对代码进行解密很多VBS病毒使用这种思路方法对自身进行加密来防止特征码扫描!下面是我写个简单加密解密加密代码如下(详细参照文件\"加密.htm\"):
<SCRIPTLANGUAGE=\"javascript\">
functioncompile(code)
{
varc=String.fromCharCode(code.charCodeAt(0)+code.length);
for(vari=1;i<code.length;i)
alert(escape(c));
}
compile(’alert(\"我爱\");’)
</SCRIPT>
  运行得到加密结果为:
o%CD%D1%D7%E6%9CJ%u9EF3%uFA73%uF1D4%u14F1%u7EE1Kd
  相应加密后解密代码如下:
<SCRIPTLANGUAGE=\"javascript\">
functionuncompile(code)
{
code=unescape(code);
varc=String.fromCharCode(code.charCodeAt(0)-code.length);
for(vari=1;i<code.length;i)
c;
}
eval(uncompile(\"o%CD%D1%D7%E6%9CJ%u9EF3%uFA73%uF1D4%u14F1%u7EE1Kd\"));
</SCRIPT>
   7:利用

  利用try{}catch(e){}结构对代码进行测试解密虽然这个想法很好(呵呵夸夸自己)实用性不大我仅给个例子
<SCRIPTLANGUAGE=\"javascript\">
vara=’alert(\"我爱\");’;
varc=\"\";
for(vari=0;i<a.length;i)
alert(c);
//上面是加密代码当然如果真正使用这个思路方法时不会把加密写上
//现在变量c就是加密后代码
//下面t先假设密码为0解密执行
//遇到则把密码加1然后接着解密执行直到正确运行
vard=c;//保存加密后代码
varb=0;//假定密码为0
t;
functiontcatch(e){
c=\"\";
for(vari=0;i<d.length;i)
b1;
t;
//Timeout(\"t\",0);
}
}
</SCRIPT>
Tags:  加密解密软件 加密与解密 加密解密

延伸阅读

最新评论

发表评论