文章目录
一、 当前 Application 替换进度
二、 ActivityThread 中的 mAllApplications 集合添加 Application
一、 当前 Application 替换进度
上一篇博客 【Android 安全】DEX 加密 ( Application 替换 | 加密不侵入原则 | 替换 ActivityThread 的 mInitialApplication 成员 ) 替换了 ActivityThread 的 mInitialApplication 成员 , 本博客中继续向下替换剩余的 Application ;
替换进度如下 :
替换进度如下 :
① 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 对象 ;
二、 ActivityThread 中的 mAllApplications 集合添加 Application
向 ActivityThread 中的 ArrayList<Application> mAllApplications 集合中添加了 kim.hsl.multipledex.ProxyApplication 对象 ;
首先 , 获取 ActivityThread 对象 ;
ActivityThread 之前已经获取过了 , 从 从 ContextImpl 对象中获取其 ActivityThread mMainThread 成员变量就是 ActivityThread , 参考 【Android 安全】DEX 加密 ( Application 替换 | 加密不侵入原则 | 替换 ActivityThread 的 mInitialApplication 成员 ) 博客 ;
然后 , 获取 ActivityThread 的 ArrayList<Application> mAllApplications 成员 , 该成员是一个集合 , mAllApplications 成员是私有的 , 设置可访问性 ;
// 获取 ActivityThread 中的 mAllApplications 成员 Field mAllApplicationsField = activityThreadClass.getDeclaredField("mAllApplications"); // mAllApplications 成员是私有的 , 设置可访问性 mAllApplicationsField.setAccessible(true);
最后 , 获取 ActivityThread 中的 ArrayList<Application> mAllApplications 队列 , 并向其中添加真实的 Application ;
// 获取 ActivityThread 中的 ArrayList<Application> mAllApplications 队列 ArrayList<Application> mAllApplications = (ArrayList<Application>) mAllApplicationsField.get(mMainThread); // 将真实的 Application 添加到上述队列中 mAllApplications.add(delegate);
本步骤代码示例 :
// III . 替换 ② ActivityThread 中的 ArrayList<Application> mAllApplications // 集合中添加了 kim.hsl.multipledex.ProxyApplication 对象 ; // 获取 ActivityThread 中的 mAllApplications 成员 Field mAllApplicationsField = activityThreadClass.getDeclaredField("mAllApplications"); // mAllApplications 成员是私有的 , 设置可访问性 mAllApplicationsField.setAccessible(true); // 获取 ActivityThread 中的 ArrayList<Application> mAllApplications 队列 ArrayList<Application> mAllApplications = (ArrayList<Application>) mAllApplicationsField.get(mMainThread); // 将真实的 Application 添加到上述队列中 mAllApplications.add(delegate);