diff --git a/project/Libraries/DroidPlugin/src/com/morgoo/droidplugin/hook/handle/IMountServiceHookHandle.java b/project/Libraries/DroidPlugin/src/com/morgoo/droidplugin/hook/handle/IMountServiceHookHandle.java index 9e607b2..db506e2 100644 --- a/project/Libraries/DroidPlugin/src/com/morgoo/droidplugin/hook/handle/IMountServiceHookHandle.java +++ b/project/Libraries/DroidPlugin/src/com/morgoo/droidplugin/hook/handle/IMountServiceHookHandle.java @@ -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; + } } } }