【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


目录
相关文章
|
10月前
|
存储 安全 API
如何对 API 进行安全加密?
对API进行安全加密是保障数据安全和系统稳定的重要措施
866 60
|
6月前
|
存储 安全 数据安全/隐私保护
Hyper V文件复制安全:加密与访问控制
在Hyper-V环境中,确保文件复制的安全性至关重要。主要措施包括:启用数据加密、使用HTTPS协议和磁盘加密技术(如BitLocker)保护数据传输和存储;通过身份验证、权限管理和审核日志控制访问;定期更新补丁、实施网络隔离及制定备份恢复策略。这些多层次的安全措施共同防止未经授权的访问和数据泄露,保障数据安全。
Hyper V文件复制安全:加密与访问控制
|
7月前
|
安全 算法 物联网
SSL/TLS:互联网通信的加密基石与安全实践
**简介:** 在数字化时代,互联网每天传输海量敏感数据,网络攻击频发。SSL/TLS协议作为网络安全的基石,通过加密技术确保数据安全传输。本文解析SSL/TLS的技术架构、密码学原理、应用场景及常见误区,探讨其在未来的发展趋势,强调持续演进以应对新型威胁的重要性。 SSL/TLS不仅保障Web安全,还广泛应用于API、邮件、物联网等领域,并遵循合规标准如PCI DSS和GDPR。
|
7月前
|
算法 安全 Java
即时通讯安全篇(一):正确地理解和使用Android端加密算法
本文主要讨论针对Android这样的移动端应用开发时,如何正确的理解目前常用的加密算法,为诸如即时通讯应用的实战开发,如何在合适的场景下选择适合的算法,提供一些参考。
175 0
|
监控 安全 算法
【Android 安全】DEX 加密 ( Application 替换 | 兼容 ContentProvider 操作 | 源码资源 )(三)
【Android 安全】DEX 加密 ( Application 替换 | 兼容 ContentProvider 操作 | 源码资源 )(三)
183 0
【Android 安全】DEX 加密 ( Application 替换 | 兼容 ContentProvider 操作 | 源码资源 )(三)
|
安全 Android开发 数据安全/隐私保护
【Android 安全】DEX 加密 ( Application 替换 | 兼容 ContentProvider 操作 | 源码资源 )(二)
【Android 安全】DEX 加密 ( Application 替换 | 兼容 ContentProvider 操作 | 源码资源 )(二)
213 0
|
监控 安全 Java
【Android 安全】DEX 加密 ( Application 替换 | 兼容 ContentProvider 操作 | 源码资源 )(一)
【Android 安全】DEX 加密 ( Application 替换 | 兼容 ContentProvider 操作 | 源码资源 )(一)
274 0
|
安全 Java Android开发
【Android 安全】DEX 加密 ( Application 替换 | 分析 ContentProvider 组件中调用 getApplication() 获取的 Application 二 )(二)
【Android 安全】DEX 加密 ( Application 替换 | 分析 ContentProvider 组件中调用 getApplication() 获取的 Application 二 )(二)
228 0
|
人工智能 安全 Java
【Android 安全】DEX 加密 ( Application 替换 | 分析 ContentProvider 组件中调用 getApplication() 获取的 Application 二 )(一)
【Android 安全】DEX 加密 ( Application 替换 | 分析 ContentProvider 组件中调用 getApplication() 获取的 Application 二 )(一)
224 0
|
安全 Java Android开发
【Android 安全】DEX 加密 ( Application 替换 | 分析 Activity 组件中获取的 Application | ActivityThread | LoadedApk )(三)
【Android 安全】DEX 加密 ( Application 替换 | 分析 Activity 组件中获取的 Application | ActivityThread | LoadedApk )(三)
153 0