【AST 混淆】六、代码逐行 ASCII码 混淆

思路

这种加密与 逐行加密区别不大,只是去掉字符串加密函数,改用 charCodeAt 将字符串转到 ASCII 码,把 解密函数换成 String.fromCharCode ,最后使用 eval 执行

// 代码逐行 ASCII码 混淆
traverse(ast, {
    FunctionExpression(path) {
        let blockStatement = path.node.body
        let statement = blockStatement.body.map((v) => {
            if (type.isReturnStatement(v)) {
                return v; // 返回节点处理
            }
            v.leadingComments && v.leadingComments[0].value.replace(' ', '') == 'encryptAscii' && delete v.leadingComments; // 删 加密标识注释 的兼容处理
            // 判断是否是注释行
            if (!(v.trailingComments && v.trailingComments[0].value.replace(' ', '') == 'encryptAscii')) {
                return v
            }

            delete v.trailingComments; // 删除注释
            // 遍历 生成 eval(String.fromCharCode()) 这种节点
            let code = generator(v).code;
            let codeAscaii = [].map.call(code, (v) => {
                return type.numericLiteral(v.charCodeAt(0))
            });
            // 生成节点
            return type.expressionStatement(
                expression = type.callExpression(
                    callee = type.identifier('eval'),
                    _arguments = [type.callExpression(
                        callee = type.memberExpression(
                            object = type.identifier(name = 'String'),
                            property = type.identifier(name = 'fromCharCode')),
                        _arguments = codeAscaii)])
            )
        })
        path.get('body').replaceWith(type.blockStatement(statement)) // 替换
    }
})

mark

发表评论 / Comment

用心评论~