desofuscación de AST

Ejemplo: árbol de sabiduría
Copie y guarde el js ofuscado en el texto en.js y seleccione JavaScript como idioma.
Obtenido del análisis de archivos.

La función _0x1e77 es la función de descifrado que ofusca la cadena cifrada JS.

Contraer todas las vistas (ctrl+0)
Insertar descripción de la imagen aquí
y 未格式化copiar la función de descifrado al archivo ob.js

const fs = require("fs");
const esprima = require("esprima");  // ECMAScript(JavaScript) 解析架构,主要用于多用途分析。
const estraverse = require("estraverse");  // 语法树遍历辅助库(提供了两个静态方法,estraverse.traverse 和 estraverse.replace,前者单纯遍历AST的节点,通过返回值控制是否继续遍历到叶子结点; 而 replace 方法则可以在遍历的过程中直接修改 AST,实现代码重构功能。)
const escodegen = require("escodegen"); // AST的 ECMAScript(JavaScript) 代码生成器
const iconv = require("iconv-lite");

//读取加密混淆的执行函数js
var content = fs.readFileSync('./en.js',{
    
    encoding:'binary'});
var buf = new Buffer.from(content,'binary');
var code = iconv.decode(buf,'utf-8');

//将混淆后的执行函数JS转换为AST
var ast = esprima.parse(code);


//解密函数(未格式化)




//字符串解密
var ast = esprima.parse(code);
ast = estraverse.replace(ast,{
    
    
    enter: function (node) {
    
    
        if(node.type == 'CallExpression' &&
            node.callee.type == 'Identifier' &&
            node.callee.name == '_0x7969' &&
            node.arguments[0].type == 'Literal')
        {
    
       if(node.arguments.length == 1){
    
    
                var val = _0x7969(node.arguments[0].value);
                return {
    
    
                    type: esprima.Syntax.Literal,
                    value: val,
                    raw: val
                }
        }else{
    
    
            if(node.arguments.length == 2){
    
    
                var val = _0x7969(node.arguments[0].value, node.arguments[1].value);
                return {
    
    
                    type: esprima.Syntax.Literal,
                    value: val,
                    raw: val
                }
            }
        }

        }
    }
})
code = escodegen.generate(ast)
console.log(code)
try{
    
    
    var a =fs.writeFileSync('./de.js', code)
    console.log(a)
  //文件写入成功。
} catch (err) {
    
    
  console.error(err)
}

Preste atención a reemplazar el nombre de la función de descifrado en el descifrado de cadenas.
Ejecute ob.js para obtener el código js desofuscado.
Cuando se produzca un error, puede intentar eliminarlo.

Supongo que te gusta

Origin blog.csdn.net/LI4836/article/details/129996409
Recomendado
Clasificación