Javascript - 如何在每次通话后转发功能并改变目的?

时间:2012-03-30 03:27:49

标签: javascript algorithm obfuscation

我正在研究一个简单的javascript代码混淆器。

假设你有一个NxN javascript函数的二维方阵。对于n = 3:

var m = [
   [function(){return 1}, function(){return 2}, function(){return 3}],
   [function(){return 4}, function(){return 5}, function(){return 6}],
   [function(){return 7}, function(){return 8}, function(){return 9}]
]

现在,在这个例子中,这些函数中的每一个实际上都包含要被混淆的代码中的代码块,并调用它。典型的混淆代码看起来像这样:

(function(){ m[1][2](m[2][0](m[0][1]))(m[1][0])(m[2][2])(m[1][1](m[1][2](m[2][0]))); }());

以上翻译成:

(function(){ 6( 7(2) )( 4 )( 9 )( 5( 6( 7 ) ) ); }());

当然,假设一个典型的m[x][y]返回函数或其他任何必要的东西,这一切都很容易被破译。因此,在每次m[x][y]来电之后,m[x][y]会使用m[x+1][y-1]切换位置,而m[0][2]会在m[x][y]的转弯位置切换,基本上我想将它们混合得那么糟糕你不会'甚至不敢尝试破译。可能使用随机生成的数学,并按功能进行。

关键是混淆器需要预先知道这个公式,因此它知道要调用哪个(function( m[0][0](m[0][0](m[0][0]))(m[0][0]) )),以及在哪个时间点,并决定了函数的顺序。工作实施甚至可能导致:

window.a = function(x){ var r = x*2; window.a =alert; // redefines itself after first call return r; }; a('2 * 2 = ' + a(2)); // doesn't work. it should've alerted "2 * 2 = 4"

仍然有效。所以这是我的问题:

  1. 如何将javascript代码拆分为更小的函数?我知道编译器基本上是这样做的,但我也看到了一些在线JS美化器,语法高亮显示器能够区分代码并正确地完成它们。我的意思是基本正则表达式可以完成这项工作吗?

  2. 这不起作用,它应该:

    var i = 0;
    window.a = function(x){ 
        if(i===1){
            i=0;
            return alert(x); 
        }
    
        i=1;
        return x*2; 
    }; 
    a('2 * 2='+a(2));
    

    另一方面,这确实有效:

    {{1}}

    为什么?

  3. 是否有类似的正在进行的项目?也许我可以得到一些注释或引用它们。

1 个答案:

答案 0 :(得分:2)

首先祝贺你在做什么。这有点疯狂,但它几乎是辉煌的。

问题1:

我不知道你怎么能这样做。我花了一些时间思考同样的原则。

问题2:

你的第一个例子不起作用,因为它的第一个调用实际上是a( "2 * 2 = " + x ),其中x将是第二个调用,所以当第一个调用时,你得到一个NaN,因为你给了它是String

问题3:

类似的项目?嗯让我想一想......我想每个人都有自己的项目,因为代码是可见的。我不知道的实际来源。

提案:

您可以将方形2D矩阵视为3D Rubik's Cube,这样您可以将其改组并解决它。有趣的是,你可以将一系列动作结合起来,实际上是做某事的重要功能。无论如何,这可能是这种事情的最佳解决方案IMHO将复制然后擦除JS语言的主要对象并将其存储在匿名函数内的复杂图形中,其中没有人可以进入乱码,因为代码是难以理解,我认为这是一种艺术。