package com.morgoo.droidplugin.hook.binder; import android.content.Context; import android.os.IBinder; import com.morgoo.droidplugin.hook.BaseHookHandle; import com.morgoo.droidplugin.hook.handle.IDisplayManagerHookHandle; import com.morgoo.droidplugin.reflect.FieldUtils; import com.morgoo.droidplugin.reflect.MethodUtils; import com.morgoo.helper.compat.IDisplayManagerCompat; /** * IDisplayManagerBinderHook * * @author Liu Yichen * @date 16/6/13 */ public class IDisplayManagerBinderHook extends BinderHook { private static final String TAG = IDisplayManagerBinderHook.class.getSimpleName(); private static final String SERVICE_NAME = Context.DISPLAY_SERVICE; public IDisplayManagerBinderHook(Context hostContext) { super(hostContext); } @Override public String getServiceName() { return SERVICE_NAME; } @Override Object getOldObj() throws Exception { IBinder iBinder = MyServiceManager.getOriginService(SERVICE_NAME); return IDisplayManagerCompat.asInterface(iBinder); } @Override protected void onInstall(ClassLoader classLoader) throws Throwable { super.onInstall(classLoader); Class displayManagerGlobalClass = Class.forName("android.hardware.display.DisplayManagerGlobal"); Object displayManagerGlobal = MethodUtils.invokeStaticMethod(displayManagerGlobalClass, "getInstance"); FieldUtils.writeField(displayManagerGlobal, "mDm", MyServiceManager.getProxiedObj(SERVICE_NAME)); } @Override protected BaseHookHandle createHookHandle() { return new IDisplayManagerHookHandle(mHostContext); } }