mirror of
https://github.com/DroidPluginTeam/DroidPlugin.git
synced 2026-10-17 04:30:34 +08:00
Fix(IMountServiceHookHandle): IO redirect BUG
This commit is contained in:
+55
-18
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user