文章目录

  • 一、ActivityThread 后续分析
  • 二、ActivityThread 相关源码
  • 三、Application 替换位置

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

一、ActivityThread 后续分析


在 【Android 安全】DEX 加密 ( Application 替换 | Android 应用启动原理 | ActivityThread 源码分析 ) 基础上 , 继续分析 ActivityThread 的 handleBindApplication 方法 ;

在 Application app = data.info.makeApplication(data.restrictedBackupMode, null) 代码中 , 创建了 Application , 并且调用了 Application 的 attachBaseContext 方法 ;

创建完毕之后 , 将创建的 Application 赋值给了 ActivityThread 的 mInitialApplication 成员 , mInitialApplication = app ;

④ ActivityThread 的 mInitialApplication 成员是 Application

在后面调用了 mInstrumentation.callApplicationOnCreate(app) 方法 , 执行了 Application 中的 onCreate 方法 , 此时

            try {mInstrumentation.callApplicationOnCreate(app);} catch (Exception e) {if (!mInstrumentation.onException(app, e)) {throw new RuntimeException("Unable to create application " + app.getClass().getName()+ ": " + e.toString(), e);}}

二、ActivityThread 相关源码


public final class ActivityThread {Application mInitialApplication;final ArrayList<Application> mAllApplications= new ArrayList<Application>();final ApplicationThread mAppThread = new ApplicationThread();final Looper mLooper = Looper.myLooper();final H mH = new H();private class H extends Handler {public void handleMessage(Message msg) {switch (msg.what) {case BIND_APPLICATION:Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "bindApplication");AppBindData data = (AppBindData)msg.obj;handleBindApplication(data);Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);break;}}private void handleBindApplication(AppBindData data) {try {// If the app is being launched for full backup or restore, bring it up in// a restricted environment with the base application class.Application app = data.info.makeApplication(data.restrictedBackupMode, null);mInitialApplication = app;// don't bring up providers in restricted mode; they may depend on the// app's custom Application classif (!data.restrictedBackupMode) {List<ProviderInfo> providers = data.providers;if (providers != null) {installContentProviders(app, providers);// For process that contains content providers, we want to// ensure that the JIT is enabled "at some point".mH.sendEmptyMessageDelayed(H.ENABLE_JIT, 10*1000);}}// Do this after providers, since instrumentation tests generally start their// test thread at this point, and we don't want that racing.try {mInstrumentation.onCreate(data.instrumentationArgs);}catch (Exception e) {throw new RuntimeException("Exception thrown in onCreate() of "+ data.instrumentationName + ": " + e.toString(), e);}try {// 此处调用了 Application 的 onCreate 函数 mInstrumentation.callApplicationOnCreate(app);} catch (Exception e) {if (!mInstrumentation.onException(app, e)) {throw new RuntimeException("Unable to create application " + app.getClass().getName()+ ": " + e.toString(), e);}}} finally {StrictMode.setThreadPolicy(savedPolicy);}}public final void bindApplication(String processName, ApplicationInfo appInfo,List<ProviderInfo> providers, ComponentName instrumentationName,ProfilerInfo profilerInfo, Bundle instrumentationArgs,IInstrumentationWatcher instrumentationWatcher,IUiAutomationConnection instrumentationUiConnection, int debugMode,boolean enableOpenGlTrace, boolean isRestrictedBackupMode, boolean persistent,Configuration config, CompatibilityInfo compatInfo, Map<String, IBinder> services,Bundle coreSettings) {sendMessage(H.BIND_APPLICATION, data);}    private void attach(boolean system) {sCurrentActivityThread = this;mSystemThread = system;if (!system) {RuntimeInit.setApplicationObject(mAppThread.asBinder());final IActivityManager mgr = ActivityManagerNative.getDefault();try {mgr.attachApplication(mAppThread);} catch (RemoteException ex) {// Ignore}// Watch for getting close to heap limit.} else {// Don't set application object here -- if the system crashes,// we can't display an alert, we just want to die die die.}}public static void main(String[] args) {Looper.prepareMainLooper();ActivityThread thread = new ActivityThread();thread.attach(false);Looper.loop();}
}

完整源码参考 : 6.0.1_r16/xref/frameworks/base/core/java/android/app/ActivityThread.java

三、Application 替换位置


当应用启动后 , 在 AndroidManifest.xml 中配置的 代理 Application 为 kim.hsl.multipledex.ProxyApplication ;

<?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 的真实全类名 --><meta-data android:name="app_name" android:value="kim.hsl.multipledex.ProxyApplication"/><!-- DEX 解密之后的目录名称 --><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>

因此在应用程序开始运行时 , 以下几个位置运行的 Application 是 kim.hsl.multipledex.ProxyApplication , 需要将其替换为实际开发的 Application ;

① ContextImpl 的 private 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 对象 ;

替换 Application 就是需要替换上述对象的对应 Application 成员 ;

【Android 安全】DEX 加密 ( Application 替换 | Android 应用启动原理 | ActivityThread 后续分析 | Application 替换位置 )相关推荐

  1. 【Android 安全】DEX 加密 ( Application 替换 | Android 应用启动原理 | LoadedApk 后续分析 )

    文章目录 一.LoadedApk 后续分析 二.LoadedApk 后续先关源码 dex 解密时 , 需要将 代理 Application 替换为 真实 Application ; 替换 Applic ...

  2. 【Android 安全】DEX 加密 ( Application 替换 | Android 应用启动原理 | ActivityThread 源码分析 )

    文章目录 一.ActivityThread 源码分析 二.ActivityThread 部分代码示例 dex 解密时 , 需要将 代理 Application 替换为 真实 Application ; ...

  3. android 大文件加密,如何在android中加密大视频文件

    我有一个应用程序,我正在使用该代码来解密已加密的文件.文件位置是"/mnt/sdcard/myfolder/test.mp4". test.mp4文件大小约为20MB.如何在and ...

  4. android aes文件加密,如何在Android中使用AES从SD卡加密文件?

    你应该看看: CipherInputStream和CipherOutputStream.它们用于加密和解密字节流. 我有一个名为的文件cleartext.该文件包含: Hi, I'm a clear ...

  5. android短信加密(发送加密短信,解密本地短信)

    短信加密此类功能由于新手学习的需求量较小,所以在网上很少有一些简单的demo供新手参考.笔者做到此处也是花了比较多的时间自我构思,具体的过程也是不过多描述了,讲一下demo的内容.(源码在文章结尾) ...

  6. 深入理解Android之设备加密Device Encryption

    深入理解Android之设备加密Device Encryption Android从4.4开始就支持一项功能,那就是对设备进行加密.加密自然是为了安全性考虑,由于/system目录是只读的,手机里那些 ...

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

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

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

    文章目录 一. ActivityThread 中的 installProvider 方法 ( 创建 ContentProvider 内容提供者 ) 二. installProvider 方法的第三分支 ...

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

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

最新文章

  1. LinkServer--服务器选项
  2. Ubuntu 18.04上进行HyperLedger Fabric 1.2.0环境及链码安装、部署和测试
  3. GMIS 2017大会杨洋演讲:认知分析-透过机器重新审视商业本质
  4. boost::date_time模块wrapping_int的测试程序
  5. 在当今移动互联网时代_谁在提供当今最好的电子邮件体验?
  6. angular模态框位置_angular $modal 模态框
  7. Vue.js(学习Vue3之前必须要掌握的知识)
  8. 《研磨设计模式》读书笔记之:适配器模式、单例模式
  9. 社工库源码mysql_体验盒子:社工库源码大全(持续更新)
  10. QAC/QAC++静态软件代码测试分析-试用工具
  11. Linux--进程与任务管理
  12. react-native电影简介app,了解一下?(android端)
  13. 求旋转体体积表面积时的dx,ds问题的简单解释
  14. 加强版Apktool堪称逆向神器
  15. python识别图片文字、并返回文字坐标_PyAutoGui 图片识别+定位+截图函数文档
  16. 港科科研 | 香港科大成立亚洲首个跨国人工智能芯片设计研发联盟
  17. HK01BS单通道电容式触控芯片IC内置稳压LDO低压复位模块
  18. 局域网联机_MC联机教程
  19. Bosun RabbitMQ数据收集
  20. Hibernate对象的状态和映射

热门文章

  1. DIV+CSS如何设置字体间距
  2. 尚硅谷Docker---1、docker杂记
  3. SQL Cache Invalidation
  4. tomcat配置文件修改
  5. LeetCode 213. 打家劫舍 II
  6. 2019.03.21 增删改
  7. 多核服务器的JVM优化选项(转载)
  8. 【C/C++开发】C++实现简单的线程池
  9. usb-to-isp-for-stm32
  10. Linux 命令行界面-GUI界面