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

简介: 【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


目录
相关文章
|
8月前
|
算法 安全 Java
即时通讯安全篇(一):正确地理解和使用Android端加密算法
本文主要讨论针对Android这样的移动端应用开发时,如何正确的理解目前常用的加密算法,为诸如即时通讯应用的实战开发,如何在合适的场景下选择适合的算法,提供一些参考。
222 0
|
10月前
|
存储 安全 Android开发
探索Android系统的最新安全特性
在数字时代,智能手机已成为我们生活中不可或缺的一部分。随着技术的不断进步,手机操作系统的安全性也越来越受到重视。本文将深入探讨Android系统最新的安全特性,包括其设计理念、实施方式以及对用户的影响。通过分析这些安全措施如何保护用户免受恶意软件和网络攻击的威胁,我们希望为读者提供对Android安全性的全面了解。
|
算法 安全 数据安全/隐私保护
Android经典实战之常见的移动端加密算法和用kotlin进行AES-256加密和解密
本文介绍了移动端开发中常用的数据加密算法,包括对称加密(如 AES 和 DES)、非对称加密(如 RSA)、散列算法(如 SHA-256 和 MD5)及消息认证码(如 HMAC)。重点讲解了如何使用 Kotlin 实现 AES-256 的加密和解密,并提供了详细的代码示例。通过生成密钥、加密和解密数据等步骤,展示了如何在 Kotlin 项目中实现数据的安全加密。
629 1
|
算法 安全 数据安全/隐私保护
Android经典实战之常见的移动端加密算法和用kotlin进行AES-256加密和解密
本文介绍了移动端开发中常用的数据加密算法,包括对称加密(如 AES 和 DES)、非对称加密(如 RSA)、散列算法(如 SHA-256 和 MD5)及消息认证码(如 HMAC)。重点展示了如何使用 Kotlin 实现 AES-256 的加密和解密,提供了详细的代码示例。
304 2
|
安全 网络安全 Android开发
深度解析:利用Universal Links与Android App Links实现无缝网页至应用跳转的安全考量
【10月更文挑战第2天】在移动互联网时代,用户经常需要从网页无缝跳转到移动应用中。这种跳转不仅需要提供流畅的用户体验,还要确保安全性。本文将深入探讨如何利用Universal Links(仅限于iOS)和Android App Links技术实现这一目标,并分析其安全性。
1447 0
|
存储 安全 数据安全/隐私保护
🔎Android安全攻防实战!守护你的应用数据安全,让用户放心使用!🛡️
【7月更文挑战第28天】在移动应用盛行的时代,确保Android应用安全性至关重要。本文以问答形式探讨了主要安全威胁(如逆向工程、数据窃取)及其对策。建议使用代码混淆、签名验证、数据加密等技术来增强应用保护。此外,还推荐了加密API、HTTPS通信、代码审计等措施来进一步加强安全性。综上所述,全面的安全策略对于构建安全可靠的应用环境必不可少。#Android #应用安全 #代码混淆 #数据加密
328 3
|
JavaScript 前端开发 Android开发
《Android游戏开发详解》一2.13 调用对象的行为
在前面的小节中,我们介绍了如何赋值和访问所创建的对象的状态。接下来,我们讨论方法,并且学习如何调用对象的行为。
1272 0
|
22天前
|
开发工具 Android开发
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
248 11
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡

热门文章

最新文章