天天看點

加強的概念與方式加強

加強

app面臨的威脅

App主要面臨的威脅有,反編譯,二次打包,動态調試,hook等

為什麼需要加強

加強是為了保護APK不被别人逆向分析,保護程式核心代碼

加殼概念

加殼通常是對dex檔案進行加密存儲,在程式運作的時候由可程式将dex檔案解密到執行

  1. dex

    由apktool等工具可以輕易的逆向得出代碼

  2. 通過殼程式對dex加密
  3. 将加密的dex放入apk得到加密apk

    當使用apktool逆向時,不能得到或得到很少量的代碼。并且那可能隻是殼程式的代碼

  4. 最後在運作時,殼程式會最先運作,然後對dex進行解密

四個發展階段

  1. 一代殼:dex動态加密

    對dex整體加密,加密之後放在apk的目錄中。一些簡單的加強程式,可能隻是對dex檔案進行了一些修改(例如修改檔案字尾名,或是修改dex檔案的頭資訊)

    可以對殼檔案進行修複後逆向

    殼程式在運作的時候,會将完整的dex程式釋放到記憶體中。那麼在記憶體中是完整的、解密的。是以可以對記憶體扣取,将記憶體中的dex檔案進行拷貝

  2. 二代殼:代碼抽取

    将dex檔案的一些函數,提取出來放入so檔案中。相對于smali、java代碼來說,so檔案的逆向是比較有難度的。

    但二代殼在運作時依舊會在記憶體釋放出完整、解密的dex檔案,是以依舊可以通過記憶體dump把記憶體中的dex檔案提取出來

  3. 三代殼:動态解密

    同樣将java中的一些代碼進行本地化,寫入so檔案中。但是相對二代殼,三代殼隻有在函數調用的時候才釋放到記憶體中,那麼記憶體中的dex檔案就是不完整的。

    針對三代殼呢,一般是通過hook架構,對apk中的所有函數進行調用。那麼他的所有函數都會釋放到記憶體中。也就可以對記憶體進行dump操作了。

  4. 四代殼:VMP虛拟機加密

    解決了以上三代殼所有弊端

    使用虛拟機對指令進行加密。類似自行實作了一個dalvik虛拟機,對dex進行加密後,隻有它自己的虛拟機可以對程式進行解密運作。常用的apktool工具反編譯出來也不認識這個代碼。

代碼混淆

  1. 名稱混淆

    将類名、函數名替換成随機的字元串

    逆向時,常通過函數名來找到關鍵功能。而對類名和函數名進行随機替換後,能增大逆向工作者閱讀代碼的難度。

  2. 邏輯混淆

    打亂代碼執行流程,增加逆向人員分析程式的難度

    簡單的程式逆向後可以輕松分辨其功能,而邏輯混淆會增加大量代碼,較難從中分析出有用的代碼。

反調試

  1. java層反調試

    逆向工程師可以通過jdb調試工具對apk進行java代碼調試

    為了防止apk被調試

    AndroidMainfest.xml, Android:debuggable=false/true

    繞過這種反調試隻需要修改false/true即可

  2. so層反調試
    很多核心功能寫在so中,是以需要對so進行反調試

    Ptrace防護:

    通過對父程序進行附加(附加一個子程序),這樣ida就無法對父程序進行附加了。

    雙ida,一個ida附加子程序,這時候子程序就處于暫停狀态,是以就失效了。可以使用另一個ida附加父程序

    三向抱死

    子程序 附加 父程序

    子子程序 附加 子程序

    父程序 附加 子子程序

    需要修改安卓的fork源碼,使得附加失效(無法建立子程序)。這樣ida就可以對父程序進行附加

  3. tacePID反調試

    通過檢查TracePid的值是否為0來判斷目前程序是否被調試

    可以通過使用ida的debug的單步調試,找到判斷tracePid的代碼位置,然後修改tracePid為零進而繞過該反調試。

反注入

程式在運作時會加載自身是以來的so檔案,注入就是讓程式加載我們自己的so檔案。判斷是否被注入,如果被注入,程式就結束。