JavaScript混淆 - 内联常量&重命名公共属性/方法

时间:2013-11-01 22:45:46

标签: javascript obfuscation

是否有任何流行的JavaScript混淆器能够内联常量并重命名对象的公共属性/方法?

var CONST1 = 5;
var CONST2 = 10;

function Test() {
    abc = 123;
    this.xyz = 234;
}

Test.prototype = {
    do_it: function(argX, argY) {
        return (argX + abc) / CONST1 + (argY + this.xyz) / CONST2;
    }
};

document.getElementById("button").onclick = function() {
    x = document.getElementById("x").value;
    y = document.getElementById("y").value;
    alert("Done it: " + new Test().do_it(x, y));
}
  • 我希望CONST1和CONST2有效地消失并将其值内联。

  • 我希望替换/修改所有名称(abc,xyz,Test,do_it,argX,argY)。

  • 我希望混淆器假设外部没有任何东西依赖于我的源中的任何对象/方法/常量名称。

Google Closure或任何其他混淆器可以这样做吗?

2 个答案:

答案 0 :(得分:2)

Google Closure可以完成上述所有操作。他们在http://closure-compiler.appspot.com/home提供了基于网络的用户界面,供您使用自己的代码进行测试。

答案 1 :(得分:1)

是的,Closure Compiler可以在高级编译模式下执行此操作,但需要注释以防止自动删除prototype属性。例如,这个:

var CONST1 = 5;
var CONST2 = 10;

function Test() {
    abc = 123;
    this.xyz = 234;
}

Test.prototype = {
    do_it: function(argX, argY) {
        return (argX + abc) / CONST1 + (argY + this.xyz) / CONST2;
    }
};

注释如下:

var CONST1 = 5;
var CONST2 = 10;

/** @constructor */
function Test() {

abc = 123;
this.xyz = 234;
}

/** @expose */
Test.prototype = {
do_it: function(argX, argY) {
return (argX + abc) / CONST1 + (argY + this.xyz) / CONST2;
}
};

window["Test"] = Test;

然后当它运行时,转换为:

function a() {
  abc = 123;
  this.a = 234;
}
a.prototype = {b:function(b, c) {
  return(b + abc) / 5 + (c + this.a) / 10;
}};
window.Test = a;