<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/ DTD/wml_1.1.xml">

<wml>
<head>
<meta http-equiv="cache-control" content="max-age=180,private" />
</head>
<card title="HTML七种加密解密">
<p>
作者:<a href="index.php?action=showuser&amp;userid=1&amp;hash=">admin</a><br />时间:2007-08-25 13:51<br />分类:<a href="index.php?action=list&amp;cid=3&amp;hash=">电脑技术</a><br />内容:
HTML七种加密解密


在做网页时（其实是网页木马呵呵），最让人烦恼的是自己辛辛苦苦写出来的客户端IE运行的JAVASCRIPT代码常常被别人轻易的拷贝，实在让自己的心里有点不是滋味，要知道自己写点东西也挺累的......^*^ 
　　但我们也应该清楚地认识到因为JAVASCRIPT代码是在IE中解释执行，要想绝对的保密是不可能的，我们要做的就是尽可能的增大拷贝者复制的难度，让他知难而退（但愿~!~），下面我结合自己这几年来的实践，及个人研究的心得，和大家一起来探讨一下网页中JAVASCRIPT代码的加密解密技术。 

　　以加密下面的JAVASCRIPT代码为例： 

&lt;SCRIPT LANGUAGE=&quot;JavaScript&quot;&gt; 
alert(&quot;黑客防线&quot;); 
&lt;/SCRIPT&gt; 

　　一：最简单的加密解密 

　　大家对于JAVASCRIPT函数escape()和unescape()想必是比较了解啦（很多网页加密在用它们），分别是编码和解码字符串，比如例子代码用escape()函数加密后变为如下格式： 

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

如何？还看的懂吗？当然其中的ASCII字符&quot;alert&quot;并没有被加密，如果愿意我们可以写点JAVASCRIPT代码重新把它加密如下： 

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

呵呵！如何？这次是完全都加密了！ 

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

&lt;SCRIPT LANGUAGE=&quot;JavaScript&quot;&gt; 
var code=unescape(&quot;%61%6C%65%72%74%28%22%u9ED1%u5BA2%u9632%u7EBF%22%29%3B&quot;); 
eval(code) 
&lt;/SCRIPT&gt; 

是不是很简单？不要高兴，解密也就同样的简单，解密代码都摆给别人啦（unescape()）！呵呵 

　　二：转义字符&quot;&quot;的妙用 

　　大家可能对转义字符&quot;&quot;不太熟悉，但对于JavaScript提供了一些特殊字符如：n （换行）、 r （回车）、' （单引号 ）等应该是有所了解的吧？其实&quot;&quot;后面还可以跟八进制或十六进制的数字，如字符&quot;a&quot;则可以表示为：&quot;141&quot;或&quot;x61&quot;（注意是小写字符&quot;x&quot;），至于双字节字符如汉字&quot;黑&quot;则仅能用十六进制表示为&quot;u9ED1&quot;（注意是小写字符&quot;u&quot;），其中字符&quot;u&quot;表示是双字节字符，根据这个原理例子代码则可以表示为： 

八进制转义字符串如下: 
&lt;SCRIPT LANGUAGE=&quot;JavaScript&quot;&gt; 
eval(&quot;1411541451621645042u9ED1u5BA2u9632u7EBF425173&quot;) 
&lt;/SCRIPT&gt; 

十六进制转义字符串如下: 
&lt;SCRIPT LANGUAGE=&quot;JavaScript&quot;&gt; 
eval(&quot;x61x6Cx65x72x74x28x22u9ED1u5BA2u9632u7EBFx22x29x3B&quot;) 
&lt;/SCRIPT&gt; 

　　这次没有了解码函数，因为JavaScript执行时会自行转换，同样解码也是很简单如下： 

&lt;SCRIPT LANGUAGE=&quot;JavaScript&quot;&gt; 
alert(&quot;x61x6Cx65x72x74x28x22u9ED1u5BA2u9632u7EBFx22x29x3B&quot;) 
&lt;/SCRIPT&gt; 

就会弹出对话框告诉你解密后的结果！ 

