wip compare class laoder

This commit is contained in:
Jean-Marie Mineau 2025-05-05 17:31:23 +02:00
parent 59d6caabd8
commit 1884ff4ac8
Signed by: histausse
GPG key ID: B66AEEDA9B645AD2
7 changed files with 326 additions and 108 deletions

View file

@ -14,6 +14,14 @@ import java.lang.reflect.Method;
import com.example.theseus.Utils;
public class Main {
static ClassLoader delegateLastClassLoaderParent = null;
static ClassLoader delegateLastClassLoader = null;
static ClassLoader dexClassLoaderParent = null;
static ClassLoader dexClassLoader = null;
static ClassLoader inMemoryDexClassLoaderParent = null;
static ClassLoader inMemoryDexClassLoader = null;
static ClassLoader pathClassLoaderParent = null;
static ClassLoader pathClassLoader = null;
public static String getdexfile(Activity ac, String name) throws Exception {
File dexfile = new File(ac.getCacheDir(), name);
@ -30,25 +38,65 @@ public class Main {
}
public static void run(Activity ac, String clname, boolean hasCollision, boolean hasParent, String methodType) {
ClassLoader cl = Main.class.getClassLoader();
ClassLoader parent;
try {
Log.i("THESEUS", "clname: " + clname + ", hasCollision: " + hasCollision + ", hasParent: " + hasParent + ", methodType: " + methodType);
ClassLoader cl;
ClassLoader parent;
String name = "a.dex";
if (hasParent) {
parent = Main.class.getClassLoader();
name = "b.dex";
} else {
parent = null;
}
if (clname.equals("DelegateLastClassLoader")) {
cl = new DelegateLastClassLoader(getdexfile(ac, "a.dex"), parent);
if (parent == null) {
if (delegateLastClassLoader == null) {
delegateLastClassLoader = new DelegateLastClassLoader(getdexfile(ac, name), parent);
}
cl = delegateLastClassLoader;
} else {
if (delegateLastClassLoaderParent == null) {
delegateLastClassLoaderParent = new DelegateLastClassLoader(getdexfile(ac, name), parent);
}
cl = delegateLastClassLoaderParent;
}
} else if (clname.equals("DexClassLoader")) {
cl = new DexClassLoader(getdexfile(ac, "a.dex"), null, null, parent);
if (parent == null) {
if (dexClassLoader == null) {
dexClassLoader = new DexClassLoader(getdexfile(ac, name), null, null, parent);
}
cl = dexClassLoader;
} else {
if (dexClassLoaderParent == null) {
dexClassLoaderParent = new DexClassLoader(getdexfile(ac, name), null, null, parent);
}
cl = dexClassLoaderParent;
}
} else if (clname.equals("InMemoryDexClassLoader")) {
cl = new InMemoryDexClassLoader(getdexbuffer(ac, "a.dex"), parent);
if (parent == null) {
if (inMemoryDexClassLoader == null) {
inMemoryDexClassLoader = new InMemoryDexClassLoader(getdexbuffer(ac, name), parent);
}
cl = inMemoryDexClassLoader;
} else {
if (inMemoryDexClassLoaderParent == null) {
inMemoryDexClassLoaderParent = new InMemoryDexClassLoader(getdexbuffer(ac, name), parent);
}
cl = inMemoryDexClassLoaderParent;
}
} else if (clname.equals("PathClassLoader")) {
cl = new PathClassLoader(getdexfile(ac, "a.dex"), parent);
} else {
cl = Main.class.getClassLoader();
if (parent == null) {
if (pathClassLoader == null) {
pathClassLoader = new PathClassLoader(getdexfile(ac, name), parent);
}
cl = pathClassLoader;
} else {
if (pathClassLoaderParent == null) {
pathClassLoaderParent = new PathClassLoader(getdexfile(ac, name), parent);
}
cl = pathClassLoaderParent;
}
}
Class clz = null;
@ -194,6 +242,7 @@ public class Main {
return;
};
} catch (Exception e) {
Log.e("THESEUS", "class loader name: " + cl.toString());
Log.e("THESEUS", "error:", e);
}
}

View file

@ -49,6 +49,11 @@ public class MainActivity extends Activity {
out = new FileOutputStream(outFile);
Utils.copy(in, out);
outFile.renameTo(new File(getCacheDir(), "a.dex")); // security?
in = assetManager.open("a.dex");
outFile = new File(getCacheDir(), "b.dex_");
out = new FileOutputStream(outFile);
Utils.copy(in, out);
outFile.renameTo(new File(getCacheDir(), "b.dex"));
} catch (IOException e) {}
try {
in.close();