吉林航空ast解混晓极验dx非控制流
观察到mwbxQ. C g 大量调用 , 合并 m w b x Q . _Cg大量调用,合并mwbxQ. Cg大量调用,合并mwbxQ._Cg(37)
concat()是合并数组的作用
mwbxQ.$Cg应该是一个数组
mwbxQ.$_Cg(37)
// 引入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) => {
});
合并mwbxQ.$_Cg
$_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是否在数组里,是的话就替换
// 引入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) => {
});
删除无用的解释代码
定位节点
// 引入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) => {
});
删除unicode编码
// 引入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