3.吉林航空ast解混晓极验dx非控制流-cnblog

吉林航空ast解混晓极验dx非控制流

image-20240704234129913

观察到mwbxQ. C g 大量调用 , 合并 m w b x Q . _Cg大量调用,合并mwbxQ. Cg大量调用,合并mwbxQ._Cg(37)

image-20240704170944182

concat()是合并数组的作用

mwbxQ.$Cg应该是一个数组

mwbxQ.$_Cg(37)

image-20240704173247653

image-20240704173434780

// 引入Node.js的文件系统模块,用于读写文件
const fs = require('fs');
const types = require("@babel/types")
// 引入@babel/parser模块,用于将源代码转换成AST(抽象语法树)
const parser = require("@babel/parser");
// 引入@babel/traverse模块,用于遍历和修改AST
const traverse = require("@babel/traverse").default;
// 引入@babel/types模块,用于创建或判断AST节点类型
const t = require("@babel/types");
const {callExpression} = require('@babel/types');
// 引入@babel/generator模块,用于将AST转换回代码
const generator = require("@babel/generator").default;

// 读取当前目录下的demon.js文件内容,编码格式为utf-8
const jscode = fs.readFileSync("./demon.js", {
    encoding: "utf-8"
});

// 将读取到的JavaScript代码解析成AST,并设置sourceType为"module"以支持ES模块语法
let ast = parser.parse(jscode, {
    sourceType: "module", // 对import进行控制,防止报错
});
// console.log(JSON.stringify(ast,null,"\t"))   //将原来的格式输出为ast树

// 对AST进行一系列操作
visitor = {
    CallExpression: {
        enter: [replace_$_Cg]
    }
};
function mwbxQ(){};
mwbxQ.$_Cg = function (){};
function replace_$_Cg(path) {
    var node = path.node;
    if (node.callee == undefined || node.callee.property == undefined)
        return;
    if (node.callee.property.name == "$_Cg") {
        var arg = node.arguments[0].value;
        var value = mwbxQ.$_Cg(arg);
        path.replaceInline(types.valueToNode(value));
    }
}

traverse(ast, visitor)

// 使用@babel/generator将AST转换回代码,并设置相关选项
let code = generator(ast, {
    retainLines: false, // 是否与源代码的行号相同,默认是否
    comments: false, // 是否保留源代码的注释,默认是true
    compact: false // 是否压缩代码
}).code;

//将生成的代码写入到demon_new.js文件中,如果发生错误则执行回调函数
fs.writeFile('./demon_new.js', code, (err) => {
});

d0650c69bc2f8d249dc024fe84fa96b

dd757f0e3f4480cad7e9095f42719c5

合并mwbxQ.$_Cg

image-20240704204851962

$_CIEk = mwbxQ.$_Cg,
$_CIDl = ['$_CIHK'].concat($_CIEk) = ['$_CIHK',mwbxQ.$_Cg]
$_CIFV = $_CIDl[1] = mwbxQ.$_Cg
$_CIEk = mwbxQ.$_Cg
    $_CIFV = mwbxQ.$_Cg

将所有的这两个位置的name全部遍历出来,放入一个数组,然后遍历判断所有类似oeXg(12)的name是否在数组里,是的话就替换

image-20240704205600644

image-20240704205829681

// 引入Node.js的文件系统模块,用于读写文件
const fs = require('fs');
const types = require("@babel/types")
// 引入@babel/parser模块,用于将源代码转换成AST(抽象语法树)
const parser = require("@babel/parser");
// 引入@babel/traverse模块,用于遍历和修改AST
const traverse = require("@babel/traverse").default;
// 引入@babel/types模块,用于创建或判断AST节点类型
const t = require("@babel/types");
const {callExpression} = require('@babel/types');
// 引入@babel/generator模块,用于将AST转换回代码
const generator = require("@babel/generator").default;

// 读取当前目录下的demon.js文件内容,编码格式为utf-8
const jscode = fs.readFileSync("./demon.js", {
    encoding: "utf-8"
});

// 将读取到的JavaScript代码解析成AST,并设置sourceType为"module"以支持ES模块语法
let ast = parser.parse(jscode, {
    sourceType: "module", // 对import进行控制,防止报错
});
// console.log(JSON.stringify(ast,null,"\t"))   //将原来的格式输出为ast树


// 对AST进行一系列操作

function mwbxQ() {
};
mwbxQ.$_Cg = function () {
};

//更改mwbxQ.$_Cg(37)
function replace_$_Cg(path) {
    var node = path.node;
    if (node.callee == undefined || node.callee.property == undefined)
        return;
    if (node.callee.property.name == "$_Cg") {
        var arg = node.arguments[0].value;
        var value = mwbxQ.$_Cg(arg);
        path.replaceInline(types.valueToNode(value));
    }
}

