AST批量替换函数名,并且删除原有的节点

要处理的目标源码:

  !function (t, e) {
    var $_CIEE = bVnHz.$_CT,
        $_CIDV = ["$_CIHk"].concat($_CIEE),
        $_CIF_ = $_CIDV[1];
    $_CIDV.shift();
    var $_CIGe = $_CIDV[0];
    "use strict";

    $_CIEE(74) == typeof module && $_CIEE(74) == typeof module[$_CIF_(20)] ? module[$_CIEE(20)] = t[$_CIF_(39)] ? e(t, !0) : function (t) {
      var $_CIJt = bVnHz.$_CT,
          $_CIIY = ["$_CJCv"].concat($_CIJt),
          $_CJAB = $_CIIY[1];
      $_CIIY.shift();
      var $_CJBs = $_CIIY[0];
      if (!t[$_CJAB(39)]) throw new Error($_CIJt(13));
      return e(t);
    } : e(t);
  }
  !function (t, e) {
    var $_CIEE = bVnHz.$_CT,
        $_CIDV = ["$_CIHk"].concat($_CIEE),
        $_CIF_ = $_CIDV[1];
    $_CIDV.shift();
    var $_CIGe = $_CIDV[0];
    "use strict";

    $_CIEE(74) == typeof module && $_CIEE(74) == typeof module[$_CIF_(20)] ? module[$_CIEE(20)] = t[$_CIF_(39)] ? e(t, !0) : function (t) {
      var $_CIJt = bVnHz.$_CT,
          $_CIIY = ["$_CJCv"].concat($_CIJt),
          $_CJAB = $_CIIY[1];
      $_CIIY.shift();
      var $_CJBs = $_CIIY[0];
      if (!t[$_CJAB(39)]) throw new Error($_CIJt(13));
      return e(t);
    } : e(t);
  }
function aa(){
};
      

        主要目标把每个函数中第一句命名函数等于bVnHz.$_CT的,那么在该函数中把变量给统一换成一个函数名,并把每个函数划圈的部分节点给删除了。

const fs =require('fs');
//js转AST代码
const parser =require('@babel/parser');
//遍历ASR节点
const traverse =require('@babel/traverse').default;
//用来判断节点类型产生新的节点
const t =require('@babel/types');
//用来把AST转换成js代码
const generator =require('@babel/generator').default;
const jscode=fs.readFileSync("./testdemo1.js", {
    encoding:"utf-8"
});
let names1="";
let names2="";
let ee=null;
let rr=null;
let tt=null;
const deceli={
    CallExpression(path){
        if(path.node.callee.type=="Identifier"){
            if(path.node.callee.name==names1|path.node.callee.name==names2){
                console.log("哈哈");
                console.log(path.node.callee.name);
                path.node.callee.name="sxplain";
            }
        }
    }
};
const deceli1={
    "VariableDeclaration|ExpressionStatement"(path){
                if(path.node==ee|path.node==rr|path.node==tt){
                    path.remove();
                };
    }
};
const visitor = {
    FunctionExpression(path){
        if(path.node.body.body.length!=0){
            if(path.node.body.body[0].type=="VariableDeclaration"&&path.node.body.body[0].declarations.length>1){
                //console.log(path.node.body.body[0].declarations[0].init.object.name);
                if(path.node.body.body[0].declarations[0].init.object.name=="bVnHz"){
                    names1=path.node.body.body[0].declarations[0].id.name;
                    names2=path.node.body.body[0].declarations[2].id.name;
                    //console.log(path.node.body.body[0].declarations[0].id.name);
                    //console.log(path.node.body.body[0].declarations[2].id.name);
                    path.traverse(deceli,names1,names2);
                    ee=path.node.body.body[0];
                    rr=path.node.body.body[1];
                    tt=path.node.body.body[2];
                    //console.log(ee);
                    path.traverse(deceli1,ee,rr,tt);
                }
            }
        }
    }
}
let ast=parser.parse(jscode);
traverse(ast,visitor);
let code =generator(ast).code;
fs.writeFile('./testfter.js',code,(err)=>{});

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值