• <noscript id="yywya"><kbd id="yywya"></kbd></noscript>
  • 發布時間:2020-10-05 18:21 原文鏈接: 淺談安卓apk加固原理和實現(二)

    (3)Dex文件整體加固原理

    淺談安卓apk加固原理和實現

    上圖對象解析:

    源apk:需要加密的apk程序,源dex來自于源apk

    殼程序:Android工程,提供殼dex,殼dex主要作為工程入口,解密出源dex,映射到源dex等操作

    加密程序:java工程,主要是做對源dex加密且和殼dex合并成新dex的操作

    (4)整個工程加載原理

    APP啟動——>自定義Application中attachBaseContext()方法——>自定義Application工程onCreate()方法——>源Application

    1、自定義Application來自于殼程序的dex,加密合成的新dex前半部分就是殼程序的dex,這部分是沒任何問題,可以正常加載。該Application中attachBaseContext方法會做解密操作,解密出源dex并放置在固定目錄下,添加dex的加載映射;映射到源dex目錄。

    2、自定義Application工程onCreate()方法添加源dex加載的入口;即源dex的application和mainActivity。

    3、程序正常啟動;源dex被正確加載。

    三、apk加固實現

    準備:

    SourceProject

    需要加密源程序,自定義application為:

    com. targetapk

    MyApplication,主activity為:

    com. targetapk.MainActivity

    jiaguApk:java工程,dex加密合并操作

    shellApk:android工程,提供殼dex;自定義Application設定為:

    org.hackcode.ProxyApplication

    SourceProject是簡單的Android工程demo,編譯生成生成被殼加密的sourceProject.apk

    jiaguApk是主要作用是加密源sourceProject.apk中dex文件;然后拼接到殼dex后面生成新的dex

    shellApk是殼工程,主要是作為加密后apk的偽入口,加密后的apk工程會先加載殼工程提供Application:org.hackcode.ProxyApplication,解密、映射等操作

    整體加密步驟:

    1.反編譯目標app(sourceProject.apk),得到sourceProject文件;sourceProject.apk來源于SourceProject工程

    2.修改sourceProject文件中的manifest文件,將自定義Application設定為“org.hackcode.ProxyApplication”

    3.拿到sourceProject文件中的dex文件,壓縮為TargetApk.zip

    4.反編譯殼apk:apktool.bat d shellApk.apk,得到shellApk文件

    5.拿到shellApk文件下的classes.dex和TargetApk.zip,加密合成新的classes.dex文件

    6.新合成的class.dex替換sourceProject文件中的class.dex

    7.刪除sourceProject文件中的META-INF文件,重壓縮成zip文件

    8.重新簽名

    步驟2主要是是為了加載殼dex中的代碼;正確解析dex。

    步驟6主要是jiaguApk工程的工作。

    jiaguApk關鍵代碼

    淺談安卓apk加固原理和實現

    以上代碼主要作用是源程序dex壓縮成TargetApk.zip后加密,加密后拼接在殼dex的后面,然后生成新的dex文件,dex文件修改頭部參數,保證dex文件正確讀取。

    此時生成的新的dex文件前部分是能正確被運行的殼dex的代碼。

    shellApk殼工程關鍵代碼

    淺談安卓apk加固原理和實現

    attachBaseContext方法:

    主要作用是程序apk中dex拷貝、解密出源dex放在data/data目錄下;設置dex加載目錄映射。

    淺談安卓apk加固原理和實現

    onCreate:

    主要作用替換源應用dex的application,使解密出的源dex正確加載;保證源入口正確,保證項目正確加載。

    以上就是apk加殼實現整個過程。實現起來基本沒什么問題,需要注意的點是源工程有多dex問題:源程序中有多個dex的時候,多個dex同時一塊壓縮成TargetApk.zip,然后其他步驟不變。親測沒問題!

    四、apk該方式加固后缺陷

    (1)首次打開加載慢的問題。加固后的工程首次打開會有延時,延時時間會跟源工程的dex大小有關。就拿普元客戶端來說,里面有兩個dex,總共有8M左右;加固后首次打開會慢3s左右;而且以后每次打開會有2s左右的延時。

    (2)安全性問題。大家會發現源dex文件還是會落地,在工程的data/data目錄下面,越獄的手機可以直接看到。拿到dex資源,一樣可以通過反編譯拿到java代碼。網上有不落地的方法,嘗試一直沒有成功;如果哪位大神有可行方法的話,歡迎分享交流。

    精選提問:

    問1:能講講.so加固嗎?

    答:.so反編譯比較困難,比dex的反編譯困難。一般做法是抽取Android工程的關鍵java代碼轉為c/c++, 然后生成so文件。so加密我只是了解了一下破壞.so部分頭文件的方式加固。

    問2:加固里面的VMP(虛擬機)是什么?

    答:VMP(虛擬軟件保護技術)大概思路就是自定義一套虛擬機指令和對應的解釋器,并將標準的指令轉換成自己的指令,然后由解釋器將自己的指令給對應的解釋器。


  • <noscript id="yywya"><kbd id="yywya"></kbd></noscript>
  • 东京热 下载