AST实战|AST入门与实战星球高频问题汇总

网友投稿 641 2022-05-30

一.t.isStringLiteral...中的t是什么变量?

答:早期的一些代码,我都是参考官方写的,但由于ob混淆在还原的时候,会用到eval函数,这样可能导致变量名污染,所以我在后面统一改成了 types

const types = require("@babel/types");

二.下面的代码中:

let {node,scope} = path;

代码中的{}是什么意思?

答:这是ES6的语法,是变量的解构赋值。

在之前,我们一般这么写:

let node  = path.node;

let scope = path.scope;

但是在ES6语法中,我们可以简写为:

let {node,scope} = path;

具体知识参考这个链接:https://wangdoc.com/es6/destructuring.html

三.下面的代码中:

path.findParent(p => p.isConditionalExpression());

p是什么,哪里传来的?

答:问题的本质不是p,而是箭头函数。

箭头函数的详细介绍可以参考这篇文章:

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions/arrow_functions

四.下面的代码中:

StringLiteral({node}) {...}

这个函数中{}是啥?

答: 和问题二是一样的,也是变量的解构赋值罢。

原本应该是

StringLiteral(path) {...}

而node是path的一个属性,因此可以这么简写:

StringLiteral({node})

你甚至还可以根据自己的需求写成:

StringLiteral({node,scope})

五.下面的代码中:

scope.traverse(scope.block, {...})

scope.traverse是什么,scope.block是什么?

答:scope.traverse 这个和 @babel/traverse 中的 traverse 用法是一样的,

scope.block表示当前scope的node,可以参见源代码:

node_modules\@babel\traverse\lib\scope\index.js

中对 Scope 的定义。

六.编写的插件报错该怎么定位和处理?

答:插件报错后,一般我会在插件的第一行打印报错的源代码:

console.log(path.toString());

观察当前源代码的特征,如果不符合所遍历的规则,可以进行return。

AST实战|AST入门与实战星球高频问题汇总

也可以进行判断,只处理需要处理的path。

七.为什么运行插件后报 "Maximum call stack size exceeded"的错误?该怎么处理?

答: 根据我的实践总结,绝大部分的情况,用了path.replacexxx函数,而替换前后的类型是一致的。

比如,你当前遍历的节点是 StringLiteral 类型,而你在path.replacexxx函数里的实参节点也是 StringLiteral 类型,这样就导致一直在访问这个插件,

最后提示 RangeError: Maximum call stack size exceeded。

一个简单的实例:

var s = "abc";

想要把"abc",变成"hello",也许会这么写插件:

const visitor = {

StringLiteral(path)

{

path.replaceWith(t.StringLiteral("hello"));

}

}

运行后就报错了。

建立一个 if-return 机制就可以解决这样的问题了。

八.JS逆向时找不到加密参数在哪里生成的怎么办?

答:

第一步:先全局搜索,搜不到转第二步;

第二步:抓包加密请求的URL,看看其 Initiator里面的 Request call stack,跟进去看看哪里打断点合适。还是不行转第三步;

第三步:看看有没有被混淆了的js,有的话先还原,如果没有转第四步;

第四步:看看能不能打XHR断点或者其他的断点,不能打转第五步;

第五步:hook,看看是否为全局变量,或者某些需要经过系统函数加密的,注意观察加密字符串的特征,md5:32位英数混合;所有的字符是否属于base64码表内.......如果hook不到转第六步;

第六步:网上搜一搜教程,大厂的东西肯定有教程的。

建议直接跳到第六步。

总结:

学习是一个观摩的过程,先看看别人怎么弄的,然后再自己实战。

学习嘛,先得学,别一上来就自己搞自己的,然后报错了各种问题打击自信心...一般官方文档都会有例子。

JavaScript

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:张小白带你使用JupyterLab尝试体验“对抗示例生成”(使用MindSpore 1.4.1)
下一篇:FusionInsight测试系列之:HDFS吞吐量性能测试
相关文章