Android應用方法隱藏及反除錯技術淺析

wyzsk發表於2020-08-19
作者: 獵豹科學院 · 2015/10/10 12:20

0x00 前言


Android應用的加固和對抗不斷升級,單純的靜態加固效果已無法滿足需求,所以出現了隱藏方法加固,執行時動態恢復和反除錯等方法來對抗,本文透過例項來分析有哪些對抗和反除錯手段。

0x01 對抗反編譯


首先使用apktool進行反編譯,發現該應用使用的加固方式會讓apktool卡死,透過除錯apktool原始碼(如何除錯apktool可參見前文《Android應用資原始檔格式解析與保護對抗研究》),發現解析時丟擲異常,如下圖:

根據異常資訊可知是readSmallUint出錯,呼叫者是getDebugInfo,檢視原始碼如下:

可見其在計算該偏移處的uleb值時得到的結果小於0,從而丟擲異常。 在前文《Android程式的反編譯對抗研究》中介紹了DEX的檔案格式,其中提到與DebugInfo相關的欄位為DexCode結構的debugInfoOff欄位。猜測應該是在此處做了手腳,在010editor中開啟dex檔案,執行模板DEXTemplate.bt,找到debugInfoOff欄位。果然,該值被設定為了0xFEEEEEEE。

接下來修復就比較簡單了,由於debugInfoOff一般情況下是無關緊要的欄位,所以只要關閉異常就行了。

為了保險起見,在readSmallUint方法後面新增一個新方法readSmallUint_DebugInfo,複製readSmallUint的程式碼,if語句內result賦值為0並註釋掉拋異常程式碼。

然後在getDebugInfo中呼叫readSmallUint_DebugInfo即可。

重新編譯apktool,對apk進行反編譯,一切正常。

然而以上只是開胃菜,雖然apktool可以正常反編譯了,但檢視反編譯後的smali程式碼,發現所有的虛方法都是native方法,而且類的初始化方法

相關文章