推荐一个 js 混淆器 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a Javascript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
Javascript 权威指南第 5 版
Closure: The Definitive Guide
blackmiaool
V2EX    Javascript

推荐一个 js 混淆器

  •  
  •   blackmiaool 2017-06-11 19:14:38 +08:00 8094 次点击
    这是一个创建于 3118 天前的主题,其中的信息可能已经有所发展或是发生改变。

    地址 https://github.com/blackmiaool/decent-messup

    输入

    const str="abc"; function func(){ const obj={}; obj.property={ key1:'value1', 'key2':str, ['key'+3]:'value3' } console.log(obj); } func(); 

    输出

    const _a = 'vcb3aotkleyr21ugp'; const _b = 'bcktuovea2grp1y3l'; const _c = 'yecauop3rkbltg2v1'; const str = _a[4] + _b[0] + _a[1]; function func() { const _a2 = _b; const _b2 = _a; const _c2 = _c; const obj = {}; obj[_a2[12] + _c2[8] + _c2[5] + _a2[12] + _b2[9] + _c2[8] + _b2[6] + _a2[14]] = { [_b2[7] + _b2[9] + _a2[14] + _b2[13]]: _c2[15] + _c2[3] + _a2[16] + _b2[14] + _c2[1] + _a2[13], [_a2[2] + _c2[1] + _b2[10] + _a2[9]]: str, [_c2[9] + _a2[7] + _a2[14] + 3]: _c2[15] + _c2[3] + _c2[11] + _b2[14] + _a2[7] + _a2[15] }; console[_a2[16] + _c2[5] + _b2[15]](obj); } func(); 

    当时写这个主要是想自己给别人写的脚本不要被篡改内容。这个方案会影响性能,看具体情景使用吧。

    18 条回复    2019-04-23 13:45:09 +08:00
    xyjtou
        1
    xyjtou  
       2017-06-11 19:47:53 +08:00 via Android
    浏览器解析,会有兼容性问题吗?
    blackmiaool
        2
    blackmiaool  
    OP
       2017-06-11 19:55:08 +08:00
    @xyjtou 我自己做了一些测试, 暂未发现兼容性问题. 如果你用了并遇到的话, 可以提 issue, 我会尽力解决
    learnshare
        3
    learnshare  
       2017-06-11 19:55:20 +08:00
    示例代码还是很容易读出来的
    blackmiaool
        4
    blackmiaool  
    OP
       2017-06-11 19:58:26 +08:00
    @learnshare 我这个只负责混淆, 建议之后再 uglify 一下
    prasanta
        5
    prasanta  
       2017-06-11 20:08:14 +08:00 via Android
    假如 python 也能混淆
    wget
        6
    wget  
       2017-06-11 21:48:51 +08:00
    @prasanta 服务器端语言混淆需求没那么高
    bumz
        7
    bumz  
       2017-06-11 21:50:56 +08:00   2
    丢进 closure compiler

    瞬间恢复正常

    毕竟任何形式的混淆,都可以通过 partial evaluation 解决
    bumz
        8
    bumz  
       2017-06-11 21:51:17 +08:00
    SourceMan
        9
    SourceMan  
       2017-06-11 22:12:24 +08:00 via iPhone
    没有意义的是吧,压缩一下就可以了,前端没必要混淆
    blackmiaool
        10
    blackmiaool  
    OP
       2017-06-11 22:44:40 +08:00
    @bumz
    这样的话可以试试这种方案, 在代码里加点其他的东西来防止开头的字符串被认为是常量.

    // ==ClosureCompiler==
    // @output_file_name default.js
    // @compilation_level ADVANCED_OPTIMIZATIONS
    // @formatting pretty_print
    // ==/ClosureCompiler==

    var _a = 'vcb3aotkleyr21ugp';
    var _b = 'bcktuovea2grp1y3l';
    var _c = 'yecauop3rkbltg2v1';
    const str = _a[4] + _b[0] + _a[1];
    function func() {
    const _a2 = _b;
    const _b2 = _a;
    const _c2 = _c;

    const obj = {};
    obj[_a2[12] + _c2[8] + _c2[5] + _a2[12] + _b2[9] + _c2[8] + _b2[6] + _a2[14]] = {
    [_b2[7] + _b2[9] + _a2[14] + _b2[13]]: _c2[15] + _c2[3] + _a2[16] + _b2[14] + _c2[1] + _a2[13],
    [_a2[2] + _c2[1] + _b2[10] + _a2[9]]: str,
    [_c2[9] + _a2[7] + _a2[14] + 3]: _c2[15] + _c2[3] + _c2[11] + _b2[14] + _a2[7] + _a2[15]
    };
    console[_a2[16] + _c2[5] + _b2[15]](obj);
    }
    if(!_c){
    _a="";
    _b="";
    _c="";
    }
    func();
    v1024
        11
    v1024  
       2017-06-12 07:44:12 +08:00 via iPhone
    字符串拆散而已,自己骗自己的“混淆”
    ChiChou
        12
    ChiChou  
       2017-06-12 09:36:21 +08:00
    打开 prepack 的 demo 页面: https://prepack.io/repl.html

    粘贴如下内容:

    (function() {
    const _a = 'vcb3aotkleyr21ugp';
    const _b = 'bcktuovea2grp1y3l';
    const _c = 'yecauop3rkbltg2v1';
    const str = _a[4] + _b[0] + _a[1];
    function func() {
    const _a2 = _b;
    const _b2 = _a;
    const _c2 = _c;

    const obj = {};
    obj[_a2[12] + _c2[8] + _c2[5] + _a2[12] + _b2[9] + _c2[8] + _b2[6] + _a2[14]] = {
    [_b2[7] + _b2[9] + _a2[14] + _b2[13]]: _c2[15] + _c2[3] + _a2[16] + _b2[14] + _c2[1] + _a2[13],
    [_a2[2] + _c2[1] + _b2[10] + _a2[9]]: str,
    [_c2[9] + _a2[7] + _a2[14] + 3]: _c2[15] + _c2[3] + _c2[11] + _b2[14] + _a2[7] + _a2[15]
    };
    console[_a2[16] + _c2[5] + _b2[15]](obj);
    }
    func();
    })();

    看右边输出。
    AlisaDestiny
        13
    AlisaDestiny  
       2017-06-12 09:50:12 +08:00
    道高一尺魔高一丈。
    bumz
        14
    bumz  
       2017-06-12 10:02:02 +08:00
    @blackmiaool #10 只能说 closure compiler 不是专为破解这种混淆设计的,所以 partial evaluation 的力度不是很大,为了保障结果正确,有些明明可以做的 constant expansion 并没有做

    again, 任何形式的混淆、「加密」(其实只是编码)都可以用 partial evaluation 解决,毕竟你的代码只要能执行,早晚都要原形毕露
    voocel
        15
    voocel  
       2017-06-12 13:24:55 +08:00 via Android
    混淆自己用的
    blackmiaool
        16
    blackmiaool  
    OP
       2017-06-12 20:12:29 +08:00
    @bumz 没错啦, 混淆都可以通过写程序来还原. 但是普通的混淆很容易通过搜索找到想要的东西然后改改完事. 如果破解者真的有能力自己写个程序把源码破解, 那也没必要这么放啦
    blackmiaool
        17
    blackmiaool  
    OP
       2017-06-12 20:13:13 +08:00
    @bumz 没错啦, 混淆都可以通过写程序来还原. 但是普通的混淆很容易通过搜索代码来找到想要的东西然后改改完事. 如果破解者真的有能力自己写个程序把源码破解, 那也没必要这么防啦~
    loginbygoogle
        18
    loginbygoogle  
       2019-04-23 13:45:09 +08:00 via Android
    我直接调用整个方法就可以了,都不用看具体逻辑
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     951 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 20:50 PVG 04:50 LAX 12:50 JFK 15:50
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86