手机
当前位置:查字典教程网 >编程开发 >Javascript教程 >JS脚本混淆、加密讨论第1/2页
JS脚本混淆、加密讨论第1/2页
摘要:新年新气象!好好研究一把自己关心的专项问题。感兴趣的兄弟们请务必踊跃发言。首先,我抛砖引玉了。“混淆”也好,“加密”也好,都是为了加强代码的...

新年新气象!好好研究一把自己关心的专项问题。感兴趣的兄弟们请务必踊跃发言。

首先,我抛砖引玉了。

“混淆”也好,“加密”也好,都是为了加强代码的安全性,防范被人任意查看,在一定程度上保护资源。

请大家注意,在本主题的标题上,我把“混淆”、“加密”这两个概念堆在一起了,为的是从实现目的的角度着眼,从实践的角度着手,不主观地排斥任何手段。所有“混淆”技巧都是为了降低代码的可读性;所有“加密”技巧都是要通过“解密”计算过程将代码还原以后才能执行。

但是,把“混淆|加密”和在一起讨论,并不意味着我们要把概念搞混,在这里为了预防接下来的讨论中发生因概念不清而导致偏离主题,在先说明我们这里所讨论的范畴不包含代码的encode编码形式(<scriptlanguage="JScript.Encode">)。这个既非“混淆”,也非“加密”,而是“编码”,相应的解码过程早为业界所熟悉,因而没有多大的保护意义,最多只是让人多费一道手续而已。当然我们可以把它当作“混淆|加密”的最后一步,目的为了唬住不了解它的人或者让了解的人多费一道手续。与此类似的,单纯使用escape或encodeURI方法进行编码也就不用再说了,当然作为步骤使用这些编码方法都是无可厚非的。

理想的“混淆|加密”应该具有以下特点:

1、没有确定的破解模式;

2、很难编制自动破解程序(只能手工破解);

3、破解过程繁琐、耗时;

4、“混淆|加密”后的代码,比原始代码长度增加少;

容易想象得出,如果没有第4条的限制,那么前三条是很容易实现的,只要疯狂地添加与代码执行部分无关的字符就可以了。

以上四条是最基本的要求。至于“使人眼从主观上感觉混乱”可以认为是第3条的一个实现方式,恢复代码可读性可能是破解过程的主要工作内容之一。

接下来,我希望大家一起来总结一下现有的“混淆|加密”技巧,以作为我们进一步研究的基础。任何个人的见识终归总是有限的,唯有请大家集思广益才能真正有所突破、建树经典。

见过这样一些“混淆|加密”技巧:

1、去除缩进、空行、换行、注释

这个是混淆的基本手段,太基本了,不想多说。可以缩短代码。一般根据“;”所在,恢复换行是最常规的破解技巧。

2、变量名替换

将JavaScript文件中所有的变量名替换为一组合法的随机字符串,使其失去自我描述的能力,从而干扰阅读。

替换方式大概有“缩短”和“改乱”这两种。

举例:http://pub.idr.gov.cn/dujid/projects/jsdisturber/这个是改乱的

有一个叫做JavascriptObfuscator的软件,充斥在大大小小的软件下载站上,各位或许用过也说不定。

这一类的混淆器都有不少的参数可以设定。对此我们不知是该哭还是该笑。

这种技巧对于长而复杂的代码比较有效,也就是可以让原本就难懂的代码变得更难懂。但是对于简短的代码来说就没有什么保护意义了。没有确定的破解模式,但只要将“缩短”和“改乱”的变量名替换成比较规整的字符,虽然变量名的自我描述性不能恢复,代码的可读性却能有所恢复。

3.通过自定义变量名引用JS关键字

例如;vard=document;

接下来的代码中所有的关键字document都用d来替换。

这种技巧可以缩短代码。反方向替换即可还原。

4、通过添加大段大段的空白,把代码前后间隔的很长,从而干扰阅读。

这里添加的空白一般是x00,而不是通常所谓的“空格”(x20)。

复制代码 代码如下:

<html>

<head>

<metahttp-equiv="Content-Language"content="zh-cn">

<metahttp-equiv="Content-Type"content="text/html;charset=gb2312">

<title>网页混淆</title>

<metaname="generator"content="MicrosoftFrontPage4.0">

<metaname=keywordscontent="网页混淆">

