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

举报
悦来客栈的老板 发表于 2021/08/27 01:01:15 2021/08/27
【摘要】 一.t.isStringLiteral...中的t是什么变量? 答:早期的一些代码,我都是参考官方写的,但由于ob混淆在还原的时候,会用到eval函数,这样可能导致变量名污染,所以我在后面统一改成了 types const types = require("@babel/types"); 二.下面的代码中: le...

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

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

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

  

二.下面的代码中:

let {node,scope} = path;

  

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

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

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


   
  1. let node  = path.node;
  2. 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。

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

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

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

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

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

一个简单的实例:

var s = "abc";

  

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


   
  1. const visitor = {
  2. StringLiteral(path)
  3. {
  4. path.replaceWith(t.StringLiteral("hello"));
  5. }
  6. }

运行后就报错了。

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

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

答:

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

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

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

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

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

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

建议直接跳到第六步。

总结:

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

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

文章来源: blog.csdn.net,作者:悦来客栈的老板,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq523176585/article/details/119922831

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。