代碼混淆

代碼混淆

代碼混淆(Obfuscated code)亦稱花指令,是將電腦程式的代碼,轉換成一種功能上等價,但是難於閱讀和理解的形式的行為。代碼混淆可以用於程式原始碼,也可以用於程式編譯而成的中間代碼。執行代碼混淆的程式被稱作代碼混淆器。目前已經存在許多種功能各異的代碼混淆器。

將代碼中的各種元素,如變數,函式,類的名字改寫成無意義的名字。比如改寫成單個字母,或是簡短的無意義字母組合,甚至改寫成“__”這樣的符號,使得閱讀的人無法根據名字猜測其用途。重寫代碼中的部分邏輯,將其變成功能上等價,但是更難理解的形式。比如將for循環改寫成while循環,將循環改寫成遞歸,精簡中間變數,等等。打亂代碼的格式。比如刪除空格,將多行代碼擠到一行中,或者將一行代碼斷成多行等等。

代碼混淆器也會帶來一些問題。主要的問題包括:

被混淆的代碼難於理解,因此調試以及除錯也變得困難起來。開發人員通常需要保留原始的未混淆的代碼用於調試。對於支持反射的語言,代碼混淆有可能與反射發生衝突。代碼混淆並不能真正阻止反向工程,只能增大其難度。因此,對於對安全性要求很高的場合,僅僅使用代碼混淆並不能保證原始碼的安全。

基本介紹

  • 中文名:代碼混淆
  • 外文名:Obfuscated code
  • 主要的問題:難於理解
  • 元素:變數,函式
Java是一種跨平台的、解釋型語言,Java原始碼編譯成中間“位元組碼”存儲於class檔案中。由於跨平台的需要,Java位元組碼中包括了很多原始碼信息,如變數名、方法名,並且通過這些名稱來訪問變數和方法,這些符號帶有許多語義信息,很容易被反編譯成Java原始碼。為了防止這種現象,我們可以使用Java混淆器對Java位元組碼進行混淆。
混淆就是對發布出去的程式進行重新組織和處理,使得處理後的代碼與處理前代碼完成相同的功能,而混淆後的代碼很難被反編譯,即使反編譯成功也很難得出程式的真正語義。被混淆過的程式代碼,仍然遵照原來的檔案格式和指令集,執行結果也與混淆前一樣,只是混淆器將代碼中的所有變數、函式、類的名稱變為簡短的英文字母代號,在缺乏相應的函式名和程式注釋的情況下,即使被反編譯,也將難以閱讀。同時混淆是不可逆的,在混淆的過程中一些不影響正常運行的信息將永久丟失,這些信息的丟失使程式變得更加難以理解。
混淆器的作用不僅僅是保護代碼,它也有精簡編譯後程式大小的作用。由於以上介紹的縮短變數和函式名以及丟失部分信息的原因, 編譯後jar檔案體積大約能減少25% ,這對當前費用較貴的無線網路傳輸是有一定意義的。

相關詞條

熱門詞條

聯絡我們