AMS Hook

2,AMS Hook

AMS 的详细Hook点请看这篇文章, http://blog.csdn.net/u012439416/article/details/70665923

Hook AMS只需要简单的Hook ActivityManagerNative的gDefault变量就可以了。

该变量定义如下,

private static final Singleton<IActivityManager> gDefault = new Singleton<IActivityManager>() {  
    protected IActivityManager create() {  
        IBinder b = ServiceManager.getService("activity");  
        IActivityManager am = asInterface(  
        return am;  
    }  
};  

但是, Android不同版本之间对于如何保存这个单例的代理对象是不同的;

Android 2.x系统直接使用了一个简单的静态变量存储,Android4.x以上抽象出了一个Singleton类。

所以需要根据对象的不同进行Hook。

2.1 Hook过程解析

HookFactory的installHook有关AMS的代码如下,

installHook(new IActivityManagerHook (context), classLoader);

IActivityManagerHook有关的结构图如下,


同样的,看结构图就一目了然了。

IactivityManagerHook的onInstall方法主要逻辑如下,

1,获取ActivityManagerNative的gDefault变量,

Class cls = ActivityManagerNativeCompat.Class();
Object obj = FieldUtils.readStaticField(cls, "gDefault");
if (obj == null) {
     ActivityManagerNativeCompat.getDefault();
     obj = FieldUtils.readStaticField(cls, "gDefault");
}

2,根据版本的不同分别进行Hook,

if (IActivityManagerCompat.isIActivityManager(obj)) {
   setOldObj(obj);
   Class<?> objClass = mOldObj.getClass();
   List<Class<?>> interfaces = Utils.getAllInterfaces(objClass);
   Class[] ifs = interfaces != null && interfaces.size() > 0 ? interfaces.toArray(new Class[interfaces.size()]) : new Class[0];
   Object proxiedActivityManager = MyProxy.newProxyInstance(objClass.getClassLoader(), ifs, this);
    FieldUtils.writeStaticField(cls, "gDefault", proxiedActivityManager);
    Log.i(TAG, "Install ActivityManager Hook 1 old=%s,new=%s", mOldObj, proxiedActivityManager);
} else if (SingletonCompat.isSingleton(obj)) {
Object obj1 = FieldUtils.readField(obj, "mInstance");
•••

2.2 Hook方法

和前面论述的完全一样,都是对方法进行Hook,看看Hook 了哪些方法。

IActivityManagerHookHandle的init方法Hook了几十种方法,部分代码如下,

sHookedMethodHandlers.put("startActivity", new startActivity(mHostContext));
sHookedMethodHandlers.put("startActivityAsUser", new startActivityAsUser(mHostContext));
sHookedMethodHandlers.put("startActivityAsCaller", new startActivityAsCaller(mHostContext));
•••

当然这些类都是IActivityManagerHookHandle的内部类,并这些类的beforeInvoke方法在此就不多分析了。

小结:AMS Hook之后,调用AMS的startActivity方法其实是调用startActivity的beforeInvoke方法,其他方法以此类推。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值