文章目录

  • 一、创建用户自定义 Application
  • 二、替换 ContextImpl 对象的 mOuterContext 成员

dex 解密时 , 需要将 代理 Application 替换为 真实 Application ; 替换 Application 首先要理解系统如何注册应用的 Application 的 ;

上一篇博客 【Android 安全】DEX 加密 ( Application 替换 | 判定自定义 Application 存在 | 获取 ContextImpl 对象 ) , 继续后续步骤 ;

一、创建用户自定义 Application


获取 app_name 元数据 , 该元数据就是用户自定义的 Application 的全类型 , 即 包名.类名 , 这里是 kim.hsl.dex.MyApplication ;

通过 反射 获取 Application 类 , 系统也是进行的反射操作 , 并创建用户真实配置的 Application ;

            // 通过反射获取 Application , 系统也是进行的反射操作Class<?> delegateClass = Class.forName(app_name);// 创建用户真实配置的 ApplicationApplication delegate = (Application) delegateClass.newInstance();

调用 Application 的 attach 函数 , 该函数无法直接调用 , 也需要通过反射调用 , 该方法是私有的 , 需要 设置 attach 方法允许访问 ;

            // 调用 Application 的 attach 函数// 该函数无法直接调用 , 也需要通过反射调用// 这里先通过反射获取 Application 的 attach 函数Method attach = Application.class.getDeclaredMethod("attach", Context.class);// attach 方法是私有的 , 设置 attach 方法允许访问attach.setAccessible(true);

attach 方法需要传入两个参数 , Application 对象 和 Context 对象 ,

该 Context 是通过调用 Application 的 attachBaseContext 方法传入的 ContextImpl , 因此通过调用 getBaseContext() 方法即可获取 Context 对象 ;

将上面 delegateClass.newInstance() 创建的 Application 对象 , 和 getBaseContext() 获取的 Context 对象 , 传入 attach 方法中 , 即可创建完整的 Application 对象 ;

            // 获取上下文对象 ,// 该 Context 是通过调用 Application 的 attachBaseContext 方法传入的 ContextImpl// 将该上下文对象传入 Application 的 attach 方法中attach.invoke(delegate, baseContext);

本步骤完整代码示例 :

            // 获取上下文对象 , 保存下来 , 之后要使用Context baseContext = getBaseContext();// 通过反射获取 Application , 系统也是进行的反射操作Class<?> delegateClass = Class.forName(app_name);// 创建用户真实配置的 ApplicationApplication delegate = (Application) delegateClass.newInstance();// 调用 Application 的 attach 函数// 该函数无法直接调用 , 也需要通过反射调用// 这里先通过反射获取 Application 的 attach 函数Method attach = Application.class.getDeclaredMethod("attach", Context.class);// attach 方法是私有的 , 设置 attach 方法允许访问attach.setAccessible(true);// 获取上下文对象 ,// 该 Context 是通过调用 Application 的 attachBaseContext 方法传入的 ContextImpl// 将该上下文对象传入 Application 的 attach 方法中attach.invoke(delegate, baseContext);

二、替换 ContextImpl 对象的 mOuterContext 成员


ContextImpl 的 private Context mOuterContext 成员是 kim.hsl.multipledex.ProxyApplication 对象 , 这是外层的壳 Application , 现在替换成上面创建的用户自定义的 kim.hsl.dex.MyApplication 对象 ;

首先通过反射获取 ContextImpl 类 ,

            Class<?> contextImplClass = Class.forName("android.app.ContextImpl");

然后获取类成员 mOuterContext 字段 ,

            // 获取 ContextImpl 中的 mOuterContext 成员Field mOuterContextField = contextImplClass.getDeclaredField("mOuterContext");

设置反射中私有成员的可访问性 ,

            // mOuterContext 成员是私有的 , 设置可访问性mOuterContextField.setAccessible(true);

ContextImpl 就是应用的 Context , 直接通过 getBaseContext() 获取即可 ,

            // ContextImpl 就是应用的 Context , 直接通过 getBaseContext() 获取即可mOuterContextField.set(baseContext, delegate);

本步骤完整代码 :

            // I . 替换 ① ContextImpl 的 private Context mOuterContext//  成员是 kim.hsl.multipledex.ProxyApplication 对象Class<?> contextImplClass = Class.forName("android.app.ContextImpl");// 获取 ContextImpl 中的 mOuterContext 成员Field mOuterContextField = contextImplClass.getDeclaredField("mOuterContext");// mOuterContext 成员是私有的 , 设置可访问性mOuterContextField.setAccessible(true);// ContextImpl 就是应用的 Context , 直接通过 getBaseContext() 获取即可mOuterContextField.set(baseContext, delegate);

