本文轉自蔡老板的公眾號,原網址: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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/242282.html
標籤:JavaScript
上一篇:每天一道面試題
