此规则也使我们可以在自定义的类中标识方法和属性是否被混淆,对于需要外部调用不能混淆的方法和属性,采用小写字母起始,对于内部的方法和属性,采用其他字母起始。
类型
混淆
不混淆
类方法定义
Class1.Method1 = function(){...}
Class1.method1 = function(){...}
Class1["Method1"] = function(){...}
对象方法定义
Class1.prototype.Method1 = function(){...}
Class1.prototype.method1 = function(){...}
Class1.prototype["Method1"] = function(){...}
类属性定义
Class1.Prop1 = 1;
Class1.prop1 = 1;
Class1["Prop1"] = 1;
对象属性定义
object1.Prop1 = 1;
object1.prop1 = 1;
object1["Prop1"] = 1;
类方法调用
Class1.Method1();
Class1.method1 ();
Class1["Method1"]();
对象方法调用
object1.Method1();
object1.method1 ();
object1["Method1"]();
Javascript 在线混淆器的核心规则就是以上两点,另外还有几点说明。
标识符的混淆采用 Hash 算法,不可逆
Hash 算法是不可逆的,所以不能根据混淆后的标识符,来直接推出混淆前的标识符;但 Hash 算法依赖于 .Net 系统的实现,大多数的时候,.Net 的 Hash 算法是不变的,就是同一个标识符的混淆结果是一样的;如果能够枚举足够多的标识符,仍然可能根据相同的混淆结果,知道混淆前的标识符。
如何调用混淆后的类、方法和属性
对于混淆代码的内部调用,只要采用相同的规则,要么都混淆,要么都不混淆,就能正确的调用。
对于混淆代码的外部调用,可以有两种方式,一种是不混淆,代码内部采用不混淆的规则,外部采用不混淆的可理解的标识符调用;另一种是混淆,代码内部采用混淆的规则,外部也采用混淆后的不可理解的标识符调用,但此方式依赖于 .Net Hash 算法的实现,在不同版本的 .Net 实现中的 Hash 算法有可能不同,以至混淆后的标识符不一致,从而导致重新混淆后,需要替换原来混淆的标识符。
为何有“清除空格,保留分号后的回车”的选项
Javascript 语法要求全局函数的结尾必须有分号或回车,如果遗漏了分号,而又清除了所有的回车,总是提示第一行缺少分号,无法定位错误所在;采用本选项可以有助于寻找缺少的分号的位置。
以下 Javascript 语言的保留字不混淆
break, case, catch, continue, debugger, default, delete, do, else, false, finally, for, function, if, in, instanceof, new, null, return, switch, this, throw, true, try, typeof, var, while, with
混淆器预定义了一些 window 的属性和方法
Javascript 核心类和函数是不能被混淆的,他们实质上都是 window 的属性和方法,按照规则应该用 window 约束,以避免被混淆;但对于 Object、Array、Date、ActiveXObject 等核心类,混淆器已经预定义不会混淆,不需要再用 window 约束。对于 alert 等 window 常用的方法和 document 等 window 常用的客户端属性,也有预定义。其他需要预定义的类和方法,我们会逐步添加;没有预定义的全局类和函数,如果不能混淆,必须用 window 约束。
以下全局的类、变量和方法不混淆
ActiveXObject, alert, Array, Boolean, Date , document, Math, Number, Object, RegExp, String, window
Javascript 在线混淆器
请访问 。