6.6 MountService Hook
结构图如下,
Hook 类 | IMountServiceBinderHook |
Hook 代理类 | IMountServiceHookHandle |
Hook 方法实现类 | mkdirs |
IMountServiceHookHandle的内部类mkdirs的beforeInvoke方法部分代码如下,
if (path != null) {
final boolean isAndroiDataHostPath = path.indexOf(ANDROID_DATA) < 0;
final boolean isAndroiObbHostPath = path.indexOf(ANDROID_OBB) < 0;
if (isAndroiDataHostPath && !isAndroiObbHostPath) {
path = path.replaceFirst(ANDROID_DATA, ANDROID_DATA + mHostContext.getPackageName() + "/Plugin/");
args[index1] = path;
} else if (!isAndroiDataHostPath && isAndroiObbHostPath) {
path = path.replaceFirst(ANDROID_OBB, ANDROID_OBB + mHostContext.getPackageName() + "/Plugin/");
args[index1] = path;
}
}
6.7 SearchManager Hook
结构图如下,
Hook 类 | ISearchManagerBinderHook |
Hook 代理类 | ISearchManagerHookHandle |
Hook 方法实现类 | getSearchableInfo |
getSearchableInfo的beforeInvoke方法如下,
protected boolean beforeInvoke(Object receiver, Method method, Object[] args) throws Throwable {
if (args != null && args.length > 0 && args[args.length - 1] instanceof ComponentName) {
ComponentName cpn = (ComponentName) args[args.length - 1];
ActivityInfo info = PluginManager.getInstance().getActivityInfo(cpn, 0);
if (info != null) {
ActivityInfo proxyInfo = PluginManager.getInstance().selectStubActivityInfo(info);
if (proxyInfo != null) {
args[args.length - 1] = new ComponentName(proxyInfo.packageName, proxyInfo.name);
}
}
}
return super.beforeInvoke(receiver, method, args);
}
6.8 ISessionManagerBinderHook Hook
结构图如下,
Hook 类 | ISessionManagerBinderHook |
Hook 代理类 | ISessionManagerHookHandle |
Hook 方法实现类 | createSession |
createSession的beforeInvoke方法如下,
protected boolean beforeInvoke(Object receiver, Method method, Object[] args) throws Throwable {
int index = 0;
if (args != null && args.length > index && args[index] instanceof String) {
String pkg = (String) args[index];
if (!TextUtils.equals(pkg, mHostContext.getPackageName())) {
args[index] = mHostContext.getPackageName();
}
}
return super.beforeInvoke(receiver, method, args);
}