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 · 7181 次点击
    这是一个创建于 2482 天前的主题,其中的信息可能已经有所发展或是发生改变。

    地址 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   ·   我们的愿景   ·   实用小工具   ·   955 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 21:49 · PVG 05:49 · LAX 14:49 · JFK 17:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.