android插件化(AMS Hook)

来源:互联网 发布:数控线切割编程3b代码 编辑:程序博客网 时间:2024/05/10 07:10
/** * startActivity方法最终会调用ActivityManagerNative, * ActivityManagerNative实际上就是ActivityManagerService这个远程对象的Binder代理对象 *  * static public IActivityManager getDefault() { * return gDefault.get(); * } *  * gDefault这个静态变量的定义如下: *  * private static final Singleton<IActivityManager> gDefault = new Singleton<IActivityManager>() { *     protected IActivityManager create() { *         IBinder b = ServiceManager.getService("activity_manager"); *         IActivityManager am = IActivityManager.Stub.asInterface(b); *         return am; *     } * }; *  * 由于Framework与AMS打交道是如此频繁,Framework使用了单例对象来保存这个AMS代理对象;这样只要需要与AMS进行IPC调用,获取这个单例即可, * 这是AMS这个系统服务与其他普通服务的不同之处,也是我们没使用Binder Hook的原因——我们只需要简单地Hook掉这个单例即可, * 不过Android不同版本对于如何保存这个单例的代理对象是不同的;Android 2.x系统直接使用静态变量存储,Android 4.x以上抽象出了一个Singleton类 *  * Context.startActivity --> ContextImpl.startActivity --> mMainThread.getInstrumentation().execStartActivity() --> * ActivityManagerNative.getDefault().startActivity() */package com.example.administrator.ams;import android.annotation.TargetApi;import android.content.ClipData;import android.content.Intent;import android.os.Build;import android.os.IBinder;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.Button;import java.lang.reflect.Field;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;public class MainActivity extends AppCompatActivity implements Button.OnClickListener {    private void hookAms() throws Exception {        Class<?> activityManagerNativeClass = Class.forName("android.app.ActivityManagerNative");        Field gDefaultField = activityManagerNativeClass.getDeclaredField("gDefault");        gDefaultField.setAccessible(true);        Object gDefault = gDefaultField.get(null);        /**         * 4.x以上的gDefault是一个 android.util.Singleton对象,我们取出这个单例里面的字段         */        Class<?> singleton = Class.forName("android.util.Singleton");        Field mInstanceField = singleton.getDeclaredField("mInstance");        mInstanceField.setAccessible(true);        /**         * ActivityManagerNative的gDefault对象里面原始的IActivityManager对象         */        Object rawIActivityManager = mInstanceField.get(gDefault);         /**          * 创建一个这个对象的代理对象,然后替换这个字段,让我们的代理对象帮忙干活          */        Class<?> IActivityManagerInterface = Class.forName("android.app.IActivityManager");        Object proxy = Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),                new Class<?>[]{IActivityManagerInterface}, new IActivityManagerHandler(rawIActivityManager));        mInstanceField.set(gDefault, proxy);    }    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        try {            hookAms();        } catch (Exception e) {            Log.e("wangzihan", "exception");            e.printStackTrace();        }    }    @Override    public void onClick(View v) {        getApplicationContext().startActivity(new Intent(this, SecondActivity.class));    }}class IActivityManagerHandler implements InvocationHandler {    private Object base;    IActivityManagerHandler(Object base) {        this.base = base;    }    @TargetApi(Build.VERSION_CODES.HONEYCOMB)    @Override    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {        Log.e("wangzihan", "hook IActivityManager in ActivityManagerNative");        return method.invoke(base, args);    }}
0 0
原创粉丝点击