自执行函数实参还原与替换

 

 

 

const parser = require("@babel/parser"); const traverse = require("@babel/traverse").default;  // 将js代码转换成AST // const { parse } = require("@babel/parser"); // 用来遍历AST中的节点 // const traverse = require("@babel/traverse").default; // AST转换成js const generator = require("@babel/generator").default; // 用来判断节点类型和生成新的节点 const types = require("@babel/types");   const jscode = `   (function(t,a,b,c,d) {    console.log(a[0]+a[1]);    console.log(b[0]-b[1]);    console.log(c);    console.log(d);    t = 123;  })(5,[1,2],[5,3],6,-5);  `; let ast = parser.parse(jscode);    //判断节点元素是否为字面量 //eg.  ++123,-456,"789"; function isBaseLiteral(path) {     if (path.isLiteral())     {         return true;     }     if (path.isUnaryExpression({operator:"-"}) ||          path.isUnaryExpression({operator:"+"}))     {         return isBaseLiteral(path.get('argument'));     }          return false; }     const resolveParams =  {    CallExpression(path)    {       let callee   = path.get('callee');       let arguments = path.get('arguments');       if (!callee.isFunctionExpression() || arguments.length == 0)       {          return;       }       let scope = callee.scope;       let params = callee.get('params');         for (let i=0;i< arguments.length;i++)       {          let paramsPath  = params[i];          let argumentPath = arguments[i];          const binding = scope.getBinding(paramsPath.node.name);          if (!binding || !binding.constant)          {             continue;          }           let canRemoved = true;           for (let referPath of binding.referencePaths)          {             if (argumentPath.isIdentifier() || isBaseLiteral(argumentPath))             {                referPath.replaceWith(argumentPath.node);             }             else if (argumentPath.isArrayExpression())             {                let parentPath = referPath.parentPath                if (!parentPath.isMemberExpression())                {                   canRemoved = false;                   continue;                }                let {property} = parentPath.node;                if (!types.isNumericLiteral(property))                {                   canRemoved = false;                   continue;                }                let index = property.value;                if (index > argumentPath.length)                {                   canRemoved = false;                   continue;                                  }                let arrEle = argumentPath.node.elements[index];                parentPath.replaceWith(arrEle);             }             else             {                canRemoved = false;                break;                      }          }          if (canRemoved)          {             paramsPath.remove();             argumentPath.remove();          }       }    }, }  traverse(ast, resolveParams);   let { code } = generator(ast);  console.log(code);

 

推荐这些文章:

eval还原

 
 

const fs = require('fs');
const {parse} = require("@babel/parser");
const traverse = require("@babel/traverse").default;
const t = require("@babel/types");
const generator = require("@babel/generator").default;

let jscode = "eval('var a = 123;');";

let ast = parse(jscode);

const v...

作用域内变量替换

https://www.jianshu.com/p/a3857fa5c899
 
 

const fs = require('fs');
const { parse } = require("@babel/parser");
const traverse = require("@babel/traverse").default;
const t = require("@babel/types");
const generator = require("@babel/generator").default;

let jscode = `

var a = window;...

JS 函数的执行时机

1. 解释为什么如下代码会打印 6 个 6

let i = 0
for(i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
}

答:setTimeout的意思就是等一会再执行,先把上面的语句执行完了再执行console.log,也就是把for循环全部执行完,那么for循环执行完后就是6,之后就再打印6个6

 

2.写出让上面代码打印 0、1、2、3、4、5 的方法

1 for (let i = 0;i<6;i++){
2 setTimeout(()=>{
3 cons...

js定义一个立即执行函数

(function () { console.log('自执行函数1'); })();
(function () { console.log('自执行函数2'); }());
!function () { console.log('自执行函数3'); }();
+ function () {
console.log('自执行函数4');
}();
- function () {
console.log('自执行函数5');
}();
~function () {
console.log('自执行函数6');
}();
!function () {
consol...

利用函数求任意个数的最大值

 
 
 

<script>
function getMax() {
let max = arguments[0];
for (let i = 0; i < arguments.length; i++) {
if (arguments[i] > max) {
max = arguments[i];
}
}
return max;
}
console.log(getMax(5, 3, 4, 9));
co...

逆向进阶,利用 AST 技术还原 JavaScript 混淆代码

什么是 AST

AST(Abstract Syntax Tree),中文抽象语法树,简称语法树(Syntax Tree),是源代码的抽象语法结构的树状表现形式,树上的每个节点都表示源代码中的一种结构。语法树不是某一种编程语言独有的,JavaScript、Python、Java、Golang 等几乎所有编程语言都有语法树。

小时候我们得到一个玩具,总喜欢把玩具拆解成一个一个小零件,然后按照我们自己的想法,把零件重新组装起来,一个新玩具就诞生了。而 JavaScript 就像一台精妙运作的机器,通过 AST 解析,我们也可以像童年时拆解玩具一样,深入了解 JavaScript 这台机器的各...

js----定义变量的几种方式

const  用于声明常量,也具有块级作用域 const PI=3.14;
const b = 2 //正确 //const b //错误,没有初始化 console.log('函数外const定义b:' + b);//有输出值 // b = 5; // console.log('函数外修改const定义b:' + b);//无法输出

3|0var
var定义的变量可以修改,可以不初始化,没有初始化输出undefined

var a = 1; // var a;//不会报错 console.log('函数外var定义a:' + a);//可以输出a=1 fu...

js中声明变量的三种方式。const, var, le

1.const定义的变量不可以修改,而且必须初始化。

const b = 2;//正确
// const b;//错误,必须初始化
console.log('函数外const定义b:' + b);//有输出值
// b = 5;
// console.log('函数外修改const定义b:' + b);//无法输出

2.var定义的变量可以修改,如果不初始化会输出undefined,不会报错。

var a = 1;
// var a;//不会报错
console.log('函数外var定义a:' + a);//可以输出a=1
function change(){
...

第6章 函数与闭包

6.1 函数声明语句与匿名函数表达式

可以通过函数声明语句与匿名函数表达式对函数进行声明。

6.2 函数调用的分类

将以方法调用的方式使用的函数称为方法,同理,将以构造函数调用方式使用的函数称为构造函数。

函数声明语句的后置

通过函数声明语句声明的函数,可以在进行声明的代码行之前就对其调用。

function hzh1() {
hzh2(); // 在声明函数fn之前对其进行调用
function hzh2() {
console.log('黄子涵');
}
}
hzh1();

通过函数声明语句声明的函数,可以在进行声明的代码行之前...

JavaScript 04 函数,参数,形参,实参,返回值return,arguments的使用,冒泡排序法,匿名函数,自调用函数,作用域,作用域链,预解析

东西有点绕,需要好好消化,冒泡排序明天补上
-------------------------------------------------------------------------------------------------------
函数:封装一段特定功能的代码,然后通过函数名重复调用此段代码
定义函数 function + 函数名(参数){代码段}:function getSum( ){ }  //参数根据情况有或者没有
函数调用:getSum( );
参数:function sum(形参1,形参2){ }  //形参没有实际意义,调用函数时用来传入参数。相当于占位一样,...

文章标题:自执行函数实参还原与替换
文章链接:https://www.dianjilingqu.com/2497.html
本文章来源于网络,版权归原作者所有,如果本站文章侵犯了您的权益,请联系我们删除,联系邮箱:saisai#email.cn,感谢支持理解。
THE END
< <上一篇
下一篇>>