JavaScript黑暗技巧:变异的Eval

在JavaScript开发中,Eval常用在黑暗的领域,隐密执行一些不希望被别人看到的代码。但Eval特征明显,无论实现什么功能,都很容易被直接观察到,引起人们警觉。
w2sfoot - JavaScript黑暗技巧:变异的Eval - 图1
但Eval也可以有变异的形式,比如下面这句,也是Eval,但你能看出它是Email吗?

变异的Eval

  1. window[(14).toString(32)+(31).toString(32)+(10).toString(32)+(21).toString(32)]

执行效果

w2sfoot - JavaScript黑暗技巧:变异的Eval - 图2
这么奇怪的字符串怎么会是Eval呢?

变异Eval的技术原理

  1. Eval()等于window.eval(),
  2. Window.eval()等于window[“eval”],
  3. “eval”这个字符可分解为:window[“e”+”v”+”a”+”l”],
  4. “e”+”v”+”a”+”l”又可写为:(14).toString(32)+(31).toString(32)+(10).toString(32)+(21).toString(32)
  5. 4中的字符是怎么得来的呢?如下:

    1. parseInt("e",36) = 14
    2. parseInt("v",36) = 31
    3. parseInt("a",36) = 10
    4. parseInt("l",36) = 21
  6. 最终eval就变形成了:

    1. window[(14).toString(32)+(31).toString(32)+(10).toString(32)+(21).toString(32)]

    还能正常使用吗?当然。

    试用

    变形之后的Eval()跟之前使用完全一样,例程:

    例1

    1. window[(14).toString(32)+(31).toString(32)+(10).toString(32)+(21).toString(32)]("console.log('test');");

    例2

    1. window[(14).toString(32)+(31).toString(32)+(10).toString(32)+(21).toString(32)]("var a=1;var b=2;var c=3;console.log(a+b+c);");

    执行效果如图:
    w2sfoot - JavaScript黑暗技巧:变异的Eval - 图3

    更进一步变异

    以上,都是手动操作,如果使用专业的手段,如:JShaman,可以得到更好的效果。
    来到JShaman官网平台,对上面的代码进一步混淆:
    w2sfoot - JavaScript黑暗技巧:变异的Eval - 图4
    注意:配置中,选择“成员函数加密”、“数值常量加密”:
    w2sfoot - JavaScript黑暗技巧:变异的Eval - 图5
    然后得到更加变异的代码:
    w2sfoot - JavaScript黑暗技巧:变异的Eval - 图6
    这时的Eval变成了:

    1. window[(771383 ^ 771385)['\x74\x6f\x53\x74\x72\x69\x6e\x67'](130148 ^ 130116) + (992937 ^ 992950)['\x74\x6f\x53\x74\x72\x69\x6e\x67'](495187 ^ 495219) + (252852 ^ 252862)['\x74\x6f\x53\x74\x72\x69\x6e\x67'](708261 ^ 708229) + (319087 ^ 319098)['\x74\x6f\x53\x74\x72\x69\x6e\x67'](455467 ^ 455435)];

    w2sfoot - JavaScript黑暗技巧:变异的Eval - 图7
    谁能认出这竟是个Eval呢?这下,可以放心地用它来做一些不可描述的事情。