Fix(IMountServiceHookHandle): IO redirect BUG

This commit is contained in:
Andy Zhang
2016-03-29 17:55:31 +08:00
parent 4b3c517cad
commit 3a2236b89f
@@ -29,16 +29,18 @@ import android.text.TextUtils;
import com.morgoo.droidplugin.hook.BaseHookHandle;
import com.morgoo.droidplugin.hook.HookedMethodHandler;
import com.morgoo.droidplugin.pm.PluginManager;
import java.lang.reflect.Method;
import java.util.regex.Pattern;
/**
* Created by Andy Zhang(zhangyong232@gmail.com) on 2015/3/6.
*/
public class IMountServiceHookHandle extends BaseHookHandle {
private static final String ANDROID_DATA = "Android/data/";
private static final String ANDROID_OBB = "Android/obb/";
// private static final String ANDROID_DATA = "Android/data/";
// private static final String ANDROID_OBB = "Android/obb/";
public IMountServiceHookHandle(Context context) {
super(context);
@@ -49,11 +51,22 @@ public class IMountServiceHookHandle extends BaseHookHandle {
sHookedMethodHandlers.put("mkdirs", new mkdirs(mHostContext));
}
private static final String VALID_JAVA_IDENTIFIER = "(\\p{javaJavaIdentifierStart}\\p{javaJavaIdentifierPart}*\\.)*\\p{javaJavaIdentifierStart}\\p{javaJavaIdentifierPart}*";
private static final Pattern ANDROID_DATA_PATTERN = Pattern.compile(VALID_JAVA_IDENTIFIER);
private static boolean validateJavaIdentifier(String identifier) {
return ANDROID_DATA_PATTERN.matcher(identifier).matches();
}
private class mkdirs extends HookedMethodHandler {
public mkdirs(Context context) {
super(context);
}
// /sdcard/Android/data/com.example.plugin/fdfdfdfd.fdfd
// /sdcard/Android/data/hostpackagename/Plugin/com.example.plugin/fdfdfdfd.fdfd
@Override
protected boolean beforeInvoke(Object receiver, Method method, Object[] args) throws Throwable {
if (VERSION.SDK_INT >= VERSION_CODES.KITKAT) {
@@ -71,14 +84,26 @@ public class IMountServiceHookHandle extends BaseHookHandle {
String path = (String) args[index1];
// String path1 = new File(Environment.getExternalStorageDirectory(), "Android/data/").getPath();
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;
String[] dirs = path.split("/");
if (dirs != null && dirs.length > 0) {
String pluginPackageName = null;
for (int i = 0; i < dirs.length; i++) {
String str = dirs[i];
if (TextUtils.isEmpty(str)) {
continue;
}
if (!validateJavaIdentifier(str)) {
continue;
}
if (PluginManager.getInstance().isPluginPackage(str)) {
pluginPackageName = str;
break;
}
}
if (pluginPackageName != null) {
path = path.replaceFirst(pluginPackageName, mHostContext.getPackageName() + "/Plugin/" + pluginPackageName);
args[index1] = path;
}
}
}
}
@@ -89,14 +114,26 @@ public class IMountServiceHookHandle extends BaseHookHandle {
String path = (String) args[index1];
// String path1 = new File(Environment.getExternalStorageDirectory(), "Android/data/").getPath();
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;
String[] dirs = path.split("/");
if (dirs != null && dirs.length > 0) {
String pluginPackageName = null;
for (int i = 0; i < dirs.length; i++) {
String str = dirs[i];
if (TextUtils.isEmpty(str)) {
continue;
}
if (!validateJavaIdentifier(str)) {
continue;
}
if (PluginManager.getInstance().isPluginPackage(str)) {
pluginPackageName = str;
break;
}
}
if (pluginPackageName != null) {
path = path.replaceFirst(pluginPackageName, mHostContext.getPackageName() + "/Plugin/" + pluginPackageName);
args[index1] = path;
}
}
}
}