認識代碼混淆及常見方法原理


混淆目的

將程序代碼,轉換成功能不變,但難以閱讀或理解的形式。

方法及應用

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

      2. 混淆控制流:常增加大量if語句來混淆原本的控制流。

      3. 控制流平坦化:通過一個主分發器來控制程序基本塊的執行流程,像是一個循環嵌套一個大塊的switch語句。如圖:

處理后:
處理后可以看到,原本各基本塊之間清晰的關系變得不再清晰,需要搞清楚主分發器才能繼續分析。(模糊了switch中case代碼塊之間的關系,從而增加分析難度)
具體如圖:
 
 
 

JS代碼

除了ProGuard可處理的Java和Ollvm可處理的C++代碼,JS代碼也可以通過混淆保護,主要是字符串加密、混淆、去log、變量名處理、壓縮、函數名處理、平台識別、防篡改等。
編寫一個hello world
 
function myFunction()
{
    alert("Hello World!");
}
選擇高度混淆后的部分加密結果:
 

參考:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM