zoukankan      html  css  js  c++  java
  • 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 = "u0068u0065u006cu006cu006fu002cu0041u0053u0054";
    

      

     

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

     

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

     

    var a = "hello,AST";
    

      

     

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

     

    "u0068u0065u006cu006cu006fu002cu0041u0053u0054"
    

      

     

    替换成:

     

    "hello,AST"
    

      

     

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

     

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

     

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

     

    var a = "u0068u0065u006cu006cu006fu002cu0041u0053u0054";
    

      

    放在在线网站进行解析,发现要处理的字符串是一个 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

     

  • 相关阅读:
    用Java开发第一个APP
    去除字符串空格并竖向排列
    并发容器 concurrentHashMap--1.7 更改
    java并发容器CopyOnWriteArrayList 使用场景和内部实现分析
    java非并发容器ArrayList 和 LinkedList 优缺点比较及其实现源码分析
    并发容器之CopyOnWriteArrayList分析
    单例模式
    [Android]知识总结一:Activity
    阿里巴巴fastjson的使用问题
    java跨域请求的方式
  • 原文地址:https://www.cnblogs.com/Eeyhan/p/14206782.html
Copyright © 2011-2022 走看看