//提取数量最多的mwbxQ.$_Cg,遍历所有的遍历存入数组
function get_name_Array(path) {
    var node = path.node;
    if (node.declaration == undefined
        || node.declaration.length != 3
        || node.declaration[0].init == undefined
        || node.declaration[0].property == undefined)
        return;
    if (node.declaration[0].init.property.name != '$_Cg')
        return;
    let varName1 = node.declaration[0].id.name;
    let varName2 = node.declaration[2].id.name;
    nameArray.push(varName1, varName2)
}

//定义一个存放变量的数组
var nameArray = [];

//替换存在数组中的变量
function replace_name_Array(path){
    var node = path.node;
    if (node.callee == undefined||node.callee.name == undefined)
        return;
    if(nameArray.indexOf(node.callee.name)==-1)
        return;
    var arg = node.arguments[0].value;
    var value = mwbxQ.$_Cg(arg);
    path.replaceInline(types.valueToNode(value));
}


visitor = {
    CallExpression: {
        enter: [replace_$_Cg]
    },
    VariableDeclaration:{
        enter: [replace_name_Array,replace_$_Cg]
    },
};

traverse(ast, visitor)
// 使用@babel/generator将AST转换回代码,并设置相关选项
let code = generator(ast, {
    retainLines: false, // 是否与源代码的行号相同,默认是否
    comments: false, // 是否保留源代码的注释,默认是true
    compact: false // 是否压缩代码
}).code;

//将生成的代码写入到demon_new.js文件中,如果发生错误则执行回调函数
fs.writeFile('./demon_new.js', code, (err) => {
});

image-20240704211604170

image-20240704211638849

删除无用的解释代码

image-20240704211925307

定位节点

image-20240704212302327

// 引入Node.js的文件系统模块,用于读写文件
const fs = require('fs');
const types = require("@babel/types")
// 引入@babel/parser模块,用于将源代码转换成AST(抽象语法树)
const parser = require("@babel/parser");
// 引入@babel/traverse模块,用于遍历和修改AST
const traverse = require("@babel/traverse").default;
// 引入@babel/types模块,用于创建或判断AST节点类型
const t = require("@babel/types");
const {callExpression} = require('@babel/types');
// 引入@babel/generator模块,用于将AST转换回代码
const generator = require("@babel/generator").default;

// 读取当前目录下的demon.js文件内容,编码格式为utf-8
const jscode = fs.readFileSync("./demon.js", {
    encoding: "utf-8"
});

// 将读取到的JavaScript代码解析成AST,并设置sourceType为"module"以支持ES模块语法
let ast = parser.parse(jscode, {
    sourceType: "module", // 对import进行控制,防止报错
});
// console.log(JSON.stringify(ast,null,"\t"))   //将原来的格式输出为ast树


// 对AST进行一系列操作

function mwbxQ() {
};
mwbxQ.$_Cg = function () {
};

//更改mwbxQ.$_Cg(37)
function replace_$_Cg(path) {
    var node = path.node;
    if (node.callee == undefined || node.callee.property == undefined)
        return;
    if (node.callee.property.name == "$_Cg") {
        var arg = node.arguments[0].value;
        var value = mwbxQ.$_Cg(arg);
        path.replaceInline(types.valueToNode(value));
    }
}

//提取数量最多的mwbxQ.$_Cg,遍历所有的遍历存入数组
function get_name_Array(path) {
    var node = path.node;
    if (node.declaration == undefined
        || node.declaration.length != 3
        || node.declaration[0].init == undefined
        || node.declaration[0].property == undefined)
        return;
    if (node.declaration[0].init.property.name != '$_Cg')
        return;
    let varName1 = node.declaration[0].id.name;
    let varName2 = node.declaration[2].id.name;
    nameArray.push(varName1, varName2);

}

//定义一个存放变量的数组
var nameArray = [];

//替换存在数组中的变量
function replace_name_Array(path){
    var node = path.node;
    if (node.callee == undefined||node.callee.name == undefined)
        return;
    if(nameArray.indexOf(node.callee.name)==-1)
        return;
    var arg = node.arguments[0].value;
    var value = mwbxQ.$_Cg(arg);
    path.replaceInline(types.valueToNode(value));
}

//删除原先残留注释节点
function Del_Dai(path){
    var node = path.node;
    var arrNode = node.declarations;
    //遍历删除
    for(var i =0;i<arrNode.length;i++){
        if(arrNode[i].init == undefined||arrNode[i].init.property == undefined)
            break;
        if (arrNode[i].init.property.name !='$_Cg')
            break;
        path.remove();
        //删除下一个节点
        var nextPath = path.getNextSibling();
        nextPath.remove();

        //删除下下个节点
        var nnextPaht = nextPath.getNextSibling();
        nnextPaht.remove();
        return;
    }

}
visitor = {
    VariableDeclaration:{
        enter: [get_name_Array,Del_Dai]
    },
    CallExpression: {
        enter: [replace_name_Array,replace_$_Cg]
    },
};

