AST-web端javascript逆向杀器之认识AST

本文转自蔡老板的公众号,原网址:https://mp.weixin.qq.com/s/NjWXail0y3vdqZJPLgjTfg

 

AST从入门到实战系列基础文章索引: AST在线解析网站: 原站点: AST explorer 国内镜像 AST explorer

 

什么是AST?

 

答:在计算机科学中,抽象语法树(Abstract Syntax Tree,AST),或简称语法树(Syntax tree),是源代码语法结构的一种抽象表示。

它以树状的形式表现编程语言的语法结构,树上的每个节点都表示源代码中的一种结构。

之所以说语法是“抽象”的,是因为这里的语法并不会表示出真实语法中出现的每个细节。(摘自百度百科)

 

关键词:源代码语法抽象

 

既然是一棵树,那肯定有节点,或者遍历相关的概念。

 

AST对爬虫工程师有什么意义或者用途?

答:随着技术的革新,越来越多的前端为了保护其网站不被第三方爬取,使用了大量的混淆代码,让爬虫工程师越来越难找到其核心参数加密代码。

有时候定位到加密的地方,面对一大坨乱如麻的代码,内心也是拒绝的。

 

这个时候,希望有一种工具,尽可能的将被混淆的代码进行处理,使其可读性大大增加,使爬虫工程师能够轻而易举的进行定位,抠出其核心的加密代码。

AST用在这里,只是一种辅助工具,并不能直接帮你找到核心的代码,还是得自己去分析,静态分析也好,动态调试也好,目的只有一个。

 

学习AST需要理解什么语言或者库吗?

答:学习《编译原理》能更容易理解AST,不过没学也没关系。在这里,我们当它是一个工具,可以将代码进行简化就行。

 

目前,前端基本都使用的是JavaScript语言,所以你需要有JavaScript语言的基础,这也是做爬虫工程师必备的技能。

 

这里推荐一个入门的javascript教程,非常适合零基础的小白

 

https://wangdoc.com/javascript/index.html

 

做爬虫的工程师都或多或少的听过Node.js,把它理解为运行在服务端的 JavaScript 就好。有时候抠出来的核心代码比较复杂,无法改写成Python语言,而又需要对相关参数进行加密并返回给Python,这时候Node.js就派上用场了

 

在线下载网站:

 

https://nodejs.org/zh-cn/

 

这里个人推荐使用长期支持的版本,比较稳定。

 

 

 

 

 

 

而在Node.js下,有关AST的库很多,本人使用的是babel库,其他的库没做了解,babel库简单,功能强大是它的特点

 

在下载并安装后Node.js,就可以直接安装 babel库了。

 

安装命令:

npm install @babel/core --save-dev

 

注意: 不要全局安装,可能会有无法导入库的情况。

 

如何直观的理解AST?

 

答:有一个在线的解析网站:

 

https://astexplorer.net/

 

该网站可以清晰的将源代码解析成AST,可以将多种语言解析成AST,这里我们需要处理的是JavaScript,因此选择这个就好:

 

 

 

 

 

语言选择后,再选择相应的库,这里注意了,在Node.js下安装的是babel库,因此这里选择 @babel/parser ,保持一致。

 

 

 

 

 

如何用AST解混淆?思路是什么?

答:首先要明确的是,你要做什么。比如看到源代码中,有很多类似这样的代码:

 

var a = "\u0068\u0065\u006c\u006c\u006f\u002c\u0041\u0053\u0054";

  

 

这代码看起来,可读性就差了很多,如果不是特别记忆,根本看不出是什么字符。

 

这个时候,你想把它还原成本来的面目:

 

var a = "hello,AST";

  

 

这样对你来说,就清晰多了。这时,你的目的就出来了,想要将

 

"\u0068\u0065\u006c\u006c\u006f\u002c\u0041\u0053\u0054"

  

 

替换成:

 

"hello,AST"

  

 

在这里,我们手动替换就好了。那如果代码中有大量这样的字符串呢?也是一个一个手动替换吗?

 

所以,聪明的你肯定选择用工具来完成这个重复的工作。

 

目的明确了,现在就是如何编写工具了。

 

var a = "\u0068\u0065\u006c\u006c\u006f\u002c\u0041\u0053\u0054";

  

放在在线网站进行解析,发现要处理的字符串是一个 StringLiteral 类型的节点:

 

 

 

 

 

 

在使用babel库操作时,只需遍历这个类型的节点,就会处理全部的 StringLiteral节点。

 

要处理节点,那肯定要理解babel库的相关知识。

 

1.babel库官方文档:

https://babeljs.io/docs/en/

 


2.babel库github地址:

https://github.com/babel/babel

 

3.babel库官方插件开发手册:

https://github.com/jamiebuilds/babel-handbook

 

4.babel库官方插件

https://www.babeljs.cn/docs/plugins

 

编写AST相关的代码,需要用到什么编译器?

答:个人不是很推荐WebStrom,感觉太笨重了,还要购买。这里推荐微软出品的 VS code,轻便好用。

 

如果不是很想装软件,也可以试试我一直在用的套装:

 

UltraEdit 编辑器 + Cmder + Node.js

 

开发完成后,将文件保存为 xxx.js,再在Cmder下输入命令:

node xxx.js

 

 

posted @ 2020-12-29 15:24  Eeyhan  阅读(2707)  评论(0编辑  收藏  举报