白話文解說 Code Obfuscation / 程式碼混淆

有些程式語言屬於腳本(script)語言,完全不需要經過編譯,所以散佈這些程式時就直接以原本樣貌散佈。舉個最常見的例子,就是網頁上的 JavaScript 程式碼,只要使用開發者工具(DevTools)就能夠檢視這些程式碼,甚至可以複製關鍵程式碼回去使用。

另外,就算是編譯過的程式,其實也能透過若干手段逆向還原出原本的程式碼,譬如 Android 的 APK 檔,也可以用 APK decompiler 等工具做反編譯,進而取得原始碼,甚至有個知名軟體 IDA Pro 也能反組譯 Linux, Windows, macOS 相關的執行檔。

所以如何保護關鍵程式碼不僅僅是腳本語言的問題,連編譯語言都得面對。

這個問題其中 1 個答案是—— Code obfuscation, 又稱程式碼混淆。

它是 1 種透過各種花招在不影響程式碼任何功能的情況下,讓原始程式碼變得難以閱讀、理解的 1 種手段,它無法保護程式碼的安全,但是能提高有心人士企圖理解商業邏輯、偷取程式碼的障礙

程式碼混淆的花招包含:

  1. 置換變數、函數名稱,變成不具任何意義的名字,例如 getUsername() 函數名稱就可能會被換成 _0x2b7e() , 甚至連函數內的變數名稱都會被一併置換
  2. 用等價的邏輯替換原本程式碼,例如 if else 可能變成用 goto , forwhile 等等
  3. 直接把換行符號、空格都拿掉,讓所有程式碼擠在同 1 行,或者加入沒有意義程式碼等等,企圖增加閱讀的困擾
  4. 將程式碼用不同編碼方式進行編碼,並用額外的程式碼在執行時才做解碼執行
  5. 其他平常根本想不到要這樣做的手段

開發流程上,程式碼混淆會在編譯或者部署之前,確保編譯後的可執行檔,就算被反組譯也難以輕易閱讀理解,或者確保程式碼像 JavaScript 被攤開在陽光下,也無法輕易理解。

p.s. 是散佈出去或要給使用者的程式碼需要程式碼混淆,自己使用/開發的程式碼不需要混淆

通常具有成熟開發流程的開發團隊,或者有經驗的前端工程師、App 工程師都會使用程式碼混淆,提高程式被反組譯後的理解難度,讓他人難以輕易找到關鍵所在。

噢,以 Python, PHP, JavaScript 等語言寫成的惡意程式,也很喜歡用程式碼混淆的手段藉此提高偵測與研究的難度(芙莉蓮你竟敢用我的魔法對付我XD)。

以上,就是程式碼混淆的介紹。

Facebook Threads X

對抗久坐職業傷害

研究指出每天增加 2 小時坐著的時間,會增加大腸癌、心臟疾病、肺癌的風險,也造成肩頸、腰背疼痛等常見問題。

然而對抗這些問題,卻只需要工作時定期休息跟伸展身體即可!

你想輕鬆改變現狀嗎?試試看我們的 PomodoRoll 番茄鐘吧! PomodoRoll 番茄鐘會根據你所設定的專注時間,定期建議你 1 項辦公族適用的伸展運動,幫助你打敗久坐所帶來的傷害!

贊助我們的創作

看完這篇文章了嗎? 休息一下,喝杯咖啡吧!

如果你覺得 MyApollo 有讓你獲得實用的資訊,希望能看到更多的技術分享,邀請你贊助我們一杯咖啡,讓我們有更多的動力與精力繼續提供高品質的文章,感謝你的支持!