游戏类App开发完成后试运行阶段,发现存在反编译漏洞,被建议可使用代码混淆、代码虚拟化进行一下代码保护,想了解下这个过程是怎么实现的,需要提供源代码么?
天蓬老师2017-04-17 17:36:49
1.1什麼是程式碼虛擬化?
我們知道程式的執行,是依賴CPU對於符合規範的指令集的解析處理。如果將原指令集透過自訂規範進行變形處理,產生新的指令集(稱為虛擬指令集),CPU將無法辨識虛擬指令。此時若配合能夠解析虛擬指令集的解釋器(稱為虛擬機器),就可以達到不直接透過CPU而是透過虛擬機器來執行虛擬指令。這個過程就叫做程式碼的虛擬化。
ARM平台程式碼保護之虛擬化
1.2為何將程式碼虛擬化?
為了避免App資源被竊取、網路協定被破解、遊戲被外掛摧毀等情況出現,越來越多的開發者不得不投入更多的時間和精力來考慮程式碼安全問題。但在行動平台上,攻和防卻是不對等的,攻擊者往往比防禦者擁有更高等級的權限。隨著技術材料的普及,使得行動平台的逆向分析變得容易,也有眾多安全高手推出了許多加殼產品,雖說加殼以後對抗靜態分析會有不錯的效果,可是運行後會在內存裡暴露原本的程式碼,從而使得攻擊者抓住窗口期dump內存,再進行必要的修復,即可在IDA裡面進行閱讀分析。 將程式碼虛擬化後,可防止上述情況的發生,即使被dump,IDA也無法讀取被虛擬化的程式碼,因為程式執行時並不會將虛擬指令集還原為原生指令集。所以攻擊者只能轉而去分析邏輯複雜度極高的虛擬機器。這樣大大增加了程式碼分析的難度和所需的時間,若配合混淆等手段,相信絕大部分攻擊者會望而卻步。
當然,為了相對的安全也會付出相對的損失。虛擬指令集的執行效率會比原生指令集稍低一些,所以被虛擬化保護的程式碼往往都是最關鍵、最核心的部分。
1.3如何將程式碼虛擬化?
基於上述理論,我們發現有最關鍵的兩個部分是必要的,一是新的指令集,二是虛擬機。對於新的指令集,我們可以暫且將一些帶有opcode的指令進行變形,產生的資料直接回填回原檔案。將檔案拖進IDA後會發現指令已經錯亂,達到抵抗靜態分析的目的。 此時若執行程序,會發生crash,因為還缺了虛擬機器。為什麼叫虛擬機器?因為需要模擬出目前程式碼運作所需的環境,包括暫存器、堆疊等。將所需的虛擬環境初始化後,解析執行虛擬指令,同時注意保護和復原現場。
1.4如何使用相關的加強技術?
市面上已有的加固產品如騰訊禦安全等,已經實現了ARM平台的程式碼虛擬化保護功能,並綜合了安卓加密壓縮殼、安卓apk程式碼混淆等主流功能,對於動靜態分析有著較強的防禦能力。同時,應用安全加固服務完全基於二進位檔案操作,無需行動應用開發者提供原始程式碼,技術比較可靠的第三方安全服務商可以建議開發者使用。