JavaScript混淆器_第1页
JavaScript混淆器_第2页
JavaScript混淆器_第3页
JavaScript混淆器_第4页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Javascript代码混淆的目的1Javascript是一种解释执行的脚本语言,主要应用于Web领域的客户端的浏览 器中;由于Javascript解释执行的特性,代码必须明文下载到客户端,并且可 以很容易的进行调试,使得Javascript代码的保护非常困难;不同的人对Javascript代码的保护有不同的看法;有的人辛苦努力的代码,却 可以被竞争对手轻易获得,他们就非常希望能有保护Javascript代码的方案,但现有的方案可能无法满足他们的要求;很多人认为Javascript语言很简单,Javascript代码没有保护的价值, 可能是他们的代码确实简单, 或者他们并不 了解Javascr

2、ipt语言强大的功能;还有的人认为现在都开源了,还保护代码干 什么,当然开源的人是值得敬佩的,但对别人的代码的开源要求,却不是合理的。为了提高用户的体验, 出现了Web 2.0技术, 并随着AJAX和富界面技术的发 展,Javascript在Web应用上的重要性越来越高,Javascript代码的复杂性、功能和技术含量也越来越高,对Javascript代码保护的需要也越来越迫切。Javascript在线混淆器的目的是为Javascript代码保护的需求,提供一种全新的综合解决方案,包括编码规则和免费的在线混淆器。混淆和加密的区别 很多人将这两者混在一起讨论,实际上两者的目的有一定的区别,采取的

3、手段也 有很大的不同。加密主要是为了防止未经授权的使用,对这种情况即使破解了加密,也只能非法使用,并不一定能获得软件的代码逻辑;但对于脚本来说,防止 对代码进行访问的措施,也属于加密,对这种情况,破解了加密,就获得了代码; 而混淆是在无法阻止他人获取代码的情况下,采取的保护代码的逻辑不被他人理 解的措施;对于混淆的代码,他人很难理解,无法进行修改和重新应用; 对于生成机器码的语言,比如C语言,只需要考虑未经授权的访问,几乎不需 考虑代码的保护;因为对编译后的软件,只能反汇编为汇编语言代码,几乎无法 分析出代码的逻辑。对于生成中间代码的语言,比如Java和C#,即需要考虑未经授权的访问,又 需考

4、虑代码的保护;因为对编译后的软件,可以很容易的反编译为较高级的语 言,从而了解到代码中的逻辑,并较容易的破解加密。而混淆后,即难于理解代 码的逻辑,也不易找到加密点所在。对于脚本语言,比如Javascript,只能混淆,难以加密;因为脚本都是明文存 在的,很容易调试的,通过跟踪可以较容易的破解上面两种目的的加密。但是混淆后的代码是难于理解代码的逻辑的。我们只涉及到对Javascript脚本进行混淆,而不涉及加密;对于涉及到Javascript的系统的加密,我们建议不要将加密点放在Javascript脚本内,而是放在服务端的编译程序内,因为编译程序的加密可以采用更多的保护方式, 加密的强度也更高

5、。2我们首先要分析Javascript语言和混淆相关的特点, 和现有的混淆产品的不足, 然后再提出我们对Javascript代码混淆的解决方案,最后是我们的Javascript在线混淆器。Javascript语言和混淆相关的特性Javascript是一种解释执行的脚本语言,相对编译类型的语言有很多自身的特 性,而其中一些特性会对代码混淆带来很大的困难。无法定义类的属性和方法的名称是否需要被混淆Javascript是一种基于原型的语言,没有严格的类型定义。在自定义的类中, 对于需要外部访问的属性和方法,不能进行混淆;对于内部访问的属性和方法, 需要进行混淆;但Javascript语言本身,无法对

6、属性和方法进行这样的区分。为此我们要寻找一种变通的机制来识别属性和方法的名称是否需要混淆。存在大量的系统定义的核心的和客户端的方法和属性不能被混淆Javascript语言本身定义了大量的核心的类、方法和属性;浏览器中也定义了 大量的客户端的类、方法和属性;这些类、方法和属性都不能够被混淆,然而这 些类、方法和属性的数量太大,无法通过枚举来避免混淆;为此我们需要寻找一 种方法来标识这些类、属性和方法。无法定义全局变量是否需要被混淆 全局变量是window对象的属性,局部变量是函数对象的属性;所有的局部变量 都是可以和应该被混淆的,而全局变量有的需要混淆,有的不能混淆;但全局变 量和局部变量的表现

7、形式是一样的,难以区分;而且全局变量本身更无法定义是 否需要被混淆。为此我们要找到一种方法来区分不能混淆的全局变量,和需要混 淆的全局变量及局部变量。Javascript语言的这些特点,都对代码的混淆带来了很大的困难,如果不解决 这几个问题,Javascript代码的混淆就缺少实用的价值。现有 Javascript混淆产品的问题当我们需要混淆Javascipt代码的时候,首先考察了市面上现有的产品,和一 些论坛里对混淆的思路,但这些产品和思路都不能满足我们的要求。有一个商品化的Javascript混淆产品,采用了和一种C#混淆工具相似的混淆 方式,分析了代码里所有的标识符,对一些系统预设的标识

8、符不混淆, 对其他的 进行混淆,同时提供用户对标识符的混淆进行选择和配置;这个产品的功能很多 很复杂,但有一个很大的问题,就是预设的标识符有限,对于代码中用到的大量 的系统定义的属性和方法,会进行混淆,为此需要自己手工配置,避免对这些属 性和方法的混淆,这对于大型的系统几乎是一个不可能完成的任务。有一些论坛里也讨论到混淆的思路,包括一些示例,这些思路更多的是改变标识3符的表现形式,有的是用编码字符串的关联数组替换属性,比如将xx.dd替换 为xxx64x64;更复杂的是把x64x64之类保存到字符串数组,然后调用字符串数组作为关联数组的下标;这种思路可以避免上面的问题,但有一个更大的问题,就是