【Android 安全】DEX 加密 ( Application 替换 | 创建用户自定义 Application | 替换 ContextImpl 对象的 mOuterContext 成员 )相关推荐

  1. 【Android 安全】DEX 加密 ( Proguard keep 用法 | Proguard 默认混淆结果 | 保留类及成员混淆结果 | 保留注解以及被注解修饰的类/成员/方法 )

    文章目录 一.Proguard 默认混淆结果 二.Proguard 保留类及成员混淆结果 三.Proguard 保留注解以及被注解修饰的类/成员/方法 更多 ProGuard 混淆配置参考 : htt ...

  2. 【Android 安全】DEX 加密 ( Application 替换 | 分析 BroadcastReceiver 组件中调用 getApplication() 获取的 Application )

    文章目录 一. Service 中的 getApplication() 方法分析 二. ActivityThread 中的 H 处理 RECEIVER 消息 三. ActivityThread 中的 ...

  3. 【Android 安全】DEX 加密 ( Application 替换 | 兼容 ContentProvider 操作 | 源码资源 )

    文章目录 一. 命中 ActivityThread 中 installProvider 方法的分支三 1. 原理分析 2. 代码实现 二. 在 ContextImpl 的 createPackageC ...

  4. 【Android 安全】DEX 加密 ( 代理 Application 开发 | 加载 dex 文件 | 将系统的 dexElements 与 应用的 dexElements 合并 | 替换操作 )

    文章目录 一.将系统的 dexElements 与 应用的 dexElements 合并 二.Element[] dexElements 替换操作 三.完整 dex 加载源码 参考博客 : [Andr ...

  5. 【Android 安全】DEX 加密 ( 代理 Application 开发 | 加载 dex 文件 | 使用反射获取方法创建本应用的 dexElements | 各版本创建 dex 数组源码对比 )

    文章目录 一.不同 Android 系统创建 dex 数组源码对比 二.不同 Android 系统创建 dex 数组源码对比 三. Android 5.1 及以下系统反射方法并创建 Element[] ...

  6. 【Android 安全】DEX 加密 ( 代理 Application 开发 | 项目中配置 OpenSSL 开源库 | 使用 OpenSSL 开源库解密 dex 文件 )

    文章目录 一.项目中配置 OpenSSL 开源库 二.OpenSSL 开源库解密参考代码 三.解密 dex 文件的 Java 代码 四.解密 dex 文件的 Jni 代码 参考博客 : [Androi ...

  7. 【Android 安全】DEX 加密 ( 代理 Application 开发 | 交叉编译 OpenSSL 开源库 )

    文章目录 一.OpenSSL 开源库简介 二.OpenSSL 源码及环境变量脚本下载 三.修改环境变量脚本 四.OpenSSL 交叉编译 五.OpenSSL 交叉编译相关资源下载 参考博客 : [An ...

  8. 【Android 安全】DEX 加密 ( Java 工具开发 | 加密解密算法 API | 编译代理 Application 依赖库 | 解压依赖库 aar 文件 )

    文章目录 一.加密解密算法 API 二.编译代理 Application 依赖库 三.解压代理 Application 依赖库 aar 文件 参考博客 : [Android 安全]DEX 加密 ( 常 ...

  9. 【Android 安全】DEX 加密 ( 代理 Application 开发 | 加载 dex 文件 | 反射获取系统的 Element[] dexElements )

    文章目录 一.dex 文件准备 二.加载 dex 文件流程 三.Element[] dexElements 分析 四.反射获取系统的 Element[] dexElements 参考博客 : [And ...

最新文章

  1. 中服公司企业信息化的ERP系统选择
  2. 演练5-3:Contoso大学校园管理系统3
  3. windows 打开.ipynb文件
  4. 自己喜欢的shell终端配置
  5. Maven构建java项目
  6. 算法题:输入一个表示整数的字符串,把该字符串转换成整数并输出。例如输入字符串“12345”,则输出整数“12345”
  7. Intellij Idea插件利器推荐大全
  8. 计算机网络技术的专业认识,计算机网络技术课程学习后的自我认识
  9. 分析C#中Dialog控件(转)
  10. 解决eclipse中svn插件总是提示输入密码的问题
  11. java社区团购微信小程序源码
  12. 计算机统计字符数,怎么看word版本-Word文档中的字数和字符数是怎样统计的?
  13. dell商务计算机主机闪烁黄灯,戴尔电脑开不了机 已经几天了 主机灯橙色 闪闪的...
  14. 服务器游戏性能测试工具,python 游戏服务器 性能测试工具
  15. 宿命论:为什么iPad的最大敌人会是iPhone?
  16. Laravel-Vue开发初探二:Inertia拾遗
  17. 猫哥教你写爬虫 019--debug-作业
  18. 过零检测法MATLAB仿真,过零检测 - MATLAB Simulink - MathWorks 中国
  19. h5手机端或PC端利用高德地图获取当前定位位置
  20. 十九、顺序查找法和折半查找法

热门文章

  1. 【转帖】详解CSS网页布局中默认字体样式
  2. Ubuntu 下Ape转Mp3[88250原创]
  3. 1209F - Koala and Notebook
  4. EOS开发基础之五:使用cleos命令行客户端操作EOS——智能合约之Exchange
  5. 洛谷 P1013 进制位
  6. C# .NET MVC 基础提供程序在 Open 上失败
  7. HDU 1848 Fibonacci again and again
  8. NHibernate之旅(10):探索父子(一对多)关联查询
  9. 推荐一本书《网络机器人java编程指南》
  10. Windows从web下载文件的几种方式