淺談安卓開發代碼混淆技術

前言

隨着移動互聯網的快速發展,應用的安全問題不斷涌現出來,因而愈來愈多的應用開發者將核心代碼由java層轉到native層,以對抗成熟的java逆向分析工具,然而若是native層的代碼若是沒有進行任何保護,仍是比較容易被逆向分析工做者獲取其運行邏輯,進而完成應用破解或者進行其餘的操做。那麼提升native代碼的安全性有什麼好辦法嗎?答案是確定的,今天咱們就來介紹一種有效對抗native層代碼分析的方法——代碼混淆技術。
那麼,什麼是代碼混淆呢?代碼混淆的學術定義以下:代碼混淆(code obfuscation)是指將計算機程序的代碼,轉換成一種功能上等價,所謂功能上的等價是指其在變換先後功能相同或相近。其解釋以下:程序P通過混淆變換爲P‘,若P沒有結束或錯誤結束,那麼P’也不能結束或錯誤結束;並且P‘程序的結果應與程序P具備相同的輸出。不然P’不是P的有效的混淆。java

    

  目前對於混淆的分類,廣泛是以Collberg 的理論爲基礎,分爲佈局混淆(layout obfuscation)、數據混淆(data obfuscation)、控制混淆(control obfuscation)和預防混淆(preventive obfuscation)這四種類型。程序員

佈局混淆

  佈局混淆是指刪除或者混淆軟件源代碼或者中間代碼中與執行無關的輔助文本信息,增長攻擊者閱讀和理解代碼的難度。軟件源代碼中的註釋文本、調試信息能夠直接刪除,用不到的方法和類等代碼或數據結構也能夠刪除,這樣便可以使攻擊者難以理解代碼的語義,也能夠減少軟件體積,提升軟件裝載和執行的效率。軟件代碼中的常量名、變量名、類名和方法名等標識符的命名規則和字面意義有利於攻擊者對代碼的理解,佈局混淆經過混淆這些標識符增長攻擊者對軟件代碼理解的難度。標識符混淆的方法有多種,例如哈希函數命名、標識符交換和重載概括等。哈希函數命名是簡單地將原來標識符的字符串替換成該字符串的哈希值,這樣標識符的字符串就與軟件代碼不相關了;標識符交換是指先收集軟件代碼中全部的標識符字符串,而後再隨機地分配給不一樣的標識符,該方法不易被攻擊者察覺;重載概括是指利用高級編程語言命名規則中的一些特色,例如在不一樣的命名空間中變量名能夠相同,使軟件中不一樣的標識符儘可能使用相同的字符串,增長攻擊者對軟件源代碼的理解難度。佈局混淆是最簡單的混淆方法,它不改變軟件的代碼和執行過程。編程

數據混淆

  數據混淆是修改程序中的數據域,而對代碼段不做處理。經常使用的數據混淆方式有合併變量、分割變量、數組重組、字符串加密等。合併變量是將幾個變量合併爲一個數據,原來的每一個變量佔據其中一個區域,相似於一個大的數據結構。分割變量則是將一個變量分割爲兩個變量,對分割先後提供一種映射關係,將對一個變量的操做轉化爲對分割後兩個變量的操做。
  數組重組有數組的分割、合併、摺疊和平滑等幾種方式。分割是將一個數組分紅2個或多個相同維度的數組;合併則相反;摺疊是增長數組的維數;平滑則是相反。在ELF文件中,全局變量和常量字符串存放在數據段中,反彙編工具能夠輕易查找到字符串與代碼之間的引用關係。在軟件破解中,經過一些字符串提示能夠很方便的找到代碼關鍵語句,從而破解軟件。字符串加密則能夠對這些明顯的字符串進行加密存儲,在須要時再進行解密。數組

控制混淆

  控制混淆也稱流程混淆,它是改變程序的執行流程,從而打斷逆向分析人員的跟蹤思路,達到保護軟件的目的。通常採用的技術有插入指令、假裝條件語句、斷點等。假裝條件語句是當程序順序執行從A到B,混淆後在A和B之間加入條件判斷,使A執行完後輸出TRUE或FALSE,但不論怎麼輸出,B必定會執行。控制混淆採用比較多的還有模糊謂詞、內嵌外聯、打破順序等方法。
  模糊謂詞是利用消息不對稱的原理,在加入模糊謂詞時其值對混淆者是已知的,而對反混淆者卻很難推知。因此加入後將干擾反彙編者對值的分析。模糊謂詞的使用通常是插入一些死的或不相關的代碼(bogus code),或者是插入在循環或分支語句中,打斷程序執行流程。
  內嵌(in-line)是將一小段程序嵌入到被調用的每個程序點,外聯(out-line)是將沒有任何邏輯聯繫的一段代碼抽象成一段可被屢次調用的程序。
打破順序是指打破程序的局部相關性。因爲程序員每每傾向於把相關代碼放在一塊兒,經過打破順序改變程序空間結構,將加大破解者的思惟跳躍。安全

預防混淆

  預防混淆通常是針對專用的反編譯器設計的,目的就是預防被這類反編譯器反編譯。他是利用特定的反編譯器或反混淆器的弱點進行專門設計。預防混淆對於特定的反編譯器很是有效,因此在使用時要綜合利用各類反編譯器的特色進行設計。數據結構

總結

  騰訊御安全保護方案提供了以上所述四種混淆分類的多維度的保護;佈局混淆方面:提供了針對native代碼層中的函數名進行了混淆刪除調試信息等功能;數據混淆方面:提供了針對常量字符串加密及全局變量的混淆的功能;控制混淆方面:針對代碼流程上,提供了扁平化,插入bogus 分支以及代碼等價變換等功能;預防混淆方面:在混淆過程當中加入了針對主流反編譯器的預防混淆的代碼,可以有效地抵抗其分析。此外還對應用開發者提供不一樣等級的保護力度及多種混淆方式的功能的選擇,用戶能夠根據本身的需求定製不一樣的混淆功能保護。安全保護方案除了提供代碼混淆保護方面的技術,還提供代碼虛擬化技術及反逆向、反調試等其餘應用安全加固方案,綜合使用多種代碼保護方案能夠有效地提升應用代碼安全。編程語言

更多內容可瀏覽:騰訊御安全技術博客(http://blog.yaq.qq.com/blog函數

相關文章
相關標籤/搜索