混淆目的
將程序代碼,轉換成功能不變,但難以閱讀或理解的形式。
方法及應用
- 字符串加密:對應用程序中使用到的字符串進行 加密,防止通過IDA等工具獲取關鍵詞定位核心業務代碼;如Ollvm就提供對字符串加密的api。
- 類名、方法名混淆:將代碼中類名、方法名、屬性名替換為無意義符號,增加代碼逆向難度;如開源項目 ProGuard,能夠對Java字節碼進行混淆、縮減體積、優化等處理。其中混淆環節就是使用a、b、c、d這樣簡短無意義的名稱,對類、字段和方法進行重命名 。
- 程序結構混淆加密:對應用程序邏輯結構進行打亂混排,保證源碼可讀性降到最低。如Ollvm主要就是通過指令替換,混淆控制流,控制流平坦化實現對C++程序結構的混淆。
-
指令替換:隨機選擇一種功能上等效但更復雜的指令序列替換標准二元運算符;適用范圍:加法操作、減法操作、布爾操作(與或非操作)且只能為整數類型。
-
混淆控制流:常增加大量if語句來混淆原本的控制流。
-
控制流平坦化:通過一個主分發器來控制程序基本塊的執行流程,像是一個循環嵌套一個大塊的switch語句。如圖:

處理后:
處理后可以看到,原本各基本塊之間清晰的關系變得不再清晰,需要搞清楚主分發器才能繼續分析。(模糊了switch中case代碼塊之間的關系,從而增加分析難度)
具體如圖:
JS代碼
除了ProGuard可處理的Java和Ollvm可處理的C++代碼,JS代碼也可以通過混淆保護,主要是字符串加密、混淆、去log、變量名處理、壓縮、函數名處理、平台識別、防篡改等。
編寫一個hello world
function myFunction() { alert("Hello World!"); }
選擇高度混淆后的部分加密結果:
