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

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 【Android 安全】DEX 加密 ( Application 替换 | 获取 ContextImpl、ActivityThread、LoadedApk 类型对象 | 源码分析 )

文章目录

一、获取对象类型分析

二、获取 ContextImpl 类型对象

三、获取 ActivityThread、LoadedApk 类型对象



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






一、获取对象类型分析


替换 Application 就是需要替换下面各个类型对象的对应 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 对象 ;



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


目录
相关文章
|
4月前
|
Java Android开发
|
21天前
|
算法 安全 数据安全/隐私保护
Android经典实战之常见的移动端加密算法和用kotlin进行AES-256加密和解密
本文介绍了移动端开发中常用的数据加密算法,包括对称加密(如 AES 和 DES)、非对称加密(如 RSA)、散列算法(如 SHA-256 和 MD5)及消息认证码(如 HMAC)。重点讲解了如何使用 Kotlin 实现 AES-256 的加密和解密,并提供了详细的代码示例。通过生成密钥、加密和解密数据等步骤,展示了如何在 Kotlin 项目中实现数据的安全加密。
56 1
|
22天前
|
算法 安全 数据安全/隐私保护
Android经典实战之常见的移动端加密算法和用kotlin进行AES-256加密和解密
本文介绍了移动端开发中常用的数据加密算法,包括对称加密(如 AES 和 DES)、非对称加密(如 RSA)、散列算法(如 SHA-256 和 MD5)及消息认证码(如 HMAC)。重点展示了如何使用 Kotlin 实现 AES-256 的加密和解密,提供了详细的代码示例。
28 2
|
2月前
|
存储 安全 数据安全/隐私保护
🔎Android安全攻防实战!守护你的应用数据安全,让用户放心使用!🛡️
【7月更文挑战第28天】在移动应用盛行的时代,确保Android应用安全性至关重要。本文以问答形式探讨了主要安全威胁(如逆向工程、数据窃取)及其对策。建议使用代码混淆、签名验证、数据加密等技术来增强应用保护。此外,还推荐了加密API、HTTPS通信、代码审计等措施来进一步加强安全性。综上所述,全面的安全策略对于构建安全可靠的应用环境必不可少。#Android #应用安全 #代码混淆 #数据加密
46 3
|
2月前
|
SQL 安全 Java
Android经典面试题之Kotlin中object关键字实现的是什么类型的单例模式?原理是什么?怎么实现双重检验锁单例模式?
Kotlin 单例模式概览 在 Kotlin 中,`object` 关键字轻松实现单例,提供线程安全的“饿汉式”单例。例如: 要延迟初始化,可使用 `companion object` 和 `lazy` 委托: 对于参数化的线程安全单例,结合 `@Volatile` 和 `synchronized`
40 6
|
2月前
|
Android开发 Kotlin
Android面试题之kotlin中怎么限制一个函数参数的取值范围和取值类型等
在Kotlin中,限制函数参数可通过类型系统、泛型、条件检查、数据类、密封类和注解实现。例如,使用枚举限制参数为特定值,泛型约束确保参数为Number子类,条件检查如`require`确保参数在特定范围内,数据类封装可添加验证,密封类限制为一组预定义值,注解结合第三方库如Bean Validation进行校验。
46 6
|
2月前
|
存储 安全 Android开发
安卓应用开发的安全之道
【7月更文挑战第4天】在数字时代,移动应用的安全性至关重要。本文将深入探讨在安卓平台上开发安全应用的最佳实践,包括代码混淆、数据存储加密、网络通信安全、权限管理以及定期的安全审计和更新策略。通过这些措施,开发者可以显著提高他们的应用抵御恶意攻击的能力,保护用户数据免受侵害。
|
3月前
|
安全 网络协议 网络安全
程序与技术分享:Android应用安全之数据传输安全
程序与技术分享:Android应用安全之数据传输安全
|
4月前
|
Java Android开发
Android编译的jar里面是dex
Android编译的jar里面是dex
52 0
|
2天前
|
SQL 安全 算法
网络安全的盾牌与矛:加密技术与安全意识的双重防线
【9月更文挑战第16天】在数字世界的海洋中,网络安全的灯塔照亮着信息流通的每一个角落。本文将深入探讨网络安全的核心——加密技术,以及构筑坚不可摧防线的另一块基石——安全意识。我们将从密码学的基础知识出发,逐步揭开加密技术的神秘面纱,并分析当前最常见的网络攻击手段,揭示安全意识的重要性。通过理论与实践的结合,旨在为读者提供一套实用的网络安全知识体系,以应对日益复杂的网络威胁。