(3)Dex文件整體加固原理
上圖對象解析:
源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關鍵代碼
以上代碼主要作用是源程序dex壓縮成TargetApk.zip後加密,加密後拼接在殼dex的後面,然後生成新的dex文件,dex文件修改頭部參數,保證dex文件正確讀取。
此時生成的新的dex文件前部分是能正確被運行的殼dex的代碼。
shellApk殼工程關鍵代碼
attachBaseContext方法:
主要作用是程序apk中dex拷貝、解密出源dex放在data/data目錄下;設置dex加載目錄映射。
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(虛擬軟體保護技術)大概思路就是自定義一套虛擬機指令和對應的解釋器,並將標準的指令轉換成自己的指令,然後由解釋器將自己的指令給對應的解釋器。
關於作者:張存徵,普元移動高級研發工程師,普元移動產品研發團隊成員之一,擁有首鋼集團、郵政集團等移動平臺項目實施研發經驗。
轉載本文需註明出處:微信公眾號EAWorld,違者必究。