鲁夫的爱

看起来很厉害的 JS 编译器

分类: 前端教程        评论: 11人评论

很久没写东西了, 这次来是想把我写的一个小玩意分享出来.

这东西中文名叫 "看起来很厉害的 JS 编译器", 英文名叫做 The Impressive JS.Segment.Compiler . 它的工作原理是把 JavaScript 源码中的常量和全局变量等提取到一个固定区域 (类似于code segment), 在设计之初就确定了主要方向就是混淆, 编译压缩部分用的是 UglifyJS2 和 Google Closure Compiler.

比如我们用它来编译如下代码:

(function(){
    var log = console.log.bind(console);
    log('a' + 'http://www.test.com/somewhere/somefile?\
param0=data0¶m1=data1');
    log(typeof document);
    var a = new RegExp('aaa');
    log(a);
    var b = [/a/,/a/];
    log(a);
    var c = null;
    log(b);
    log(c==undefined);
})();

编译器得到的结果是:

!function(a,e,o,t,n,r,m,c,d,i){!function(){var l=c[o][r](c);l(e+a),
l(typeof document);var p=new d(t);l(p);var v=[n,n];l(p);var w=m;
l(v),l(w==i)}()}
("http://www.test.com/somewhere/somefile?param0=data0¶m1=data1",
"a","log","aaa",/a/,"bind",null,console,RegExp,void 0);

除了局部变量名找不回来之外, 常量提取部分是可逆的, 只要我们愿意, 完全可以把提取出来的常量再放回去. 那么这样做的意义何在? 大概就是增加代码的不可读性, 以及给逆向工程增加麻烦吧. 笑.

需要注意的一点是这样处理过的代码运行效率会比原始代码更低, 主要是因为 object.member.member 在 JIT 时就能确定, 而 object[member] 则很难由 JIT 优化. 在极端的例子里, 混淆过的代码运行效率只有原始代码的 15% , 比如 Octane benchmark 里的 Richards bench .

一个在线的 demo 是 看起来很厉害的 JS 编译器 .

本站文章除注明转载外,均为本站原创编译
转载请注明以下信息
文章转载自:鲁夫的爱 [ http://opengg.me/ ]
本文标题:看起来很厉害的 JS 编译器
本文地址:http://opengg.me/936/the-impressive-js-segment-compiler/


10-14
2013
  1. 鲁啊啊啊你的网站百度不收录 被屏蔽了 呜呜呜 为了google插件 太让我感动了。。。。。。。。。建议你继续开发,我们可以赞助(一点点)

无觅相关文章插件,快速提升流量

loading...