关于js混淆闲谈

原创
01/31 16:51
阅读数 577

去年我根据开源工具二开了一个js混淆工具和js混淆还原工具,今天来说说这个混淆工具大体原理和接下来要做的事,目前这个混淆工具混淆结果勉强, 下面是混淆前和混淆后.

//混淆前
function asd(data) {
    booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped";
    booleans = {
        a: {
            b: {
                c: {
                    value: "666666666666666666666666"
                }
            }
        }
    }
    console.log(booleans.a.b.c.value);
    var dddddddd = "aaaaaaaaaaaaaa";
    function dddddd() {
        console.log(dddddddd);
    }
    var add = function(sd) {
        console.log(dddddddd);
    }
    alert(data);
    dddddd();
    add();
    return "";
}
//混淆后
!function(e,
    function _(e) {
        function _() {
            for (var e = ["f8c8"], _ = 682381; ; ) {
                switch (_) {
                case 682381:
                    console[c(a, "__x010599" + e[0], "824c2")](n),
                    _ = 0
                }
                break
            }
        }
        for (var n, o, t = ["e6a0", "7315", "571b", "6165", "a214", "34bc", "5848", "ad5e", "5e6e"], f = 523954; ; ) {
            switch (f) {
            case 242232:
                alert(e),
                f = 893579;
                continue;
            case 265396:
                return c(a, "__x0e740e" + t[0], "1617d");
                f = 0;
                break;
            case 523954:
                booleans = c(a, "__x034586" + t[1], "32b82"),
                f = 979832;
                continue;
            case 436033:
                o(),
                f = 265396;
                continue;
            case 893579:
                _(),
                f = 436033;
                continue;
            case 628951:
                n = c(a, "__x0cd3dc" + t[2], "98af5"),
                f = 629823;
                continue;
            case 810337:
                o = function(e) {
                    var _ = ["f5a2"];
                    console[c(a, "__x0fc3c2" + _[0], "10694")](n)
                }
                ,
                f = 242232;
                continue;
            case 629823:
                f = 810337;
                continue;
            case 979832:
                booleans = {
                    a: {
                        b: {
                            c: {
                                value: c(a, "__x09f361" + t[3], "f6820")
                            }
                        }
                    }
                },
                f = 485749;
                continue;
            case 485749:
                console[c(a, "__x065aae" + t[4], "1c24e")](booleans[c(a, "__x0477b2" + t[5], "1e25d")][c(a, "__x056cdd" + t[6], "32ff5")][c(a, "__x020a5b" + t[7], "b8e32")][c(a, "__x0a2d54" + t[8], "589c4")]),
                f = 628951;
                continue
            }
            break
        }
    }
    e._X_195f5f = a;
    var n = ["4476"];
    _(c(a, "__x0387e9" + n[0], "cf523"))
}(this, function() {
    return this._X_16949a = function(e, c) {
        var a, _, n = "", o = c.length;
        for (_ = 0; _ < e.length; _++)
            a = _ % o,
            n += String.fromCharCode(e.charCodeAt(_) ^ c.charCodeAt(a));
        return n
    }
    ,
    _X_16949a(atob(arguments[0][arguments[1]]), arguments[1])
}, {
    __x0fc3c2f5a2: "MzAf",
    __x010599f8c8: "MzAf",
    __x065aaea214: "MzAf",
    __x0a2d545e6e: "KT4URQQ=",
    __x020a5bad5e: "PA==",
    __x056cdd5848: "PQ==",
    __x0477b234bc: "Pg==",
    __x0e740ee6a0: "",
    __x0345867315: "PDcdU1hRUURFUl9UVis6HExSR0xWVUtSREEwORdTRkdJWUNDXEFZPiYEU1xaQUpZW0BNUTo5HUJPUFxLV1VfVFEjNxFUV1FbRF9EXlBFIzMXX0NIWE1aQ1pBWTojF0BWWklKU1ZXXlszJgRCVkVAUURSV01GPDAIVVc=",
    __x0cd3dc571b: "Pj4ZUQIFUgUCVFZQAz4=",
    __x09f3616165: "aWlOBg9QBQAHAAcAA2lpTgYPUAUABwAH",
    __x0387e94476: "bm1LBAYO"
});

可以根据上面看到,混淆还停留在不算太难的情况,目前混淆工具我做了比较详细的单元测试和整体混淆测试,比如各种正则字符的加密混淆,和常用的开源库,比如vue,jq,等等,混淆后依然快速高效可用, 目前还有几处没有完善

  1. 可以看到里面还有console[****] 和alert() 这个没有处理是考虑到对象调用作用域的情况 ,如果把这些浏览器window自带的这些属性对象 调用头都混淆 就和我们自己写的对象作用域会冲突,这部分留到以后看情况处理,或者可以查表混淆,
  2. 第二点就是字符串的问题,目前没任何问题,目前不支持中文,不过编码一下即可

关于后期优化的,首先是字符串,更改字符串的读取逻辑,换成更强的查表逻辑,字符串储存可以换成unicode码数组,特殊unicode字符四进制压缩,再一点就是混淆逻辑,目前是使用了控制流平坦化,后期要加入递归控制流,调用重定向控制流,等等。

基本上就这些了,目前已有的功能

  1. 智能变量混淆 变量命名+命名压缩
  2. 代码压缩
  3. 优化if和条件表达式
  4. 优化循环
  5. 删除未使用的变量/函数
  6. 变量作用域混淆
  7. 无法还原模式
  8. 链式函数混淆
  9. 链式属性混淆
  10. 对象调用混淆
  11. 数字混淆
  12. 字符串加密
  13. 字符串混淆
  14. 流程平坦化

甚至我这个工具网页的逻辑也是用我这工具混淆的

有兴趣可以留言某种新的混淆方式我会加进去。 最后祝大家双肺纹理走形、分布正常,肺内未见实质性病灶,肺门不大,纵膈居中,心影不大,膈面光整肋膈角锐利。血尿常规正常,CRP正常,核酸检测阴性,鼠年吉祥,数一数二,心有所属,属你最棒!

展开阅读全文
A2D
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部