日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

【Android 安全】DEX 加密 ( Application 替换 | 获取 ContextImpl、ActivityThread、LoadedApk 类型对象 | 源码分析 )

發布時間:2025/6/17 Android 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Android 安全】DEX 加密 ( Application 替换 | 获取 ContextImpl、ActivityThread、LoadedApk 类型对象 | 源码分析 ) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 一、獲取對象類型分析
  • 二、獲取 ContextImpl 類型對象
  • 三、獲取 ActivityThread、LoadedApk 類型對象



dex 解密時 , 需要將 代理 Application 替換為 真實 Application ; 替換 Application 首先要理解系統如何注冊應用的 Application 的 ;





一、獲取對象類型分析



替換 Application 就是需要替換下面各個類型對象的對應 Application 成員 ;

ContextImplprivate Context mOuterContext 成員是 kim.hsl.multipledex.ProxyApplication 對象 ;

ActivityThread 中的 ArrayList<Application> mAllApplications 集合中添加了 kim.hsl.multipledex.ProxyApplication 對象 ;

LoadedApk 中的 mApplication 成員是 kim.hsl.multipledex.ProxyApplication 對象 ;

ActivityThread 中的 Application mInitialApplication 成員是 kim.hsl.multipledex.ProxyApplication 對象 ;


ContextImpl 源碼參考 : 6.0.1_r16/xref/frameworks/base/core/java/android/app/ContextImpl.java

ActivityThread 源碼參考 : 6.0.1_r16/xref/frameworks/base/core/java/android/app/ActivityThread.java

LoadedApk 源碼參考 : 6.0.1_r16/xref/frameworks/base/core/java/android/app/LoadedApk.java


替換上述類型對象中的成員 , 首先要獲取到上述 ContextImpl , ActivityThread , LoadedApk 類型的對象 ;

上述三個對象在每個應用中有且僅有一個 , 只要獲取到了就是本應用中唯一的對象 ;


使用反射獲取上述對象 ;





二、獲取 ContextImpl 類型對象



獲取 ContextImpl 類型對象 : Application 創建完畢之后 , 就會立刻調用 Application 的 void attachBaseContext(Context base) 函數 , 該函數中的 Context base 參數就是 ContextImpl 類型對象 ;

通過 Application 的 void attachBaseContext(Context base) 回調函數 , 可獲取 ContextImpl 對象 ;

public class ContextWrapper extends Context {protected void attachBaseContext(Context base) {mBase = base;} }



三、獲取 ActivityThread、LoadedApk 類型對象



獲取 ActivityThread、LoadedApk 類型對象 :

在 LoadedApk 中的 makeApplication 方法中 ,

ContextImpl appContext = ContextImpl.createAppContext(mActivityThread, this) ,

通過調用 ContextImpl.createAppContext 函數創建 ContextImpl 對象 ,

  • 傳入的第一個參數就是 ActivityThread 對象
  • 傳入的第二個參數就是 LoadedApk 對象
