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

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


目录
相关文章
|
安全 算法 网络协议
解析:HTTPS通过SSL/TLS证书加密的原理与逻辑
HTTPS通过SSL/TLS证书加密,结合对称与非对称加密及数字证书验证实现安全通信。首先,服务器发送含公钥的数字证书,客户端验证其合法性后生成随机数并用公钥加密发送给服务器,双方据此生成相同的对称密钥。后续通信使用对称加密确保高效性和安全性。同时,数字证书验证服务器身份,防止中间人攻击;哈希算法和数字签名确保数据完整性,防止篡改。整个流程保障了身份认证、数据加密和完整性保护。
|
数据采集 监控 API
加密货币 Pump 监测刮刀工具开发原理及实现路径
开发Pump监测刮刀工具需综合运用高频数据采集、波动率建模、跨平台对冲三大核心技术,2025年的技术瓶颈已从基础数据获取转向超低延迟执行与合规适配。建议采用模块化开发策略,优先实现核心监控功能,再逐步接入AI决策与链上套利模块。代码示例需根据最新交易所API文档动态调整,并严格遵守所在地监管法规。
|
存储 监控 算法
taosd 写入与查询场景下压缩解压及加密解密的 CPU 占用分析
在当今大数据时代,时序数据库的应用越来越广泛,尤其是在物联网、工业监控、金融分析等领域。TDengine 作为一款高性能的时序数据库,凭借独特的存储架构和高效的压缩算法,在存储和查询效率上表现出色。然而,随着数据规模的不断增长,在保证数据安全性和存储效率的同时,如何优化 CPU 的资源占用,成为了一个值得深入讨论的问题。
308 1
|
安全 算法 网络协议
【网络原理】——图解HTTPS如何加密(通俗简单易懂)
HTTPS加密过程,明文,密文,密钥,对称加密,非对称加密,公钥和私钥,证书加密
|
算法 安全 Java
即时通讯安全篇(一):正确地理解和使用Android端加密算法
本文主要讨论针对Android这样的移动端应用开发时,如何正确的理解目前常用的加密算法,为诸如即时通讯应用的实战开发,如何在合适的场景下选择适合的算法,提供一些参考。
500 0
|
安全 网络协议 网络安全
【Azure 环境】从网络包中分析出TLS加密套件信息
An TLS 1.2 connection request was received from a remote client application, but non of the cipher suites supported by the client application are supported by the server. The connection request has failed. 从远程客户端应用程序收到 TLS 1.2 连接请求,但服务器不支持客户端应用程序支持的任何密码套件。连接请求失败。
595 2
|
存储 安全 算法
网络安全与信息安全:构建数字世界的防线在数字化浪潮席卷全球的今天,网络安全与信息安全已成为维系现代社会正常运转的关键支柱。本文旨在深入探讨网络安全漏洞的成因与影响,剖析加密技术的原理与应用,并强调提升公众安全意识的重要性。通过这些综合性的知识分享,我们期望为读者提供一个全面而深刻的网络安全视角,助力个人与企业在数字时代中稳健前行。
本文聚焦网络安全与信息安全领域,详细阐述了网络安全漏洞的潜在威胁、加密技术的强大防护作用以及安全意识培养的紧迫性。通过对真实案例的分析,文章揭示了网络攻击的多样性和复杂性,强调了构建全方位、多层次防御体系的必要性。同时,结合当前技术发展趋势,展望了未来网络安全领域的新挑战与新机遇,呼吁社会各界共同努力,共筑数字世界的安全防线。
|
数据采集 数据可视化 数据挖掘
基于python django的scrapy去哪儿网数据采集与分析,包括登录注册和可视化大屏,有md5加密
本文介绍了一个基于Python和Django框架,使用Scrapy进行去哪儿网数据采集与分析的项目,包括实现登录注册功能、MD5加密以及通过可视化大屏展示分析结果的综合系统。
334 1
基于python django的scrapy去哪儿网数据采集与分析,包括登录注册和可视化大屏,有md5加密
|
算法 安全 数据安全/隐私保护
Android经典实战之常见的移动端加密算法和用kotlin进行AES-256加密和解密
本文介绍了移动端开发中常用的数据加密算法,包括对称加密(如 AES 和 DES)、非对称加密(如 RSA)、散列算法(如 SHA-256 和 MD5)及消息认证码(如 HMAC)。重点讲解了如何使用 Kotlin 实现 AES-256 的加密和解密,并提供了详细的代码示例。通过生成密钥、加密和解密数据等步骤,展示了如何在 Kotlin 项目中实现数据的安全加密。
1250 1
|
算法 安全 数据安全/隐私保护
Android经典实战之常见的移动端加密算法和用kotlin进行AES-256加密和解密
本文介绍了移动端开发中常用的数据加密算法,包括对称加密(如 AES 和 DES)、非对称加密(如 RSA)、散列算法(如 SHA-256 和 MD5)及消息认证码(如 HMAC)。重点展示了如何使用 Kotlin 实现 AES-256 的加密和解密,提供了详细的代码示例。
754 2