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方法,其他方法以此类推。