public Application makeApplication(boolean forceDefaultAppClass,Instrumentation instrumentation) {try {java.lang.ClassLoader cl = getClassLoader();if (!mPackageName.equals("android")) {initializeJavaContextClassLoader();}// ★ ContextImpl appContext = ContextImpl.createAppContext(mActivityThread, this);app = mActivityThread.mInstrumentation.newApplication(cl, appClass, appContext);appContext.setOuterContext(app);} catch (Exception e) {}} }

LoadedApk 完整源碼參考 : 6.0.1_r16/xref/frameworks/base/core/java/android/app/LoadedApk.java


分析 ContextImpl.createAppContext 方法 , 在該方法中調用了 ContextImpl 的構造方法創建了 ContextImpl 對象 ;

class ContextImpl extends Context {static ContextImpl createAppContext(ActivityThread mainThread, LoadedApk packageInfo) {if (packageInfo == null) throw new IllegalArgumentException("packageInfo");// 調用構造函數創建了 ContextImpl 對象 return new ContextImpl(null, mainThread,packageInfo, null, null, false, null, null, Display.INVALID_DISPLAY);} }

繼續查看 ContextImpl 構造函數 , 該構造函數參數很長 , 其第二個參數是 ActivityThread mainThread , 第三個參數是 LoadedApk packageInfo ;

在構造函數中 , mMainThread = mainThread , 構造函數中 ActivityThread mainThread 參數賦值給了 final ActivityThread mMainThread 成員變量 ;

在構造函數中 , mPackageInfo = packageInfo , 構造函數中 LoadedApk packageInfo 參數賦值給了 final LoadedApk mPackageInfo 成員變量 ;

因此可以通過 ContextImpl 類型對象 , 獲取其中的

  • final ActivityThread mMainThread
  • final LoadedApk mPackageInfo

兩個成員變量 , 即可獲取到 ActivityThread 和 LoadedApk ;

class ContextImpl extends Context {// 應用的 ActivityThread final ActivityThread mMainThread;// 應用的 LoadedApk final LoadedApk mPackageInfo;// ContextImpl 構造方法 , 只留下分析到的有用代碼 , 其余代碼刪除 private ContextImpl(ContextImpl container, ActivityThread mainThread,LoadedApk packageInfo, IBinder activityToken, UserHandle user, boolean restricted,Display display, Configuration overrideConfiguration, int createDisplayWithId) {mOuterContext = this;mMainThread = mainThread;mPackageInfo = packageInfo;}static ContextImpl createAppContext(ActivityThread mainThread, LoadedApk packageInfo) {if (packageInfo == null) throw new IllegalArgumentException("packageInfo");// 調用構造函數創建了 ContextImpl 對象 return new ContextImpl(null, mainThread,packageInfo, null, null, false, null, null, Display.INVALID_DISPLAY);} }

ContextImpl 完整源碼參考 : 6.0.1_r16/xref/frameworks/base/core/java/android/app/ContextImpl.java

總結

以上是生活随笔為你收集整理的【Android 安全】DEX 加密 ( Application 替换 | 获取 ContextImpl、ActivityThread、LoadedApk 类型对象 | 源码分析 )的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产成人看片 | 色多多在线看 | 婷婷狠狠操 | 深夜免费视频 | 91精品国产闺蜜国产在线闺蜜 | 久久av免费看 | 国产精彩视频在线观看 | 精品人妻无码一区二区三区换脸 | 高h视频在线观看 | 激情啪啪网站 | 亚洲精品久久久久久一区二区 | 看看黄色片 | 国产欧美精品一区 | 蜜桃av免费看 | 国产精品日韩精品 | 午夜视频免费在线 | 俄罗斯精品一区二区三区 | 香蕉视频一级片 | 91丝袜美腿 | 光棍福利视频 | 亚洲精品一区二区三区精华液 | 婷婷激情五月综合 | 人妻丰满熟妇av无码区不卡 | jizzjizz美国| 国产成人综合一区二区三区 | 午夜美女福利视频 | 久久h视频| 日韩激情欧美 | 亚洲欧美999 | 国产精品自慰网站 | 黄色一级免费片 | 国产成人精品一区二区三区 | 男人深夜网站 | 99久久人妻无码中文字幕系列 | 国产精品白嫩极品美女视频 | 美女福利片 | www.白虎| 日韩黄色免费电影 | 福利二区视频 | 国产偷v国产偷v亚洲高清 | 91精品国产综合久久香蕉 | 婷婷亚洲五月 | 欧美中文在线观看 | 青青青草视频在线观看 | 色播视频在线播放 | av色区| 最新国产精品视频 | 欧洲a级片| 女人天堂网站 | 亚洲一区动漫 | 成人午夜黄色 | 清纯唯美亚洲 | 91伊人久久| 欧美一卡二卡三卡 | 91猎奇在线观看 | 日韩激情视频在线观看 | 黄色片网站在线免费观看 | 日本新japanese乱熟 | 久久成人国产 | 91日韩在线视频 | 中文字幕精品久久久久人妻红杏ⅰ | 精品视频一区二区三区 | 日韩二区在线 | 成人一区电影 | 国产综合久久久久 | 久久久久区 | 中文字幕系列 | 成年人在线视频观看 | 国产春色 | www.97av | 那个网站可以看毛片 | 妞妞av| 亚洲综合视频网 | 久久在线精品视频 | 免费视频福利 | 欧美成年人在线观看 | 99久久99久久免费精品蜜臀 | 久久久久久免费 | 久久男人av| 久久综合色88| 香蕉视频一级 | 国产日韩欧美精品一区 | 中文字幕亚洲欧美 | 久草最新视频 | 17c在线| 国产精品国产自产拍高清av | 国产一区二区三区乱码 | 日韩黄页网站 | 久久精品久久久久久久 | 亚洲AV无码一区二区三区性 | 亚洲综合色在线观看 | 亚洲av永久纯肉无码精品动漫 | 精品人妻一区二区三区浪潮在线 | 18视频在线观看男男 | 成人免费毛片糖心 | jiz亚洲| 国产视频在 | 天天射天天 | 国产精品99精品无码视亚 |