V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
blackmiaool

推荐一个 js 混淆器

  •  
  •   blackmiaool · Jun 11, 2017 · 8319 views
    This topic created in 3249 days ago, the information mentioned may be changed or developed.

    地址 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 replies    2019-04-23 13:45:09 +08:00
    xyjtou
        1
    xyjtou  
       Jun 11, 2017 via Android
    浏览器解析,会有兼容性问题吗?
    blackmiaool
        2
    blackmiaool  
    OP
       Jun 11, 2017
    @xyjtou 我自己做了一些测试, 暂未发现兼容性问题. 如果你用了并遇到的话, 可以提 issue, 我会尽力解决
    learnshare
        3
    learnshare  
       Jun 11, 2017
    示例代码还是很容易读出来的
    blackmiaool
        4
    blackmiaool  
    OP
       Jun 11, 2017
    @learnshare 我这个只负责混淆, 建议之后再 uglify 一下
    prasanta
        5
    prasanta  
       Jun 11, 2017 via Android
    假如 python 也能混淆
    wget
        6
    wget  
       Jun 11, 2017
    @prasanta 服务器端语言混淆需求没那么高
    bumz
        7
    bumz  
       Jun 11, 2017   ❤️ 2
    丢进 closure compiler

    瞬间恢复正常

    毕竟任何形式的混淆,都可以通过 partial evaluation 解决
    bumz
        8
    bumz  
       Jun 11, 2017
    SourceMan
        9
    SourceMan  
       Jun 11, 2017 via iPhone
    没有意义的是吧,压缩一下就可以了,前端没必要混淆
    blackmiaool
        10
    blackmiaool  
    OP
       Jun 11, 2017
    @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  
       Jun 12, 2017 via iPhone
    字符串拆散而已,自己骗自己的“混淆”
    ChiChou
        12
    ChiChou  
       Jun 12, 2017
    打开 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  
       Jun 12, 2017
    道高一尺魔高一丈。
    bumz
        14
    bumz  
       Jun 12, 2017
    @blackmiaool #10 只能说 closure compiler 不是专为破解这种混淆设计的,所以 partial evaluation 的力度不是很大,为了保障结果正确,有些明明可以做的 constant expansion 并没有做

    again, 任何形式的混淆、「加密」(其实只是编码)都可以用 partial evaluation 解决,毕竟你的代码只要能执行,早晚都要原形毕露
    voocel
        15
    voocel  
       Jun 12, 2017 via Android
    混淆自己用的
    blackmiaool
        16
    blackmiaool  
    OP
       Jun 12, 2017
    @bumz 没错啦, 混淆都可以通过写程序来还原. 但是普通的混淆很容易通过搜索找到想要的东西然后改改完事. 如果破解者真的有能力自己写个程序把源码破解, 那也没必要这么放啦
    blackmiaool
        17
    blackmiaool  
    OP
       Jun 12, 2017
    @bumz 没错啦, 混淆都可以通过写程序来还原. 但是普通的混淆很容易通过搜索代码来找到想要的东西然后改改完事. 如果破解者真的有能力自己写个程序把源码破解, 那也没必要这么防啦~
    loginbygoogle
        18
    loginbygoogle  
       Apr 23, 2019 via Android
    我直接调用整个方法就可以了,都不用看具体逻辑
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2692 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 50ms · UTC 03:20 · PVG 11:20 · LAX 20:20 · JFK 23:20
    ♥ Do have faith in what you're doing.