　　三：使用Microsoft出品的脚本编码器Script Encoder来进行编码 

　　工具的使用就不多介绍啦！我是直接使用JavaScript调用控件Scripting.Encoder完成的编码！代码如下： 

&lt;SCRIPT LANGUAGE=&quot;JavaScript&quot;&gt; 
var Senc=new ActiveXObject(&quot;Scripting.Encoder&quot;); 
var code='&lt;SCRIPT LANGUAGE=&quot;JavaScript&quot;&gt;rnalert(&quot;黑客防线&quot;);rn&lt;/SCRIPT&gt;'; 
var Encode=Senc.EncodeScriptFile(&quot;.htm&quot;,code,0,&quot;&quot;); 
alert(Encode); 
&lt;/SCRIPT&gt; 

编码后的结果如下： 
&lt;SCRIPT LANGUAGE=&quot;JScript.Encode&quot;&gt;#@~^FgAAAA==@#@&amp;ls DD`J黑客防线r#p@#@&amp;FgMAAA==^#~@&lt;/SCRIPT&gt; 

够难看懂得吧？但相应的解密工具早已出来，而且连解密网页都有！因为其解密网页代码过多，我就不多说拉！给大家介绍一下我独创的解密代码，如下： 

&lt;SCRIPT LANGUAGE=&quot;JScript.Encode&quot;&gt; 
function decode() 
alert(decode.toString()); 
&lt;/SCRIPT&gt; 

咋样？够简单吧？它是原理是：编码后的代码运行前IE会先对其进行解码，如果我们先把加密的代码放入一个自定义函数如上面的decode()中，然后对自定义函数decode调用toString()方法，得到的将是解码后的代码！ 

如果你觉得这样编码得到的代码LANGUAGE属性是JScript.Encode，很容易让人识破，那么还有一个几乎不为人知的window对象的方法execScript()，其原形为： 

window.execScript( sExpression, sLanguage ) 

参数： 
sExpression: 必选项。字符串(String)。要被执行的代码。 
sLanguage　: 必选项。字符串(String)。指定执行的代码的语言。默认值为 Microsoft JScript 

使用时，前面的&quot;window&quot;可以省略不写！ 

利用它我们可以很好的运行编码后的JavaScript代码，如下： 

