Android相关

DroidPlugin Hook机制之AMS&PMS简述

2018-01-18  本文已影响24人  LeonXtp

java中反射的作用

从源码分析一个应用中有多少个Context实例

image.png

概述


ActivityManagerService对于FrameWork层的重要性不言而喻,Android的四大组件无一不与它打交道:

而PMS则完成了诸如权限校捡(checkPermission,checkUidPermission),Apk meta信息获取(getApplicationInfo等),四大组件信息获取(query系列方法)等重要功能。

AMS


一篇AMS介绍

2279655-b6048677817fb7fc.png

IActivityManager对应自定义的接口,ActivityManagerNative对应Stub,

涉及的关键类:

Context的启动流程:

Activity的启动流程:

Hook过程
            Class<?> activityManagerNativeClass = Class.forName("android.app.ActivityManagerNative");

            // 获取 gDefault 这个字段, 想办法替换它
            Field gDefaultField = activityManagerNativeClass.getDeclaredField("gDefault");
            gDefaultField.setAccessible(true);

            Object gDefault = gDefaultField.get(null);
            Class<?> singleton = Class.forName("android.util.Singleton");
            Field mInstanceField = singleton.getDeclaredField("mInstance");
            mInstanceField.setAccessible(true);

            // ActivityManagerNative 的gDefault对象里面原始的 IActivityManager对象
            Object rawIActivityManager = mInstanceField.get(gDefault);

PMS


同Activity一样,也是有两种方式获取:Context 和 Activity
ContextImpl.java

public PackageManager getPackageManager() {
    if (mPackageManager != null) {
        return mPackageManager;
    }

    IPackageManager pm = ActivityThread.getPackageManager();
    if (pm != null) {
        // Doesn't matter if we make more than one instance.
        return (mPackageManager = new ApplicationPackageManager(this, pm));
    }
    return null;
}

ActivityThread.java

public static IPackageManager getPackageManager() {
    if (sPackageManager != null) {
        return sPackageManager;
    }
    IBinder b = ServiceManager.getService("package");
    sPackageManager = IPackageManager.Stub.asInterface(b);
    return sPackageManager;
}

那么需要hook的,就是ActivityThread的静态属性sPackageManager和ContextImpl的mPackageManager属性了。

上一篇下一篇

猜你喜欢

热点阅读