9、混淆是可逆的,被混淆的标识符仅仅是被转换成了16进制的形式,可以很容易的恢复。正是现有产品的不足,促使我们不得不研究自己的解决方案。 我们的解决方案也 是经过了几个版本,一开始的版本要复杂的多,花费了很大的工作量,但结果并 不理想;几经修改才找到现有的解决方案; 虽然开始的大量工作,最后几乎都废 弃了,但没有前面的工作,也就没有后面的结果;所以即使您可能会认为我们的 方案简单,那也只是我们努力的结果,而不是过程;而且简单的东西,往往是有 效的。Javascript代码混淆综合解决方案通过前面对Javascript的特性和相关混淆产品的分析,使我们认识到如果仅仅 是在混淆器上下功夫是不够的;因为

10、Javascript语言本身对混淆的功能有很大的限制,无法解决。为此我们设计了一个综合的解决方案,就是Javascript在线混淆器规则,只要是按照规则编写的Javascipt代码,都能使用Javascript在线混淆器混淆进行混淆。Javascript在线混淆器的规则并不复杂,但能够解决Javascript语言本身的 特性和其他混淆产品遇到的问题。规则一、所有用window约束的类、变量和函数都不混淆,其他的类、变量和 函数都混淆。全局的类、变量和函数本身都是window的属性,用不用window约束,从逻辑 的角度是一样的。但我们可以借用window的约束来区分对全局的类、变量和函 数是否

11、需要进行混淆。用window的约束必须是前后一致的,不但包括类、变量和函数的定义,也包括 类、变量和函数的调用。局部的类、变量和函数,因为没有window约束,所以都是混淆的类型混淆不混淆类定义fun cti onClass1 ().wi ndow.Class1 =fun ctio n() .函数定义function Method1 ().wi ndow.Method1=fun cti on() .4变量定义var Param仁1;win dow.Paraml = 1;生成类的实 例var object1 = new Class1 (); var objectl = newwindow.Cla

12、ssl ();函数调用Method1();wi ndow.Methodl ()变量引用var n ewParam = Paraml;var n ewParam = win dow.Paraml;规则二、所有以小写字符开头的属性和方法都不混淆,以其他字母开头的属性 和方法都混淆,用window约束的属性和方法应用规则一。JavaScript核心和客户端中有大量的系统定义的方法和属性不能被混淆,而这 些方法和属性绝大多数都是以小写字母开始的,本规则保证了系统定义的方法和 属性不被混淆。在Javascript客户端中仅有极少数的系统定义的以大写字符起 始的方法和属性,对于这种情况,可以采用关联数组的

13、方式避免被混淆,比如object1Method1();此方法也适用于第三方控件中可能会有的以大写字符起 始的方法和属性的情况。此规则也使我们可以在自定义的类中标识方法和属性是否被混淆, 对于需要外部 调用不能混淆的方法和属性,采用小写字母起始,对于内部的方法和属性,采用 其他字母起始。类型混淆不混淆|类方法定义Classi. Methodi = fun ctio n() .Classi. methodi = function(). Classi Methodi =function().对象方法定义=fun cti on() .=function().Ctotype Metho

14、di= fun ctio n() .类属性定义Classi. Propi = 1;Classi. propi = i; Classi Propi = i;对象属性定义objectl. Propi = i;objecti. propi = i; objecti Propi = i;类方法调用Classi. Methodi();Classi. methodi (); Classi Methodi();对象方法调用objecti. Methodi();objecti. methodi (); objecti Methodi();Javascript在线混淆器的核心规则就是以上两点,另外还有几点说明标

15、识符的混淆采用Hash算法,不可逆Hash算法是不可逆的, 所以不能根据混淆后的标识符, 来直接推出混淆前的标 识符; 但Hash算法依赖于.Net系统的实现,大多数的时候,.Net的Hash算法是不变的,就是同一个标识符的混淆结果是一样的;如果能够枚举足够多的标识符,仍然可能根据相同的混淆结果,知道混淆前的标识符。5如何调用混淆后的类、方法和属性对于混淆代码的内部调用,只要采用相同的规则,要么都混淆,要么都不混淆, 就能正确的调用。对于混淆代码的外部调用,可以有两种方式,一种是不混淆,代码内部采用不混 淆的规则,外部采用不混淆的可理解的标识符调用;另一种是混淆,代码内部采用混淆的规则,外部也

16、采用混淆后的不可理解的标识符调用,但此方式依赖 于.Net Hash算法的实现,在不同版本的.Net实现中的Hash算法有可能不 同,以至混淆后的标识符不一致,从而导致重新混淆后,需要替换原来混淆的标 识符。为何有“清除空格,保留分号后的回车”的选项Javascript语法要求全局函数的结尾必须有分号或回车,如果遗漏了分号,而 又清除了所有的回车,总是提示第一行缺少分号,无法定位错误所在;采用本选 项可以有助于寻找缺少的分号的位置。以下Javascript语言的保留字不混淆break, case, catch, continue, debugger, default, delete, do, else, false, fin ally, for, function, if, i n, in sta nceof, new, nu II, retur n, switch,this, throw, true, try, typeof, var, while, with混淆器预定义了一些window的属性和方法Javascript核心类和函数是不能被混淆的, 他们实质上都是window的属性和 方法, 按照规则应该用window约束,以避免被混淆;但对于Object、Array、Date、Activ

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论