加強
app面臨的威脅
App主要面臨的威脅有,反編譯,二次打包,動态調試,hook等
為什麼需要加強
加強是為了保護APK不被别人逆向分析,保護程式核心代碼
加殼概念
加殼通常是對dex檔案進行加密存儲,在程式運作的時候由可程式将dex檔案解密到執行
-
dex
由apktool等工具可以輕易的逆向得出代碼
- 通過殼程式對dex加密
-
将加密的dex放入apk得到加密apk
當使用apktool逆向時,不能得到或得到很少量的代碼。并且那可能隻是殼程式的代碼
- 最後在運作時,殼程式會最先運作,然後對dex進行解密
四個發展階段
-
一代殼:dex動态加密
對dex整體加密,加密之後放在apk的目錄中。一些簡單的加強程式,可能隻是對dex檔案進行了一些修改(例如修改檔案字尾名,或是修改dex檔案的頭資訊)
可以對殼檔案進行修複後逆向
殼程式在運作的時候,會将完整的dex程式釋放到記憶體中。那麼在記憶體中是完整的、解密的。是以可以對記憶體扣取,将記憶體中的dex檔案進行拷貝
-
二代殼:代碼抽取
将dex檔案的一些函數,提取出來放入so檔案中。相對于smali、java代碼來說,so檔案的逆向是比較有難度的。
但二代殼在運作時依舊會在記憶體釋放出完整、解密的dex檔案,是以依舊可以通過記憶體dump把記憶體中的dex檔案提取出來
-
三代殼:動态解密
同樣将java中的一些代碼進行本地化,寫入so檔案中。但是相對二代殼,三代殼隻有在函數調用的時候才釋放到記憶體中,那麼記憶體中的dex檔案就是不完整的。
針對三代殼呢,一般是通過hook架構,對apk中的所有函數進行調用。那麼他的所有函數都會釋放到記憶體中。也就可以對記憶體進行dump操作了。
-
四代殼:VMP虛拟機加密
解決了以上三代殼所有弊端
使用虛拟機對指令進行加密。類似自行實作了一個dalvik虛拟機,對dex進行加密後,隻有它自己的虛拟機可以對程式進行解密運作。常用的apktool工具反編譯出來也不認識這個代碼。
代碼混淆
-
名稱混淆
将類名、函數名替換成随機的字元串
逆向時,常通過函數名來找到關鍵功能。而對類名和函數名進行随機替換後,能增大逆向工作者閱讀代碼的難度。
-
邏輯混淆
打亂代碼執行流程,增加逆向人員分析程式的難度
簡單的程式逆向後可以輕松分辨其功能,而邏輯混淆會增加大量代碼,較難從中分析出有用的代碼。
反調試
-
java層反調試
逆向工程師可以通過jdb調試工具對apk進行java代碼調試
為了防止apk被調試
AndroidMainfest.xml, Android:debuggable=false/true
繞過這種反調試隻需要修改false/true即可
- so層反調試
很多核心功能寫在so中,是以需要對so進行反調試
Ptrace防護:
通過對父程序進行附加(附加一個子程序),這樣ida就無法對父程序進行附加了。
雙ida,一個ida附加子程序,這時候子程序就處于暫停狀态,是以就失效了。可以使用另一個ida附加父程序
三向抱死
子程序 附加 父程序
子子程序 附加 子程序
父程序 附加 子子程序
需要修改安卓的fork源碼,使得附加失效(無法建立子程序)。這樣ida就可以對父程序進行附加
-
tacePID反調試
通過檢查TracePid的值是否為0來判斷目前程序是否被調試
可以通過使用ida的debug的單步調試,找到判斷tracePid的代碼位置,然後修改tracePid為零進而繞過該反調試。
反注入
程式在運作時會加載自身是以來的so檔案,注入就是讓程式加載我們自己的so檔案。判斷是否被注入,如果被注入,程式就結束。