traverse(ast, visitor)
// 使用@babel/generator将AST转换回代码,并设置相关选项
let code = generator(ast, {
    retainLines: false, // 是否与源代码的行号相同,默认是否
    comments: false, // 是否保留源代码的注释,默认是true
    compact: false // 是否压缩代码
}).code;

//将生成的代码写入到demon_new.js文件中,如果发生错误则执行回调函数
fs.writeFile('./demon_new.js', code, (err) => {
});

image-20240704213609247

image-20240704213634278

删除unicode编码

image-20240704213822786

image-20240704214008442

// 引入Node.js的文件系统模块,用于读写文件
const fs = require('fs');
const types = require("@babel/types")
// 引入@babel/parser模块,用于将源代码转换成AST(抽象语法树)
const parser = require("@babel/parser");
// 引入@babel/traverse模块,用于遍历和修改AST
const traverse = require("@babel/traverse").default;
// 引入@babel/types模块,用于创建或判断AST节点类型
const t = require("@babel/types");
const {callExpression} = require('@babel/types');
// 引入@babel/generator模块,用于将AST转换回代码
const generator = require("@babel/generator").default;

// 读取当前目录下的demon.js文件内容,编码格式为utf-8
const jscode = fs.readFileSync("./demon.js", {
    encoding: "utf-8"
});

// 将读取到的JavaScript代码解析成AST,并设置sourceType为"module"以支持ES模块语法
let ast = parser.parse(jscode, {
    sourceType: "module", // 对import进行控制,防止报错
});
// console.log(JSON.stringify(ast,null,"\t"))   //将原来的格式输出为ast树


// 对AST进行一系列操作

function mwbxQ() {
};
mwbxQ.$_Cg = function () {
};

//更改mwbxQ.$_Cg(37)
function replace_$_Cg(path) {
    var node = path.node;
    if (node.callee == undefined || node.callee.property == undefined)
        return;
    if (node.callee.property.name == "$_Cg") {
        var arg = node.arguments[0].value;
        var value = mwbxQ.$_Cg(arg);
        path.replaceInline(types.valueToNode(value));
    }
}

//提取数量最多的mwbxQ.$_Cg,遍历所有的遍历存入数组
function get_name_Array(path) {
    var node = path.node;
    if (node.declaration == undefined
        || node.declaration.length != 3
        || node.declaration[0].init == undefined
        || node.declaration[0].property == undefined)
        return;
    if (node.declaration[0].init.property.name != '$_Cg')
        return;
    let varName1 = node.declaration[0].id.name;
    let varName2 = node.declaration[2].id.name;
    nameArray.push(varName1, varName2);

}

//定义一个存放变量的数组
var nameArray = [];

//替换存在数组中的变量
function replace_name_Array(path) {
    var node = path.node;
    if (node.callee == undefined || node.callee.name == undefined)
        return;
    if (nameArray.indexOf(node.callee.name) == -1)
        return;
    var arg = node.arguments[0].value;
    var value = mwbxQ.$_Cg(arg);
    path.replaceInline(types.valueToNode(value));
}

//删除原先残留注释节点
function Del_Dai(path) {
    var node = path.node;
    var arrNode = node.declarations;
    //遍历删除
    for (var i = 0; i < arrNode.length; i++) {
        if (arrNode[i].init == undefined || arrNode[i].init.property == undefined)
            break;
        if (arrNode[i].init.property.name != '$_Cg')
            break;
        path.remove();
        //删除下一个节点
        var nextPath = path.getNextSibling();
        nextPath.remove();

        //删除下下个节点
        var nnextPaht = nextPath.getNextSibling();
        nnextPaht.remove();
        return;
    }
}

//还原unicode编码
function replace_unicode(path) {
    var node = path.node;
    if (node.extra == undefined)
        return;
    delete node.extra;
}



visitor = {
    VariableDeclaration: {
        enter: [get_name_Array, Del_Dai]
    },
    CallExpression: {
        enter: [replace_name_Array, replace_$_Cg]
    },
    StringLiteral: {
        enter: [replace_unicode]
    }
};

traverse(ast, visitor)
// 使用@babel/generator将AST转换回代码,并设置相关选项
let code = generator(ast, opts = {
    jsescOption: {"minimal": true},//当jsesc库被设置为{"minimal": true}时,它指示库在转义字符串时采取最小化转义。这意味着只有必要的时候才会进行转义,处理中文转义
    retainLines: false, // 是否与源代码的行号相同,默认是否
    comments: false, // 是否保留源代码的注释,默认是true
    compact: false // 是否压缩代码
}).code;

//将生成的代码写入到demon_new.js文件中,如果发生错误则执行回调函数
fs.writeFile('./demon_new.js', code, (err) => {
});

需要删除extra

image-20240704214637012

image-20240704214744430

  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值