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

推荐一个 js 混淆器

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

    地址 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();
    

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

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

    瞬间恢复正常

    毕竟任何形式的混淆,都可以通过 partial evaluation 解决
        8
    bumz   2017-06-11 21:51:17 +08:00
        9
    SourceMan   2017-06-11 22:12:24 +08:00 via iPhone
    没有意义的是吧,压缩一下就可以了,前端没必要混淆
        10
    blackmiaool   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();
        11
    v1024   2017-06-12 07:44:12 +08:00 via iPhone
    字符串拆散而已,自己骗自己的“混淆”
        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();
    })();

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

    again, 任何形式的混淆、「加密」(其实只是编码)都可以用 partial evaluation 解决,毕竟你的代码只要能执行,早晚都要原形毕露
        15
    voocel   2017-06-12 13:24:55 +08:00 via Android
    混淆自己用的
        16
    blackmiaool   2017-06-12 20:12:29 +08:00
    @bumz 没错啦, 混淆都可以通过写程序来还原. 但是普通的混淆很容易通过搜索找到想要的东西然后改改完事. 如果破解者真的有能力自己写个程序把源码破解, 那也没必要这么放啦
        17
    blackmiaool   2017-06-12 20:13:13 +08:00
    @bumz 没错啦, 混淆都可以通过写程序来还原. 但是普通的混淆很容易通过搜索代码来找到想要的东西然后改改完事. 如果破解者真的有能力自己写个程序把源码破解, 那也没必要这么防啦~
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1792 人在线   最高记录 3762   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.1 · 22ms · UTC 09:24 · PVG 17:24 · LAX 02:24 · JFK 05:24
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1