推荐一个 js 混淆器

2017-06-11 19:14:38 +08:00
 blackmiaool

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

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

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

瞬间恢复正常

毕竟任何形式的混淆,都可以通过 partial evaluation 解决
bumz
2017-06-11 21:51:17 +08:00
SourceMan
2017-06-11 22:12:24 +08:00
没有意义的是吧,压缩一下就可以了,前端没必要混淆
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();
v1024
2017-06-12 07:44:12 +08:00
字符串拆散而已,自己骗自己的“混淆”
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
2017-06-12 09:50:12 +08:00
道高一尺魔高一丈。
bumz
2017-06-12 10:02:02 +08:00
@blackmiaool #10 只能说 closure compiler 不是专为破解这种混淆设计的,所以 partial evaluation 的力度不是很大,为了保障结果正确,有些明明可以做的 constant expansion 并没有做

again, 任何形式的混淆、「加密」(其实只是编码)都可以用 partial evaluation 解决,毕竟你的代码只要能执行,早晚都要原形毕露
voocel
2017-06-12 13:24:55 +08:00
混淆自己用的
blackmiaool
2017-06-12 20:12:29 +08:00
@bumz 没错啦, 混淆都可以通过写程序来还原. 但是普通的混淆很容易通过搜索找到想要的东西然后改改完事. 如果破解者真的有能力自己写个程序把源码破解, 那也没必要这么放啦
blackmiaool
2017-06-12 20:13:13 +08:00
@bumz 没错啦, 混淆都可以通过写程序来还原. 但是普通的混淆很容易通过搜索代码来找到想要的东西然后改改完事. 如果破解者真的有能力自己写个程序把源码破解, 那也没必要这么防啦~
loginbygoogle
2019-04-23 13:45:09 +08:00
我直接调用整个方法就可以了,都不用看具体逻辑

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/367641

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX