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

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 【Android 安全】DEX 加密 ( Application 替换 | Android 应用启动原理 | LoadedApk 后续分析 )

文章目录

一、LoadedApk 后续分析

二、LoadedApk 后续先关源码



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






一、LoadedApk 后续分析


在 LoadedApk 的 makeApplication 方法中 , 调用 mActivityThread.mInstrumentation.newApplication( cl, appClass, appContext) 方法创建出 Application ;


之后将该 Application 设置到 appContext 中 ,


       

// 创建应用上下文 
            ContextImpl appContext = ContextImpl.createAppContext(mActivityThread, this);
            // 创建 Application , 传入三个参数 : 类加载器 , Application 全类名名称 , 上下文
            app = mActivityThread.mInstrumentation.newApplication(
                    cl, appClass, appContext);
                                appContext.setOuterContext(app);


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



appContext 是 ContextImpl 类型 , 其 setOuterContext 方法 , 将 Application 设置到了 Context 上下文中 ,


class ContextImpl extends Context {
    private Context mOuterContext;
    final void setOuterContext(Context context) {
        mOuterContext = context;
    }
}


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



ContextImpl 的 private Context mOuterContext 成员就是应用的 Application , 启动后就是默认的替换之前的 Application ;



① Application 设置给了 ContextImpl 的 private Context mOuterContext 成员



继续向下分析 , 此处将创建出的 Application 添加到了 mActivityThread.mAllApplications 集合中 , 该集合位于 ActivityThread 中 ;



② Application 添加到了 ActivityThread 中的 ArrayList<Application> mAllApplications 集合中



然后 Application 有设置给了 LoadedApk 的 mApplication 成员 ;



③ Application 设置给了 LoadedApk 中的 mApplication 成员



     

mActivityThread.mAllApplications.add(app);
        mApplication = app;


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


public final class ActivityThread {
    final ArrayList<Application> mAllApplications
            = new ArrayList<Application>();
}


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



后面的分支中 instrumentation 不为空 , 不会命中该分支 , 不予考虑 ;


   

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







二、LoadedApk 后续先关源码


public final class LoadedApk {
    private Application mApplication;
    public Application makeApplication(boolean forceDefaultAppClass,
            Instrumentation instrumentation) {
  // 如果 mApplication 成员不为空 , 则直接返回该成员 , 
  // 该 mApplication 成员表示应用的 Application
  // 此处说明 , 一个应用中 , 只存在一个 Application , 
  // 如果下次调用 LoadedApk 的 makeApplication 方法 , 
  // 直接将 LoadedApk 找那个的 mApplication 成员返回即可 ; 
        if (mApplication != null) {
            return mApplication;
        }
  // 声明一个空的 Application 变量 
        Application app = null;
  // 从 ApplicationInfo 对象中获取在 AndroidManifest.xml 中注册的 Application 全类名
        String appClass = mApplicationInfo.className;
        if (forceDefaultAppClass || (appClass == null)) {
            appClass = "android.app.Application";
        }
        try {
          // 获取类加载器 
            java.lang.ClassLoader cl = getClassLoader();
            // 系统相关应用 , 不会命中该分支 
            if (!mPackageName.equals("android")) {
                initializeJavaContextClassLoader();
            }
            // 创建应用上下文 
            ContextImpl appContext = ContextImpl.createAppContext(mActivityThread, this);
            // 创建 Application , 传入三个参数 : 类加载器 , Application 全类名名称 , 上下文
            app = mActivityThread.mInstrumentation.newApplication(
                    cl, appClass, appContext);
            appContext.setOuterContext(app);
        } catch (Exception e) {
            if (!mActivityThread.mInstrumentation.onException(app, e)) {
                throw new RuntimeException(
                    "Unable to instantiate application " + appClass
                    + ": " + e.toString(), e);
            }
        }
        mActivityThread.mAllApplications.add(app);
        mApplication = app;
        if (instrumentation != null) {
            try {
                instrumentation.callApplicationOnCreate(app);
            } catch (Exception e) {
                if (!instrumentation.onException(app, e)) {
                    throw new RuntimeException(
                        "Unable to create application " + app.getClass().getName()
                        + ": " + e.toString(), e);
                }
            }
        }
        // Rewrite the R 'constants' for all library apks.
        SparseArray<String> packageIdentifiers = getAssets(mActivityThread)
                .getAssignedPackageIdentifiers();
        final int N = packageIdentifiers.size();
        for (int i = 0; i < N; i++) {
            final int id = packageIdentifiers.keyAt(i);
            if (id == 0x01 || id == 0x7f) {
                continue;
            }
            rewriteRValues(getClassLoader(), packageIdentifiers.valueAt(i), id);
        }
        return app;
    }
}




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


目录
打赏
0
0
0
0
39
分享
相关文章
解析:HTTPS通过SSL/TLS证书加密的原理与逻辑
HTTPS通过SSL/TLS证书加密,结合对称与非对称加密及数字证书验证实现安全通信。首先,服务器发送含公钥的数字证书,客户端验证其合法性后生成随机数并用公钥加密发送给服务器,双方据此生成相同的对称密钥。后续通信使用对称加密确保高效性和安全性。同时,数字证书验证服务器身份,防止中间人攻击;哈希算法和数字签名确保数据完整性,防止篡改。整个流程保障了身份认证、数据加密和完整性保护。
|
2月前
|
探讨组合加密算法在IM中的应用
本文深入分析了即时通信(IM)系统中所面临的各种安全问题,综合利用对称加密算法(DES算法)、公开密钥算法(RSA算法)和Hash算法(MD5)的优点,探讨组合加密算法在即时通信中的应用。
36 0
|
2月前
|
即时通讯安全篇(一):正确地理解和使用Android端加密算法
本文主要讨论针对Android这样的移动端应用开发时,如何正确的理解目前常用的加密算法,为诸如即时通讯应用的实战开发,如何在合适的场景下选择适合的算法,提供一些参考。
85 0
量子加密技术的应用领域有哪些?
量子加密技术的应用领域有哪些?
583 59
【网络原理】——图解HTTPS如何加密(通俗简单易懂)
HTTPS加密过程,明文,密文,密钥,对称加密,非对称加密,公钥和私钥,证书加密
网络安全的盾与剑:漏洞防御与加密技术的实战应用
在数字化浪潮中,网络安全成为保护信息资产的重中之重。本文将深入探讨网络安全的两个关键领域——安全漏洞的防御策略和加密技术的应用,通过具体案例分析常见的安全威胁,并提供实用的防护措施。同时,我们将展示如何利用Python编程语言实现简单的加密算法,增强读者的安全意识和技术能力。文章旨在为非专业读者提供一扇了解网络安全复杂世界的窗口,以及为专业人士提供可立即投入使用的技术参考。
网络安全与信息安全:构建数字世界的防线在数字化浪潮席卷全球的今天,网络安全与信息安全已成为维系现代社会正常运转的关键支柱。本文旨在深入探讨网络安全漏洞的成因与影响,剖析加密技术的原理与应用,并强调提升公众安全意识的重要性。通过这些综合性的知识分享,我们期望为读者提供一个全面而深刻的网络安全视角,助力个人与企业在数字时代中稳健前行。
本文聚焦网络安全与信息安全领域,详细阐述了网络安全漏洞的潜在威胁、加密技术的强大防护作用以及安全意识培养的紧迫性。通过对真实案例的分析,文章揭示了网络攻击的多样性和复杂性,强调了构建全方位、多层次防御体系的必要性。同时,结合当前技术发展趋势,展望了未来网络安全领域的新挑战与新机遇,呼吁社会各界共同努力,共筑数字世界的安全防线。
|
6月前
|
Python 加密算法详解与应用
Python 加密算法详解与应用
129 1
企业级 文件传输加密应用,干货分享
企业级 文件传输加密应用,干货分享
65 0
《数字证书:互联网世界的"身份证"与"防盗门"》 ——揭秘网络安全背后的加密江湖
在2023年某深夜,上海陆家嘴金融公司机房遭遇黑客攻击,神秘青铜大门与九大掌门封印的玉牌突现,阻止了入侵。此门象征数字证书,保障网络安全。数字证书如验钞机识别假币,保护用户数据。它通过SSL/TLS加密、CA认证和非对称加密,构建安全通信。证书分为DV、OV、EV三类,分别适合不同场景。忽视证书安全可能导致巨额损失。阿里云提供一站式证书服务,助力企业部署SSL证书,迎接未来量子计算和物联网挑战。
下一篇
oss创建bucket