哦哇資訊網

JS混淆是不是紙老虎?

由 WangLiwen 發表于 家居2021-12-13

關於JS程式碼混淆,一直有兩種觀點。

一種觀點認為很有用,是JS程式碼保護的重要手段,這是主流觀點。

但也見到少數人稱不管用,是紙老虎,混淆後的程式碼還能讀懂,隨隨便便就能破解。

哪種觀點才是正確的呢?我們透過實驗來證明。

實驗使用

JShaman

平臺,這是一個專業的JS程式碼混淆加密平臺。

測試用程式碼,就使用平臺提供的例程,簡單的幾行:

保護選項,去掉預設的“壓縮程式碼”功能,為方便我們檢視混淆後的程式碼。

一鍵完成混淆,得到保護後的程式碼:

跟前面保護前的4行程式碼相比,很顯然複雜了很多,跟原始程式碼相比差別很大,絕不是隨便就看看出程式碼邏輯和功能的。這還只是使用預設的保護選項,保護等級比較低,因此在程式碼中還有“hello world”字串能被看到。

如果使用更多的保護選項,提高混淆強度,又會如何呢?

多勾選兩個混淆選項:

再次一鍵完成保護,得到:

JS混淆是不是紙老虎?

可以看到,這次得到的保護結果更為複雜。短時間、甚至長時間也不容易讀懂並還原回原有的程式碼邏輯。

實驗到這裡,顯然可以說:JS混淆,不是紙老虎,是真有用。

那麼,混淆後的程式碼,是否可以進行反混淆,還原為原始程式碼呢?

有的人認為可以。實驗繼續進行:

對保護後的程式碼反混淆,通常用esprima、escodegen。

我們準備以下程式碼實現一個反混淆工具

JS混淆是不是紙老虎?

注意在程式碼中,傳入了要進行反混淆的程式碼,即上面我們混淆的結果。

執行,得到反混淆結果:

JS混淆是不是紙老虎?

可以看到,確實條理化了程式碼,但遠遠沒有還原回原本的程式碼,還記的原本的程式碼,對比一下:

JS混淆是不是紙老虎?

而且我們可以思考一下:比如有一個變數名:car,它是一個有字面意義的變數。經混淆後,它會被變成隨字串,比如:_0x12345。在反混淆時,反混淆程式、工具,無論如何也不可能知道它原本的名稱是car。那麼,也就絕對不可能把程式碼完好還原回去。

實驗結果證明:JS混淆,是有效的JS程式碼保護方式!

TAG: 程式碼混淆JS保護選項