我正在研究一个简单的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"
仍然有效。所以这是我的问题:
如何将javascript代码拆分为更小的函数?我知道编译器基本上是这样做的,但我也看到了一些在线JS美化器,语法高亮显示器能够区分代码并正确地完成它们。我的意思是基本正则表达式可以完成这项工作吗?
这不起作用,它应该:
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}}
为什么?
是否有类似的正在进行的项目?也许我可以得到一些注释或引用它们。
答案 0 :(得分:2)
首先祝贺你在做什么。这有点疯狂,但它几乎是辉煌的。
问题1:
我不知道你怎么能这样做。我花了一些时间思考同样的原则。
问题2:
你的第一个例子不起作用,因为它的第一个调用实际上是a( "2 * 2 = " + x )
,其中x将是第二个调用,所以当第一个调用时,你得到一个NaN
,因为你给了它是String
问题3:
类似的项目?嗯让我想一想......我想每个人都有自己的项目,因为代码是可见的。我不知道的实际来源。
提案:
您可以将方形2D矩阵视为3D Rubik's Cube,这样您可以将其改组并解决它。有趣的是,你可以将一系列动作结合起来,实际上是做某事的重要功能。无论如何,这可能是这种事情的最佳解决方案IMHO将复制然后擦除JS语言的主要对象并将其存储在匿名函数内的复杂图形中,其中没有人可以进入乱码,因为代码是难以理解,我认为这是一种艺术。