<metaname="description"content="网页混淆">

<metahttp-equiv="refresh"content="8;url=http://sage.68ab.com">

<style>A{

FONT-SIZE:12px;COLOR:#000000;TEXT-DECORATION:none

}

A:hover{

COLOR:#ffcc00

}

A.blue{

COLOR:darkblue

}

body,p,td{

FONT-SIZE:12px

}</style>

</head>

<bodystyle="BORDER-RIGHT:#cccccc1pxsolid;BORDER-TOP:#0000001pxsolid;MARGIN:0pt;OVERFLOW:hidden;BORDER-LEFT:#cccccc1pxsolid;BORDER-BOTTOM:#cccccc1pxsolid"bgColor="#F1F2F4"leftMargin="0"topMargin="10">

<divalign="center">

<center>

<p></p>

<p></p>

<tableborder="1"cellpadding="0"cellspacing="0"style="border-collapse:collapse;border-style:dotted;border-width:1"bordercolor="#000000"width="610"height="288"id="AutoNumber1">

<tr>

<tdwidth="610"height="20"bgcolor="#4A4A4A">

<palign="center"><fontcolor="#FFFFFF"> 『网页混淆』

</font></p>

</td>

</tr>

<tr>

<tdwidth="610"height="252"bgcolor="#F1F2F4"valign="top"><br>

网页混淆(<ahref="http://sage.68ab.com">http://sage.68ab.com</a>)<br>

<p> <a></a><i><ahref="http://sage.68ab.com">网页混淆<fontsize="2"><b><fontcolor="#FF0000">!</font><fontcolor="#FFFF00">!</font><fontcolor="#009ACE">!</font></b></font></a></i></p>

</td>

</tr>

<tr>

<tdwidth="610"height="16"bgcolor="#F1F2F4"bordercolor="#008000"><marqueeonmouseover="this.stop()"onmouseout="this.start()"scrollamount="50"scrolldelay="100"behavior="slide"loop="1">

<ahref="http://sage.68ab.com">http://sage.68ab.com </a>

</marquee></td>

</tr>

</table>

<p> </p></center>

</div>

</body>

</html>

把多余的空白批量去除掉就没事了。

5.混眼法

也有两种:

一种是通过利用[]和["、']及变量定义语句来添加与代码功能无关的字符;

另一种就是增添与代码功能无关的运算语句。

下面这段算是一个综合的例子,这是从收藏的老贴上翻来的,不过代码似乎不完整,不能运行。就意思意思吧。

[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]

毫无疑问,从混淆的角度来说,这种技巧可以比较有效地保护相对简短的代码,因为这个方法增加了代码的长度和复杂度。当然,增加长度这一点是比较让人无奈的。如果原始的代码本来就长,混淆以后也许就会长得让人无法容忍了。

6.对原代码进行加密,同时附上解密的代码

运行时先解密,然后通过document.write()或eval()或innerHTML把代码释放出来执行。

像这种类型的,通常加密解密过程可能搞得比较复杂,还加了混淆,但是这一切就像《红楼梦》的判词里唱的那样纯属“枉然”:因为这把代码释放出来执行的最后一步通常就是明码,而且还不加混淆。这就让人不禁想起了那个老生常谈的“木桶原理”,木板箍成的水桶的盛水能力取决于它最短的那片木板,代码加密的保护强度取决于最薄弱的那个环节。

破解时只要把最后这一步的代码改掉就行了,谁会在意他中间过程有多高明、多复杂?

下面演示了一例:

在这里,我在网页里随便添加了一个textarea,名为kc,把document.write(xxx)改成了kc.value=xxx。于是,在代码经解密最后释放出来时没有被执行,而是直接扔进了textarea里。

dY24("xCrXLRlxCr!KH|rlYq%{!aK_Z^[!g]KgKibj^{+`lI9Z^?

【JS脚本混淆、加密讨论第1/2页】相关文章:

Javascript中的Prototype到底是什么

Javascript 小技巧全集第1/4页

Javascript客户端脚本的设计和应用

JQuery实现带排序功能的权限选择实例

自动设为主页

javascript小技巧 超强推荐第1/5页

用NODE.JS中的流编写工具是要注意的事项

Javascript高级应用:文件操作篇

b/s开发常用javaScript技术第1/4页

JS获取当前脚本文件的绝对路径

精品推荐
分类导航