在對JavaScript代碼進行混淆加密時,經常會用到平展控制流,它可以将代碼“展開”、打亂邏輯流程。
與之相對的,還有一種不常見的收縮控制流技術,可以将多行代碼“收縮”到一行。
以下用示例展示兩者各自的效果。
平展控制流:
使用JShaman(專業的JS代碼加密平台)對一段代碼進行平展控制流操作,如下圖:
處理後,代碼将發生如下變化:
可見,平展操作之後,打亂了代碼順序,并且代碼量也增加了。是種不錯的JS代碼混淆加密手段。
再來看收縮控制流,效果如下:
代碼中,比如a和b變量的指派,原本是分别在兩行中進行。而收縮之後,變成在一行中完成:
這個方式,同樣起到了混淆代碼邏輯的效果。
用astexplorer檢視代碼的AST(抽象文法樹),處理前:
處理後:
可見,AST同樣得到了收縮。
此外,與平展控制流相比,它還具有一項優勢:
可以壓縮代碼量、并可提高代碼執行效率。
如下圖所示,處理前代碼長度為226,之後變成了218。
而且,此技術生成的代碼将多個指派語句轉為了逗号連續語句,也會提升代碼執行性能。