6.9 WifiManager Hook
结构图如下,
Hook 类 | IWifiManagerBinderHook |
Hook 代理类 | IWifiManagerHookHandle |
Hook 方法实现类 | getScanResults |
getBatchedScanResults | |
setWifiEnabled |
内部类 IWifiManagerHookedMethodHandler的beforeInvoke方法如下,
protected boolean beforeInvoke(Object receiver, Method method, Object[] args) throws Throwable {
//callingPackage
final int index = 0;
if (args != null && args.length > index && args[index] instanceof String) {
String callingPackage = (String) args[index];
if (!TextUtils.equals(callingPackage, mHostContext.getPackageName())) {
args[index] = mHostContext.getPackageName();
}
}
return super.beforeInvoke(receiver, method, args);
}
6.10,NotificationManager Hook
结构图如下,
Hook 类 | INotificationManagerBinderHook |
Hook 代理类 | INotificationManagerHookHandle |
Hook 方法实现类 | enqueueNotification |
cancelNotification | |
cancelAllNotifications | |
enqueueToast | |
cancelToast | |
enqueueNotificationWithTag | |
enqueueNotificationWithTagPriority | |
cancelNotificationWithTag | |
setNotificationsEnabledForPackage | |
areNotificationsEnabledForPackage |
不仅InotificationManagerHookHandle的内部类MyNotification实现了beforeInvoke方法,有些具体实现类也实现了beforeInvoke方法,
具体的beforeInvoke方法在此就不论述了。
6.11,WindowManagerHook
结构图如下,
Hook 类 | IWindowManagerBinderHook |
Hook 代理类 | IWindowManagerHookHandle |
Hook 方法实现类 | openSession |
overridePendingAppTransition | |
setAppStartingWindow |
其中openSession实现了afterInvoke方法,如下,
super.afterInvoke(receiver, method, args, invokeResult);
Class clazz = invokeResult.getClass();
IWindowSessionHook invocationHandler = new IWindowSessionHook(mHostContext, invokeResult);
invocationHandler.setEnable(true);
List<Class<?>> interfaces = Utils.getAllInterfaces(clazz);
Class[] ifs = interfaces != null && interfaces.size() > 0 ? interfaces.toArray(new Class[interfaces.size()]) : new Class[0];
Object newProxy = MyProxy.newProxyInstance(clazz.getClassLoader(), ifs, invocationHandler);
setFakedResult(newProxy);
居然实现了对WindowSession实现了Hook,并且安装好。WindowSession机制见下节分析。