本文轉自蔡老板的公眾號,原網址: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