這個號稱JS“最牛×的加密”的sojson.v5不過是老千層餅了。就連“耶穌也不可能還原”(廢話,js minify 改掉了變量名字怎能還原),今天就來看看它。順便打擊一下不良前端驗證勢力。

樣本:Ubuntu Pastebin(接近 200K,太大啦)

工具:WebStorm(給變量改名、Find Usage、檢查語法以判斷解密正確性)

具體代碼就不發了,JS 寫得太爛,大體知道怎麼去混淆就行了。如果你搞語法樹該會輕鬆,因為就那麼幾個固定的花樣。

相信我,只要你會寫正則表達式替換和括號匹配,你就會解密這個 JS。

第一層

代碼格式化一下,根據網上已有的資料是 base64 和 RC4,一看確實如此,代碼和 Wikipedia 的 RC4 偽代碼高度一致。

要用 JS 打敗 JS,直接把他的數組和解密函數複製過來用,然後用正則表達式把解密函數出現的每一處替換成解密後的明文即可。注意特殊字符如引號、換行的轉義問題。

第二層

發現 function () { 下常有一個大的映射表,用來替換字符和符號。先把所有 function 掃一遍,在代碼裡把這個表去掉,同時維護一個映射,再恢復代碼即可。

第三層

Mysterious Profound JS Code.png

其實這時候代碼可讀性已經恢復得差不多了(估計也可以 debug),但是還是有一些垃圾,比如一些 if (false)if (true)、假循環和 switch 調換執行順序,也可以按部就班地去還原(格式都很統一)。至此可以推測這個“加密”的原理:

  1. 給所有變量和函數起一個溫暖的名字
  2. 往用戶代碼裡加入不影響執行的混淆代碼,搞搞事情
  3. 把所有的對象成員訪問都改寫成數組語法
  4. 把字符常量和運算符映射一下
  5. 把部分字符串“加密”
  6. 要吃飯的嘛!

當然,部分步驟可以交換。我沒有解析 JS 語法樹(雖然有現成的庫,沒學過編譯原理也不懂啊)成功還原到了 2.

整個過程中令我疑惑的是,既不是真的不能恢復(代碼的本來面貌),又導致 JS 中出現大量垃圾(比如自寫 atob 和 RC4,大量 Object)體積和內存劇增。這種“加密”有什麼存在的必要嗎?難怪作者的網站會被 DDoS(笑)。