&lt;SCRIPT LANGUAGE=&quot;JavaScript&quot;&gt; 
execScript(&quot;#@~^FgAAAA==@#@&amp;ls DD`J黑客防线r#p@#@&amp;FgMAAA==^#~@&quot;,&quot;JScript.Encode&quot;) 
&lt;/SCRIPT&gt; 

你可以利用方法二对其中的&quot;&quot;号内的字符串再进行编码，使得&quot;JScript.Encode&quot;以及编码特征码&quot;#@~^&quot;不出现，效果会更好！ 

　　四：任意添加NUL空字符（十六进制00H） 

　　一次偶然的实验，使我发现在HTML网页中任意位置添加任意个数的&quot;空字符&quot;，IE照样会正常显示其中的内容，并正常执行其中的JavaScript 代码，而添加的&quot;空字符&quot;我们在用一般的编辑器查看时，会显示形如空格或黑块，使得原码很难看懂，如用记事本查看则&quot;空字符&quot;会变成&quot;空格&quot;，利用这个原理加密结果如下：（其中显示的&quot;空格&quot;代表&quot;空字符&quot;） 

&lt;S C RI P T L ANG U A G E =&quot; J a v a S c r i p t &quot;&gt; 

a l er t (&quot; 黑 客 防 线&quot;) ; 

&lt; / SC R I P T&gt; 
　　 
如何？是不是显得乱七八糟的？如果不知道方法的人很难想到要去掉里面的&quot;空字符&quot;（00H）的！ 

　　五：无用内容混乱以及换行空格TAB**** 

　　在JAVASCRIPT代码中我们可以加入大量的无用字符串或数字，以及无用代码和注释内容等等，使真正的有用代码埋没在其中，并把有用的代码中能加入换行、空格、TAB的地方加入大量换行、空格、TAB，并可以把正常的字符串用&quot;&quot;来进行换行，这样就会使得代码难以看懂！如我加密后的形式如下： 

&lt;SCRIPT LANGUAGE=&quot;JavaScript&quot;&gt; 
&quot;xajgxsadffgds&quot;;1234567890 
625623216;var $=0;alert//@$%%&amp;*()(&amp;(^%^ 
//cctv function// 
(//hhsaasajx xc 
/* 
asjgdsgu*/ 
&quot;黑 

客 
防线&quot;//ashjgfgf 
/* 
@#%$^&amp;%$96667r45fggbhytjty 
*/ 
//window 
) 
;&quot;#@$#%@#432hu&quot;;212351436 
&lt;/SCRIPT&gt; 

至少如果我看到这样的代码是不会有心思去分析它的，你哪？ 

　　六：自写解密函数法 

　　这个方法和一、二差不多，只不过是自己写个函数对代码进行解密，很多VBS病毒使用这种方法对自身进行加密，来防止特征码扫描！下面是我写的一个简单的加密解密函数， 

加密代码如下（详细参照文件&quot;加密.htm&quot;）： 
&lt;SCRIPT LANGUAGE=&quot;JavaScript&quot;&gt; 
function compile(code) 
{ 
var c=String.fromCharCode(code.charCodeAt(0)+code.length); 
for(var i=1;i&lt;code.length;i++){ 
c+=String.fromCharCode(code.charCodeAt(i)+code.charCodeAt(i-1)); 
} 
alert(escape(c)); 
} 
compile('alert(&quot;黑客防线&quot;);') 
&lt;/SCRIPT&gt; 

运行得到加密结果为：o%CD%D1%D7%E6%9CJ%u9EF3%uFA73%uF1D4%u14F1%u7EE1Kd 

相应的加密后解密的代码如下： 

&lt;SCRIPT LANGUAGE=&quot;JavaScript&quot;&gt; 
function uncompile(code) 
{ 
code=unescape(code); 
var c=String.fromCharCode(code.charCodeAt(0)-code.length); 
for(var i=1;i&lt;code.length;i++){ 
c+=String.fromCharCode(code.charCodeAt(i)-c.charCodeAt(i-1)); 
} 
return c; 
} 
eval(uncompile(&quot;o%CD%D1%D7%E6%9CJ%u9EF3%uFA73%uF1D4%u14F1%u7EE1Kd&quot;)); 
&lt;/SCRIPT&gt; 

　　七：错误的利用 

　　利用try{}catch(e){}结构对代码进行测试解密，虽然这个想法很好（呵呵，夸夸自己），因为实用性不大，我仅给个例子 

&lt;SCRIPT LANGUAGE=&quot;JavaScript&quot;&gt; 

var a='alert(&quot;黑客防线&quot;);'; 
var c=&quot;&quot;; 
for(var i=0;i&lt;a.length;i++){ 
c+=String.fromCharCode(a.charCodeAt(i)^61);} 

alert(c); 

//上面的是加密代码，当然如果真正使用这个方法时，不会把加密写上的 
//现在变量c就是加密后的代码 

//下面的函数t()先假设初始密码为０，解密执行， 
//遇到错误则把密码加１，然后接着解密执行，直到正确运行 

var d=c; //保存加密后的代码 
var b=0; //假定初始密码为0 
t(); 

function t()catch(e){ 
c=&quot;&quot;; 
for(var i=0;i&lt;d.length;i++){ 
c+=String.fromCharCode(d.charCodeAt(i)^b);} 
b+=1; 
t(); 
//setTimeout(&quot;t()&quot;,0); 
} 
} 
&lt;/SCRIPT&gt; 
</p><p>
<a href="index.php?action=login&amp;hash=">立即登陆发表评论</a><br />
</p>
<p><a href="index.php?action=list&amp;hash=">返回日志列表</a><br /><a href="index.php?action=index&amp;hash=">返回主页</a></p>
</card>
</wml>
