常见js混淆

js混淆是把原本可读性比较高的代码,用另外一种或者几种代码进行替换,降低代码的可读性,但是执行效果又等同

常见混淆

  • 字符串转十六进制、unicode编码

    //字符串转ASCII码
    console.log('abc'.charCodeAt(0)) // 97
    console.log('bcd'.charCodeAt(0)) // 98
    
    // ASCII码转字符串
    // 传入不定长参数
    console.log(String.fromCharCode(97, 98)) // 'ab'
    // 传入数组作为参数
    console.log(String.fromCharCode.apply(String, [97, 98])); // 'ab'
    
    // 转十六进制字符串
    function hexEnc(code) {
        for (var hexStr = '', i = 0; i < code.length; i++) {
            hexStr += '\\x' + ('0' + code.charCodeAt(i).toString(16)).substr(-2)
        }
        return hexStr
    }
    console.log(hexEnc('yyy-MM-dd')) // \x79\x79\x79\x2d\x4d\x4d\x2d\x64\x64
    
    // 转unicode字符串
    function unicodeEnc(code){
        for (var uniStr='', i = 0; i < code.length; i++) {
            // 不足4位的,前面补0
            uniStr += '\\u' + ('0000' + code.charCodeAt(i).toString(16)).substr(-4)
        }
        return uniStr
    }
    console.log(unicodeEnc('yyy-MM-dd')) // \u0079\u0079\u0079\u002d\u004d\u004d\u002d\u0064\u0064
  • base64加密

    // base64加密
    function btoa(data){
        let buff = Buffer.from(data); // 默认用 utf-8 编码格式解释字符串
        let base64data = buff.toString('base64');
        return base64data
    }
    
    // base64解密
    function atob(base64data){
        let buff = Buffer.from(base64data, 'base64');
        let text = buff.toString('utf-8');
        return text
    }
    
    console.log(btoa('中国')) // 5Lit5Zu9
    console.log(atob('5Lit5Zu9')) // 中国
  • 数值加密(位异或)

    // 数值加密
    // 可以利用位异或的特性,如果a ^ b = c,那么b ^ c = a, a ^ c = b
    console.log(25 ^ 36) // 61,等价于console.log(61)
    console.log(25 ^ 61) // 36
    console.log(36 ^ 61) // 25
  • 数组混淆、乱序

    // 数组混淆
    var bigArr = [true, null, undefined, 1000, '\u0079\u0079\u0079', {name: 'eliwang', age: 20}, function(){console.log("hello world!")}]
    // 数组乱序
    !function (arr, num){
        while(--num){
            arr.unshift(arr.pop())
        }
    }(bigArr,3)
    
    console.log(bigArr) // [{ name: 'eliwang', age: 20 },[Function (anonymous)], true, null, undefined, 1000, 'yyy']
    console.log(bigArr[0]['name']) // eliwang
    bigArr[1]() // hello world!
    console.log(bigArr[5]) //1000
  • 花指令

    // 加法花指令
    var a =10, b = 20;
    function _0x20ab1fxe1(a,b){
        return a + b
    }
    var c = _0x20ab1fxe1(a,b)
    // var c = a + b
    console.log(c) // 30
  • 逗号表达式

    // 逗号表达式
    // 依次执行括号中的表达式,但是只返回最后一个表达式执行的结果
    var m = (n=1000, n + 2000)
    console.log(m) // 3000
    function commaExpression(a,b,c,d,e){
        return e = (d = (c = (b = (a = 0, a + 1000),b + 2000), c + 3000), d + 3000, d + 4000) // d + 3000 是花指令,无实际意义
    }
    console.log(commaExpression()) // 10000 <=> 0 + 1000 + 2000 + 3000 +4000
  • 控制流程平坦化

    // 控制流程平坦化
    /*
        function processFlattening(){
            var a = 1000;
            var b = a + 2000;
            var c = b + 3000;
            var d = c + 4000;
            var e = d + 5000;
            var f = e + 6000;
            return f
        }
        console.log(processFlattening())
    */
    function processFlattening(){
        // 分发器
        var arrStr = '6|3|7|4|2|1|5'.split('|'), i = 0;
        while(!![]){
            switch (arrStr[i++]){
                case '1':
                    var f = e + 6000;
                    continue
                case '2':
                    var e = d + 5000;
                    continue
                case '3':
                    var b = a + 2000;
                    continue
                case '4':
                    var d = c + 4000;
                    continue
                case '5':
                    return f
                    continue // 不会执行,但会起到混淆作用
                case '6':
                    var a = 1000;
                    continue
                case '7':
                    var c = b + 3000;
                    continue
            }
            break // switch表达式的值与每个case都不匹配时,会执行这句,跳出while循环
        }
    }
    console.log(processFlattening())
  • eval执行

    // eval执行
    code = `
        function evalFunc(){
            var a = 1000;
            var b = a + 2000;
            var c = b + 3000;
            var d = c + 4000;
            var e = d + 5000;
            var f = e + 6000;
            return f
        }
        console.log(evalFunc())
    `
    eval(code) // 21000
posted @ 2023-02-26 01:14  eliwang  阅读(1821)  评论(0编辑  收藏  举报