【Android 安全】DEX 加密 ( 代理 Application 开发 | multiple-dex-core 依赖库开发 | 配置元数据 | 获取 apk 文件并准备相关目录 )
文章目錄
- 一、multiple-dex-core 依賴庫作用
- 二、配置目錄元數據
- 三、multiple-dex-core 代理 Application
- 四、獲取 apk 文件并準備相關目錄
- 五、相關代碼
參考博客 :
- 【Android 安全】DEX 加密 ( 常用 Android 反編譯工具 | apktool | dex2jar | enjarify | jd-gui | jadx )
在 【Android 安全】DEX 加密 ( 支持多 DEX 的 Android 工程結構 ) 博客中介紹了 DEX 加密工程的基本結構 ,
app 是主應用 , 其 Module 類型是 “Phone & Tablet Module” ,
multiple-dex-core 是 Android 依賴庫 , 其作用是解密并加載多 DEX 文件 , 其 Module 類型是 “Android Library” ,
multiple-dex-tools 是 Java 依賴庫 , 其類型是 “Java or Kotlin Library” , 其作用是用于生成主 DEX ( 主 DEX 的作用就是用于解密與加載多 DEX ) , 并且還要為修改后的 APK 進行簽名 ;
本博客中開始講解 multiple-dex-core 依賴庫開發 ;
一、multiple-dex-core 依賴庫作用
在該依賴庫中 , 最主要的是開發一個 代理 Application , 其主要作用有兩個 :
-
作用一 : 解密并加載多個 DEX 文件 ;
-
作用二 : 將真實的 Application 替換成應用的主 Application ;
二、配置目錄元數據
此處配置的元數據是開發者配置的 , 解壓 dex 文件的 目的文件夾路徑 ;
該路徑在后面開發時會用到 ;
在 app 的 AndroidManifest.xml 的 application 標簽中配置如下元數據 ,
<!-- app_name 值是該應用的 Application 的真實全類名 --><meta-data android:name="app_name" android:value="kim.hsl.multipledex.ProxyApplication"/><!-- DEX 解密之后的目錄名稱 --><meta-data android:name="app_version" android:value="\1.0"/>配置后完整的配置文件內容如下 :
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"package="kim.hsl.dex"><applicationandroid:name="kim.hsl.multipledex.ProxyApplication"android:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme"><!-- app_name 值是該應用的 Application 的真實全類名真實 Application : kim.hsl.dex.MyApplication代理 Application : kim.hsl.multipledex.ProxyApplication --><meta-data android:name="app_name" android:value="kim.hsl.dex.MyApplication"/><!-- DEX 解密之后的目錄名稱版本號 , 完整目錄名稱為 :kim.hsl.dex.MyApplication_1.0 --><meta-data android:name="app_version" android:value="\1.0"/><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>三、multiple-dex-core 代理 Application
在 multiple-dex-core 中 , 主要是開發其 代理 Application ,
在 Application 在 ActivityThread 中被創建之后 , 第一個調用的方法是 attachBaseContext 函數 ,
該函數是 Application 中最先執行的函數 ;
因此在 代理 Application 中 , 主要代碼邏輯都是在 attachBaseContext 函數中開發的 ;
public class ProxyApplication extends Application {/*** 在 Application 在 ActivityThread 中被創建之后,* 第一個調用的方法是 attachBaseContext 函數.* 該函數是 Application 中最先執行的函數.*/@Overrideprotected void attachBaseContext(Context base) {super.attachBaseContext(base);}}四、獲取 apk 文件并準備相關目錄
解密與加載多 dex 文件 , 首先要 解密 dex 文件 , 然后 加載解密后的 dex 文件 ;
加密的 dex 文件都在 apk 文件中 , 首先將 apk 文件解壓 , 放到一個指定的目錄中 ;
獲取 apk 文件 : 獲取當前的 APK 文件, 下面的 getApplicationInfo().sourceDir 就是本應用 APK 安裝文件的全路徑 ;
// 獲取當前的 APK 文件, 下面的 getApplicationInfo().sourceDir 就是本應用 APK 安裝文件的全路徑File apkFile = new File(getApplicationInfo().sourceDir);獲取在 app Module 下的 AndroidManifest.xml 中配置的 元數據 ,
- ① 應用真實的 Application 全類名
- ② 解密后的 dex 文件存放目錄
首先獲取應用信息 ApplicationInfo ,
然后獲取應用信息中的元數據 , 該元數據是 Bundle 類型的 ,
最后從 Bundle 元數據中獲取 app_name 和 app_version 對應的值 , 如果有 , 取出并存入成員變量中 ;
// 獲取在 app Module 下的 AndroidManifest.xml 中配置的元數據,// 應用真實的 Application 全類名// 解密后的 dex 文件存放目錄ApplicationInfo applicationInfo = null;applicationInfo = getPackageManager().getApplicationInfo(getPackageName(),PackageManager.GET_META_DATA);Bundle metaData = applicationInfo.metaData;if (metaData != null) {// 檢查是否存在 app_name 元數據if (metaData.containsKey("app_name")) {app_name = metaData.getString("app_name").toString();}// 檢查是否存在 app_version 元數據if (metaData.containsKey("app_version")) {app_version = metaData.getString("app_version").toString();}}創建相關的目錄 :
創建用戶的私有目錄 : 將 apk 文件解壓到該目錄中 privateDir 路徑是 : /data/data/kim.hsl.multipledex/kim.hsl.multipledex.ProxyApplication_1.0
其中 /data/data/kim.hsl.multipledex/ 是返回的格式目錄 ,
kim.hsl.multipledex.ProxyApplication_1.0 是從元數據中獲取的目錄 ;
// 創建用戶的私有目錄 , 將 apk 文件解壓到該目錄中File privateDir = getDir(app_name + "_" + app_version, MODE_PRIVATE);創建解壓后的 apk 文件目錄 : 上述目錄下創建 app 目錄 , 創建該目錄的目的是 存放 解壓后的 apk 文件的 ;
// 在上述目錄下創建 app 目錄// 創建該目錄的目的是存放解壓后的 apk 文件的File appDir = new File(privateDir, "app");創建 dex 文件目錄 : app 中存放的是解壓后的所有的 apk 文件 , app 下創建 dexDir 目錄 , 將所有的 dex 目錄移動到該 deDir 目錄中 , dexDir 目錄存放應用的所有 dex 文件 , 這些 dex 文件都需要進行解密 ;
// app 中存放的是解壓后的所有的 apk 文件// app 下創建 dexDir 目錄 , 將所有的 dex 目錄移動到該 dexDir 目錄中// dexDir 目錄存放應用的所有 dex 文件// 這些 dex 文件都需要進行解密File dexDir = new File(appDir, "dexDir"); // 創建用戶的私有目錄 , 將 apk 文件解壓到該目錄中File privateDir = getDir(app_name + "_" + app_version, MODE_PRIVATE);Log.i(TAG, "attachBaseContext 創建用戶的私有目錄 : " + privateDir.getAbsolutePath());// 在上述目錄下創建 app 目錄// 創建該目錄的目的是存放解壓后的 apk 文件的File appDir = new File(privateDir, "app");// app 中存放的是解壓后的所有的 apk 文件// app 下創建 dexDir 目錄 , 將所有的 dex 目錄移動到該 dexDir 目錄中// dexDir 目錄存放應用的所有 dex 文件// 這些 dex 文件都需要進行解密File dexDir = new File(appDir, "dexDir");五、相關代碼
完整相關代碼 :
public class ProxyApplication extends Application {public static final String TAG = "ProxyApplication";/*** 應用真實的 Application 全類名*/String app_name;/*** DEX 解密之后的目錄名稱*/String app_version;/*** 在 Application 在 ActivityThread 中被創建之后,* 第一個調用的方法是 attachBaseContext 函數.* 該函數是 Application 中最先執行的函數.*/@Overrideprotected void attachBaseContext(Context base) {super.attachBaseContext(base);try {Log.i(TAG, "attachBaseContext");/*在該 Application 中主要進行兩個操作 :1 . 解密并加載多個 DEX 文件2 . 將真實的 Application 替換成應用的主 Application*//*I . 解密與加載多 DEX 文件先進行解密, 然后再加載解密之后的 DEX 文件1. 先獲取當前的 APK 文件2. 然后解壓該 APK 文件*/// 獲取當前的 APK 文件, 下面的 getApplicationInfo().sourceDir 就是本應用 APK 安裝文件的全路徑File apkFile = new File(getApplicationInfo().sourceDir);// 獲取在 app Module 下的 AndroidManifest.xml 中配置的元數據,// 應用真實的 Application 全類名// 解密后的 dex 文件存放目錄ApplicationInfo applicationInfo = null;applicationInfo = getPackageManager().getApplicationInfo(getPackageName(),PackageManager.GET_META_DATA);Bundle metaData = applicationInfo.metaData;if (metaData != null) {// 檢查是否存在 app_name 元數據if (metaData.containsKey("app_name")) {app_name = metaData.getString("app_name").toString();}// 檢查是否存在 app_version 元數據if (metaData.containsKey("app_version")) {app_version = metaData.getString("app_version").toString();}}// 創建用戶的私有目錄 , 將 apk 文件解壓到該目錄中File privateDir = getDir(app_name + "_" + app_version, MODE_PRIVATE);Log.i(TAG, "attachBaseContext 創建用戶的私有目錄 : " + privateDir.getAbsolutePath());// 在上述目錄下創建 app 目錄// 創建該目錄的目的是存放解壓后的 apk 文件的File appDir = new File(privateDir, "app");// app 中存放的是解壓后的所有的 apk 文件// app 下創建 dexDir 目錄 , 將所有的 dex 目錄移動到該 dexDir 目錄中// dexDir 目錄存放應用的所有 dex 文件// 這些 dex 文件都需要進行解密File dexDir = new File(appDir, "dexDir");}}總結
以上是生活随笔為你收集整理的【Android 安全】DEX 加密 ( 代理 Application 开发 | multiple-dex-core 依赖库开发 | 配置元数据 | 获取 apk 文件并准备相关目录 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【数据挖掘】关联规则挖掘 Apriori
- 下一篇: 【Android 安全】DEX 加密 (