當前位置:編程學習大全網 - 編程語言 - 如何防止Android程序被反編譯

如何防止Android程序被反編譯

代碼混淆(code obfuscation)是指將計算機程序的代碼,轉換成壹種功能上等價,所謂功能上的等價是指其在變換前後功能相同或相近。其解釋如下:程序P經過混淆變換為P‘,若P沒有結束或錯誤結束,那麽P’也不能結束或錯誤結束;而且P‘程序的結果應與程序P具有相同的輸出。否則P’不是P的有效的混淆。

目前對於混淆的分類,普遍是以Collberg 的理論為基礎,分為布局混淆(layout obfuscation)、數據混淆(data obfuscation)、控制混淆(control obfuscation)和預防混淆(preventive obfuscation)這四種類型。

1. 布局混淆

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

2. 數據混淆

數據混淆是修改程序中的數據域,而對代碼段不作處理。常用的數據混淆方式有合並變量、分割變量、數組重組、字符串加密等。

合並變量是將幾個變量合並為壹個數據,原來的每個變量占據其中壹個區域,類似於壹個大的數據結構。分割變量則是將壹個變量分割為兩個變量,對分割前後提供壹種映射關系,將對壹個變量的操作轉化為對分割後兩個變量的操作。

數組重組有數組的分割、合並、折疊和平滑等幾種方式。分割是將壹個數組分成2個或多個相同維度的數組;合並則相反;折疊是增加數組的維數;平滑則是相反。

在ELF文件中,全局變量和常量字符串存放在數據段中,反匯編工具可以輕易查找到字符串與代碼之間的引用關系。在軟件破解中,通過壹些字符串提示可以很方便的找到代碼關鍵語句,從而破解軟件。字符串加密則可以對這些明顯的字符串進行加密存儲,在需要時再進行解密。

3. 控制混淆

控制混淆也稱流程混淆,它是改變程序的執行流程,從而打斷逆向分析人員的跟蹤思路,達到保護軟件的目的。壹般采用的技術有插入指令、偽裝條件語句、斷點等。偽裝條件語句是當程序順序執行從A到B,混淆後在A和B之間加入條件判斷,使A執行完後輸出TRUE或FALSE,但不論怎麽輸出,B壹定會執行。

控制混淆采用比較多的還有模糊謂詞、內嵌外聯、打破順序等方法。

模糊謂詞是利用消息不對稱的原理,在加入模糊謂詞時其值對混淆者是已知的,而對反混淆者卻很難推知。所以加入後將幹擾反匯編者對值的分析。模糊謂詞的使用壹般是插入壹些死的或不相關的代碼(bogus code),或者是插入在循環或分支語句中,打斷程序執行流程。

內嵌(in-line)是將壹小段程序嵌入到被調用的每壹個程序點,外聯(out-line)是將沒有任何邏輯聯系的壹段代碼抽象成壹段可被多次調用的程序。

打破順序是指打破程序的局部相關性。由於程序員往往傾向於把相關代碼放在壹起,通過打破順序改變程序空間結構,將加大破解者的思維跳躍。

4. 預防混淆

預防混淆壹般是針對專用的反編譯器設計的,目的就是預防被這類反編譯器反編譯。他是利用特定的反編譯器或反混淆器的弱點進行專門設計。預防混淆對於特定的反編譯器非常有效,所以在使用時要綜合利用各種反編譯器的特點進行設計。

  • 上一篇:語音帶寬是什麽?
  • 下一篇:計算機應用專業人才需求每年增100萬
  • copyright 2024編程學習大全網