【Android 安全】DEX 加密 ( Application 替换 | 替换 LoadedApk 中的 Application mApplication 成员 )
文章目錄
- 一、 當(dāng)前 Application 替換進(jìn)度
- 二、 替換 LoadedApk 中的 Application mApplication 成員
一、 當(dāng)前 Application 替換進(jìn)度
上一篇博客 【Android 安全】DEX 加密 ( Application 替換 | 加密不侵入原則 | 替換 ActivityThread 的 mInitialApplication 成員 ) 替換了 ActivityThread 的 mInitialApplication 成員 , 本博客中繼續(xù)向下替換剩余的 Application ;
替換進(jìn)度如下 :
① ContextImpl 的 private Context mOuterContext 成員是 kim.hsl.multipledex.ProxyApplication 對象 ; ( 已完成 )
② ActivityThread 中的 Application mInitialApplication 成員是 kim.hsl.multipledex.ProxyApplication 對象 ; ( 已完成 )
③ ActivityThread 中的 ArrayList<Application> mAllApplications 集合中添加了 kim.hsl.multipledex.ProxyApplication 對象 ; ( 已完成 )
④ LoadedApk 中的 mApplication 成員是 kim.hsl.multipledex.ProxyApplication 對象 ;
二、 替換 LoadedApk 中的 Application mApplication 成員
替換 LoadedApk 中的 Application mApplication 成員 :
首先 , 獲取 LoadedApk 對象 , LoadedApk 是 ContextImpl 中的 LoadedApk mPackageInfo 成員變量 , 從 ContextImpl 對象中獲取其 LoadedApk mPackageInfo 成員變量 ;
// 1. 先獲取 LoadedApk 對象// LoadedApk 是 ContextImpl 中的 LoadedApk mPackageInfo 成員變量// 從 ContextImpl 對象中獲取其 LoadedApk mPackageInfo 成員變量Field mPackageInfoField = contextImplClass.getDeclaredField("mPackageInfo");mPackageInfoField.setAccessible(true);// ContextImpl 就是本應(yīng)用的上下文對象 , 調(diào)用 getBaseContext 方法獲得Object mPackageInfo = mPackageInfoField.get(baseContext);然后 , 獲取 LoadedApk 對象中的 mApplication 成員 ; 注意 LoadedApk 中的 mApplication 成員是私有的 , 設(shè)置可訪問性 ;
// 2. 獲取 LoadedApk 對象中的 mApplication 成員Class<?> loadedApkClass = Class.forName("android.app.LoadedApk");// 獲取 ActivityThread 中的 mInitialApplication 成員Field mApplicationField =loadedApkClass.getDeclaredField("mApplication");// LoadedApk 中的 mApplication 成員是私有的 , 設(shè)置可訪問性mApplicationField.setAccessible(true);最后 , 將 Application 設(shè)置給 LoadedApk 中的 mApplication 成員 ;
// 3. 將 Application 設(shè)置給 LoadedApk 中的 mApplication 成員mApplicationField.set(mPackageInfo, delegate);本步驟完整代碼示例 :
// IV . 替換 ③ LoadedApk 中的 mApplication// 成員是 kim.hsl.multipledex.ProxyApplication 對象// 1. 先獲取 LoadedApk 對象// LoadedApk 是 ContextImpl 中的 LoadedApk mPackageInfo 成員變量// 從 ContextImpl 對象中獲取其 LoadedApk mPackageInfo 成員變量Field mPackageInfoField = contextImplClass.getDeclaredField("mPackageInfo");mPackageInfoField.setAccessible(true);// ContextImpl 就是本應(yīng)用的上下文對象 , 調(diào)用 getBaseContext 方法獲得Object mPackageInfo = mPackageInfoField.get(baseContext);// 2. 獲取 LoadedApk 對象中的 mApplication 成員Class<?> loadedApkClass = Class.forName("android.app.LoadedApk");// 獲取 ActivityThread 中的 mInitialApplication 成員Field mApplicationField =loadedApkClass.getDeclaredField("mApplication");// LoadedApk 中的 mApplication 成員是私有的 , 設(shè)置可訪問性mApplicationField.setAccessible(true);// 3. 將 Application 設(shè)置給 LoadedApk 中的 mApplication 成員mApplicationField.set(mPackageInfo, delegate);總結(jié)
以上是生活随笔為你收集整理的【Android 安全】DEX 加密 ( Application 替换 | 替换 LoadedApk 中的 Application mApplication 成员 )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android 安全】DEX 加密 (
- 下一篇: 【Android 安全】DEX 加密 (