白話文解說 Code Obfuscation / 程式碼混淆
有些程式語言屬於腳本(script)語言,完全不需要經過編譯,所以散佈這些程式時就直接以原本樣貌散佈。舉個最常見的例子,就是網頁上的 JavaScript 程式碼,只要使用開發者工具(DevTools)就能夠檢視這些程式碼,甚至可以複製關鍵程式碼回去使用。
另外,就算是編譯過的程式,其實也能透過若干手段逆向還原出原本的程式碼,譬如 Android 的 APK 檔,也可以用 APK decompiler 等工具做反編譯,進而取得原始碼,甚至有個知名軟體 IDA Pro 也能反組譯 Linux, Windows, macOS 相關的執行檔。
所以如何保護關鍵程式碼不僅僅是腳本語言的問題,連編譯語言都得面對。
這個問題其中 1 個答案是—— Code obfuscation, 又稱程式碼混淆。
它是 1 種透過各種花招在不影響程式碼任何功能的情況下,讓原始程式碼變得難以閱讀、理解的 1 種手段,它無法保護程式碼的安全,但是能提高有心人士企圖理解商業邏輯、偷取程式碼的障礙 。
程式碼混淆的花招包含:
- 置換變數、函數名稱,變成不具任何意義的名字,例如
getUsername()
函數名稱就可能會被換成_0x2b7e()
, 甚至連函數內的變數名稱都會被一併置換 - 用等價的邏輯替換原本程式碼,例如
if else
可能變成用goto
,for
變while
等等 - 直接把換行符號、空格都拿掉,讓所有程式碼擠在同 1 行,或者加入沒有意義程式碼等等,企圖增加閱讀的困擾
- 將程式碼用不同編碼方式進行編碼,並用額外的程式碼在執行時才做解碼執行
- 其他平常根本想不到要這樣做的手段
開發流程上,程式碼混淆會在編譯或者部署之前,確保編譯後的可執行檔,就算被反組譯也難以輕易閱讀理解,或者確保程式碼像 JavaScript 被攤開在陽光下,也無法輕易理解。
p.s. 是散佈出去或要給使用者的程式碼需要程式碼混淆,自己使用/開發的程式碼不需要混淆
通常具有成熟開發流程的開發團隊,或者有經驗的前端工程師、App 工程師都會使用程式碼混淆,提高程式被反組譯後的理解難度,讓他人難以輕易找到關鍵所在。
噢,以 Python, PHP, JavaScript 等語言寫成的惡意程式,也很喜歡用程式碼混淆的手段藉此提高偵測與研究的難度(芙莉蓮你竟敢用我的魔法對付我XD)。
以上,就是程式碼混淆的介紹。