指南:代碼混淆逆向工程

已發表: 2021-11-17

代碼混淆圖形是用於防止應用程序黑客攻擊的最流行的應用程序安全方法之一。 它是世界各地安全專家最常建議的 AppSec 工作之一,它通常會照顧您的應用程序非常最低的安全要求。 這種策略經常被用作抵禦黑客攻擊的主要防禦機制,並防止代碼注入、逆向工程以及篡改客戶和應用程序用戶的個人信息等典型威脅。

混淆代碼?

混淆可執行文件使其不再可理解、可理解或實用的做法稱為代碼混淆。 源代碼被混淆到第三方難以理解和難以掌握的程度,更不用說執行了。 最終用戶 ui 或代碼的預期輸出不受模糊性的影響。 這只是一個預防步驟,可以使任何有權訪問軟件可執行代碼的潛在黑客無法使用該代碼。

為什麼需要混淆代碼?

代碼的混淆對於開源軟件來說尤其重要,因為開源軟件在個人利益的可黑客性方面具有明顯的劣勢。 開發人員通過使程序難以進行逆向工程來保證其產品的知識產權免受安全風險、非法訪問和發現應用程序缺陷的影響。

無論使用哪種類型的隱藏技術,這種方法都會限制危險的源代碼並確保不同級別的程序安全性。 時間、成本和資源的原因都傾向於在代碼被混淆時放棄代碼,因為反編譯的代碼變得難以辨認。

代碼混淆技術

混淆在不同層次上起作用:它可以在語義/詞法代碼結構層次或數據結構/控制流層次上實現。 混淆策略也因對代碼的操作而異。 從本質上講,安全團隊與開發團隊合作確定對代碼使用的混淆類型。

混淆應該重命名。

這種方法需要混淆命名變量,以便巧妙地隱藏使用它們的實際目的。 反編譯器很難理解控制流,因為方法和變量是用各種符號和數字重命名的。 這種混淆方法常用於偽裝Java、.NET、Android平台應用程序代碼。 這被歸類為佈局混淆,因為它直接針對源代碼為應用程序提供保護層。

數據混淆

這種方法側重於代碼中使用的數據結構,使黑客無法訪問程序的真正目標。 這可能需要改變軟件在內存中存儲數據的方式,以及如何處理數據以產生最終結果。 此過程可以通過多種方式完成:

1.聚合的混淆
因此,數據在軟件中的保存方式發生了變化。 例如,數組可能會被分成多個子數組,然後可以在整個程序中引用這些子數組。

2.數據存儲的混淆
這會影響數據在內存中的存儲方式。 例如,開發人員可以在局部和全局變量存儲之間進行混洗,以掩蓋變量行為的真實性質。

3. 按需獲取混淆
這種方法改變了數據的順序而不改變程序/代碼片段的功能。 開發人員通過創建一個為變量引用的每個實例調用的不同模塊來實現這一點。

4.加密字符串
這種技術會加密所有可讀的字符串,導致代碼難以辨認。 當軟件運行時,它們必須在運行時解密。

5. 控制/代碼流的混淆
控制從代碼庫的一部分傳輸到另一部分的方式對於確定程序的目標至關重要。 混淆這個流程通常是扭曲遊戲流程的最有利可圖的方式。 這種混淆策略使黑客難以弄清楚代碼是如何以及為什麼遵循特定路徑的,從而使他們無法自拔。

包含隨機和意外語句,以及永遠不會執行的不必要的 case-switch 語句(死代碼),是實現這種混淆策略的最流行方法之一。 這些斷言除了使目標黑客感到困惑之外沒有其他功能。 在條件程序定向的情況下,程序執行語句順序的這種變化是非常有用的。

正在調試混淆。

調試信息在通過反編譯和重新編譯源代碼來確定有關程序流程和缺陷的重要信息時通常很有用。 通過更改身份、行號或完全關閉對調試數據的訪問來隱藏此類識別數據至關重要。

應解決混淆問題。

內存編程錯誤在攻擊中越來越普遍,尤其是在 C 和 C++ 等非內存安全語言中。 安全漏洞通常是由不受控制的陣列訪問等錯誤引起的。 地址混淆方法使逆向工程變得困難,因為每次執行轉換後的代碼時,程序的代碼和數據的虛擬地址都是隨機的。 因此,大多數內存錯誤攻擊都是非確定性的,成功的可能性非常低。

個性化編碼

開發人員使用這種方法通過自定義算法加密字符串,然後提供解碼器功能來恢復原始代碼。

運行時傳遞的參數

可以修改程序,使其在運行時需要參數。 為了解碼變量,用戶必須同時擁有代碼和解密密鑰。

為了開發一種分層防禦方法來保護應用程序免受各種安全威脅,安全團隊可能會選擇同時部署一種以上的技術。

結論

總而言之,僅靠誤導是無法解決高級安全問題的。 由於人工智能軟件的可用性和黑客的技能,對代碼進行反混淆比較困難,但這並非不可能。 因此,密碼學並不是解決所有軟件安全問題的靈丹妙藥。
開發團隊可能會使用各種代碼混淆方法在不受信任的環境中保護他們的代碼,具體取決於安全需求、程序的性質和性能基準。 這些應該在考慮每種方法的優點和缺點的同時進行。 此策略應支持其他 AppSec 計劃,例如加密、RASP、數據保留規定等。 當與 AppSealing 等 RASP 解決方案結合使用時,它成為解決當今安全問題的有效解毒劑。