程式碼混淆的重要性
作為開發人員工作最令人沮喪的是花一整天除錯程式碼 - 但你很快就會知道這還只是工作的一部分。:)
在完成構建、除錯和部署應用程式的所有工作之後,你最不希望的是讓其他人crack並重用所有這些程式碼成果,值得慶幸的是,一種稱為程式碼混淆的常見編碼實踐可以幫助保護你的工作。在本文中,我將向您介紹程式碼混淆的基礎知識。
什麼是原始碼混淆?
程式碼混淆是故意模糊原始碼的行為,使人類很難理解,並使對可能別有用心的黑客無用。它也可能用於阻止軟體的逆向工程。
從本質上講,混淆完全改變了原始碼; 儘管如此,它仍然在功能上等同於原始程式碼。
混淆與加密不同。加密的目的是轉換資料以使其對其他人保密。混淆的目的是使人類難以理解資料。加密程式碼總是需要在執行前解密,而混淆不要求程式碼經過去混淆來執行它。
混淆是如何工作的
程式碼混淆由幾種不同的技術組成,每種技術都建立在另一種之上,從而使程式碼難以理解。以下是一些使用的混淆技術。
1. 重新命名混淆:重新命名基本上修改了變數和方法名稱,使人們很難理解程式碼。但是,它仍然保持程式執行行為。這種基本技術最常用於Android,Java和IOS混淆器。
2. 字串加密:雖然重新命名技術只是改變變數和方法名稱,但字串加密意圖並加密所有清晰可讀的字串。(應該注意,使用此技術,在執行時解密字串可能會導致較小的執行時效能損失。)
3. 虛擬程式碼插入:這與將程式碼插入可執行檔案有關。這種技術使得反向工程程式碼很難被分析。但是,插入不會影響程式的邏輯和/或執行。
在混淆之前:
function sayHello(){
console.log("Hello World");
}
sayHello();
混淆之後:
var _0x12b3=["\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72\x6C\x64","\x6C\x6F\x67"];
function sayHello(){console[_0x12b3[1]](_0x12b3[0])}sayHello()
為什麼要使用程式碼混淆器?
1. 一旦開發了Android應用程式(或任何應用程式),你的目標應該是讓攻擊者更難以檢視程式碼並分析應用程式。
2. 隱藏業務邏輯和程式碼,以使攻擊者更難獲取訪問許可權並開始除錯和篡改您的應用程式至關重要。(他們經常使用惡意程式碼重新打包應用程式。)
3.程式碼混淆可以大大減少檔案大小,並且下載時間也可以大大減少。(以JavaScript為例)
4.人們正在從逆向工程中開展職業生涯 - 因此,你想盡可能地讓它們變得更加困難。
5.為客戶開發應用程式的公司可能不希望他們的客戶能夠閱讀它們。
使用混淆器的缺點
1.在某些情況下,AVG AntiVirus等防病毒軟體會在您訪問已被混淆的站點時提醒您(因為混淆的目的之一是隱藏惡意程式碼)。然而,在出於安全原因進行混淆的情況下,它可能阻止使用者使用或訪問站點。
2.某些技術可能會對演算法的效能產生負面影響。
以下是您可以使用的一些工具:
.NET:Dotfuscator,ILProtector
JavaScript:Javascript Obfuscator,Jscrambler
Android:ProGuard
最後的想法
儘管混淆可能使程式的讀取和逆向工程變得困難且耗時,但這並不是不可能的。重要的是要記住,雖然程式碼混淆可以很好地掩蓋原始碼,但是沒有混淆器可以保證最大的安全性。因此,在安全性非常重要的情況下,您將需要使用其他措施,包括各種加密方案。