天天看點

JavaScript奇淫技巧:收縮控制流

在對JavaScript代碼進行混淆加密時,經常會用到平展控制流,它可以将代碼“展開”、打亂邏輯流程。

與之相對的,還有一種不常見的收縮控制流技術,可以将多行代碼“收縮”到一行。

JavaScript奇淫技巧:收縮控制流

以下用示例展示兩者各自的效果。

平展控制流:

使用JShaman(專業的JS代碼加密平台)對一段代碼進行平展控制流操作,如下圖:

JavaScript奇淫技巧:收縮控制流

處理後,代碼将發生如下變化:

JavaScript奇淫技巧:收縮控制流

可見,平展操作之後,打亂了代碼順序,并且代碼量也增加了。是種不錯的JS代碼混淆加密手段。

再來看收縮控制流,效果如下:

JavaScript奇淫技巧:收縮控制流

代碼中,比如a和b變量的指派,原本是分别在兩行中進行。而收縮之後,變成在一行中完成:

JavaScript奇淫技巧:收縮控制流

這個方式,同樣起到了混淆代碼邏輯的效果。

用astexplorer檢視代碼的AST(抽象文法樹),處理前:

JavaScript奇淫技巧:收縮控制流

處理後:

JavaScript奇淫技巧:收縮控制流

可見,AST同樣得到了收縮。

此外,與平展控制流相比,它還具有一項優勢:

可以壓縮代碼量、并可提高代碼執行效率。

如下圖所示,處理前代碼長度為226,之後變成了218。

JavaScript奇淫技巧:收縮控制流

而且,此技術生成的代碼将多個指派語句轉為了逗号連續語句,也會提升代碼執行性能。