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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM