diff --git a/test_apks/dyn_and_ref/.gitignore b/test_apks/dyn_and_ref/.gitignore
index 487375c..bd3c063 100644
--- a/test_apks/dyn_and_ref/.gitignore
+++ b/test_apks/dyn_and_ref/.gitignore
@@ -1,3 +1,4 @@
build
ToyKey.keystore
java/classes/com/example/theseus/dynloading/R.java
+grodd-venv
diff --git a/test_apks/dyn_and_ref/AndroidManifest.xml b/test_apks/dyn_and_ref/AndroidManifest.xml
index a5cafdb..c5aa54a 100644
--- a/test_apks/dyn_and_ref/AndroidManifest.xml
+++ b/test_apks/dyn_and_ref/AndroidManifest.xml
@@ -17,6 +17,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test_apks/dyn_and_ref/Makefile b/test_apks/dyn_and_ref/Makefile
index 396ec02..54406fd 100644
--- a/test_apks/dyn_and_ref/Makefile
+++ b/test_apks/dyn_and_ref/Makefile
@@ -24,6 +24,7 @@ D8_ARGS =
pass=ahahah
export PATH := $(JAVA_PATH):$(PATH)
+export ANDROID_HOME := $(SDK_TOOLS)
all: $(shell mkdir -p build)
all: clean build/$(APP).apk
@@ -33,9 +34,10 @@ debug: JAVAC_ARGS += -g
debug: D8_ARGS += --debug
debug: all
-test: all
+test: all grodd-venv
$(ADB) install build/$(APP).apk
$(ADB) shell am start -n $(PACKAGE)/.$(MAIN_ACTIVITY)
+ grodd-venv/bin/grodd-runner -d emulator-5554 -r grodd -t 300 -p $(PACKAGE) # -s 1.
build/%.v1signed.apk: ./build/%.unsigned.apk ./ToyKey.keystore
$(JARSIGNER) -verbose -keystore ./ToyKey.keystore -storepass $(pass) -keypass $(pass) -signedjar $@ $< SignKey
@@ -67,6 +69,10 @@ build/%.apk: ./build/%.v2aligned.apk
ToyKey.keystore :
$(KEYTOOL) -genkeypair -validity 1000 -dname "CN=SomeKey,O=SomeOne,C=FR" -keystore $@ -storepass $(pass) -keypass $(pass) -alias SignKey -keyalg RSA -v
+grodd-venv:
+ python3 -m venv grodd-venv
+ grodd-venv/bin/pip install 'git+ssh://git@gitlab.inria.fr/CIDRE/malware/grodd-runner.git'
+
clean:
$(RM) -r build/*
diff --git a/test_apks/dyn_and_ref/java/a/com/example/theseus/dynandref/AIReflectee.java b/test_apks/dyn_and_ref/java/a/com/example/theseus/dynandref/AIReflectee.java
new file mode 100644
index 0000000..46d1058
--- /dev/null
+++ b/test_apks/dyn_and_ref/java/a/com/example/theseus/dynandref/AIReflectee.java
@@ -0,0 +1,35 @@
+package com.example.theseus.dynandref;
+
+public interface AIReflectee {
+ public String interTransfer(
+ boolean bool,
+ byte by,
+ short sh,
+ char ch,
+ int in,
+ long lo,
+ float fl,
+ double dou,
+ String str,
+ String... args
+ );
+
+ default public String staticInterfaceTransfer(
+ boolean bool,
+ byte by,
+ short sh,
+ char ch,
+ int in,
+ long lo,
+ float fl,
+ double dou,
+ String str,
+ String... args
+ ) {
+ String val = "";
+ for (String v : args) {
+ val += " " + v;
+ }
+ return "A:" + val + "(" + bool + " " + by + " " + sh + " " + ch + " " + in + " " + lo + " " + fl + " " + dou + " " + str + ")";
+ }
+}
diff --git a/test_apks/dyn_and_ref/java/a/com/example/theseus/dynandref/APReflectee.java b/test_apks/dyn_and_ref/java/a/com/example/theseus/dynandref/APReflectee.java
new file mode 100644
index 0000000..4dae25b
--- /dev/null
+++ b/test_apks/dyn_and_ref/java/a/com/example/theseus/dynandref/APReflectee.java
@@ -0,0 +1,22 @@
+package com.example.theseus.dynandref;
+
+public class APReflectee {
+ public String extendedTransfer(
+ boolean bool,
+ byte by,
+ short sh,
+ char ch,
+ int in,
+ long lo,
+ float fl,
+ double dou,
+ String str,
+ String... args
+ ) {
+ String val = "";
+ for (String v : args) {
+ val += " " + v;
+ }
+ return "A:" + val + "(" + bool + " " + by + " " + sh + " " + ch + " " + in + " " + lo + " " + fl + " " + dou + " " + str + ")";
+ }
+}
diff --git a/test_apks/dyn_and_ref/java/a/com/example/theseus/dynandref/AReflectee.java b/test_apks/dyn_and_ref/java/a/com/example/theseus/dynandref/AReflectee.java
new file mode 100644
index 0000000..abf06ca
--- /dev/null
+++ b/test_apks/dyn_and_ref/java/a/com/example/theseus/dynandref/AReflectee.java
@@ -0,0 +1,62 @@
+package com.example.theseus.dynandref;
+
+public class AReflectee extends APReflectee implements AIReflectee {
+ public static String getReflecteeId() {
+ return "A";
+ }
+ public String virtTransfer(
+ boolean bool,
+ byte by,
+ short sh,
+ char ch,
+ int in,
+ long lo,
+ float fl,
+ double dou,
+ String str,
+ String... args
+ ) {
+ String val = "";
+ for (String v : args) {
+ val += " " + v;
+ }
+ return getReflecteeId() + ":" + val + "(" + bool + " " + by + " " + sh + " " + ch + " " + in + " " + lo + " " + fl + " " + dou + " " + str + ")";
+ }
+ public static String staticTransfer(
+ boolean bool,
+ byte by,
+ short sh,
+ char ch,
+ int in,
+ long lo,
+ float fl,
+ double dou,
+ String str,
+ String... args
+ ) {
+ String val = "";
+ for (String v : args) {
+ val += " " + v;
+ }
+ return getReflecteeId() + ":" + val + "(" + bool + " " + by + " " + sh + " " + ch + " " + in + " " + lo + " " + fl + " " + dou + " " + str + ")";
+ }
+
+ public String interTransfer(
+ boolean bool,
+ byte by,
+ short sh,
+ char ch,
+ int in,
+ long lo,
+ float fl,
+ double dou,
+ String str,
+ String... args
+ ) {
+ String val = "";
+ for (String v : args) {
+ val += " " + v;
+ }
+ return getReflecteeId() + ":" + val + "(" + bool + " " + by + " " + sh + " " + ch + " " + in + " " + lo + " " + fl + " " + dou + " " + str + ")";
+ }
+}
diff --git a/test_apks/dyn_and_ref/java/a/com/example/theseus/dynandref/ICollider.java b/test_apks/dyn_and_ref/java/a/com/example/theseus/dynandref/ICollider.java
index d4a832e..3208077 100644
--- a/test_apks/dyn_and_ref/java/a/com/example/theseus/dynandref/ICollider.java
+++ b/test_apks/dyn_and_ref/java/a/com/example/theseus/dynandref/ICollider.java
@@ -30,6 +30,6 @@ public interface ICollider {
for (String v : args) {
val += " " + v;
}
- return "MainAPK:" + val + "(" + bool + " " + by + " " + sh + " " + ch + " " + in + " " + lo + " " + fl + " " + dou + " " + str + ")";
+ return "A:" + val + "(" + bool + " " + by + " " + sh + " " + ch + " " + in + " " + lo + " " + fl + " " + dou + " " + str + ")";
}
}
diff --git a/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/ClassLoaderContextActivity.java b/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/ClassLoaderContextActivity.java
index acbaf2a..6b07933 100644
--- a/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/ClassLoaderContextActivity.java
+++ b/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/ClassLoaderContextActivity.java
@@ -94,7 +94,7 @@ public class ClassLoaderContextActivity extends Activity {
Activity ac = this;
- b1.setText("Direct With Parent");
+ b1.setText("Collision With Parent");
b1.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
v.setBackgroundTintList(buttonColor);
@@ -102,7 +102,7 @@ public class ClassLoaderContextActivity extends Activity {
}
});
- b2.setText("Direct Without Parent");
+ b2.setText("Collision Without Parent");
b2.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
v.setBackgroundTintList(buttonColor);
@@ -110,14 +110,15 @@ public class ClassLoaderContextActivity extends Activity {
}
});
- b3.setText("Indirect With Parent");
+ b3.setText("No Collision With Parent");
b3.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
v.setBackgroundTintList(buttonColor);
+ nextActivity(classLoaderName, false, true);
}
});
- b4.setText("Indirect Without Parent");
+ b4.setText("No Collision Without Parent");
b4.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
v.setBackgroundTintList(buttonColor);
@@ -126,10 +127,47 @@ public class ClassLoaderContextActivity extends Activity {
});
}
- public void nextActivity(String classLoaderName, boolean isDirect, boolean hasParent) {
- Intent intent = new Intent(this, MethodActivity.class);
+ public void nextActivity(String classLoaderName, boolean hasCollision, boolean hasParent) {
+ Class cl = null;
+ if (classLoaderName.equals("DelegateLastClassLoader") && hasCollision && hasParent) {
+ cl = CollisionWithParentDelegateLastClassLoaderActivity.class;
+ } else if (classLoaderName.equals("DelegateLastClassLoader") && hasCollision && !hasParent) {
+ cl = CollisionWithParentDelegateLastClassLoaderActivity.class;
+ } else if (classLoaderName.equals("DelegateLastClassLoader") && !hasCollision && hasParent) {
+ cl = NoCollisionWithoutParentDelegateLastClassLoaderActivity.class;
+ } else if (classLoaderName.equals("DelegateLastClassLoader") && !hasCollision && !hasParent) {
+ cl = NoCollisionWithoutParentDelegateLastClassLoaderActivity.class;
+ } else if (classLoaderName.equals("DexClassLoader") && hasCollision && hasParent) {
+ cl = CollisionWithParentDexClassLoaderActivity.class;
+ } else if (classLoaderName.equals("DexClassLoader") && hasCollision && !hasParent) {
+ cl = CollisionWithParentDexClassLoaderActivity.class;
+ } else if (classLoaderName.equals("DexClassLoader") && !hasCollision && hasParent) {
+ cl = NoCollisionWithoutParentDexClassLoaderActivity.class;
+ } else if (classLoaderName.equals("DexClassLoader") && !hasCollision && !hasParent) {
+ cl = NoCollisionWithoutParentDexClassLoaderActivity.class;
+ } else if (classLoaderName.equals("InMemoryDexClassLoader") && hasCollision && hasParent) {
+ cl = CollisionWithParentInMemoryDexClassLoaderActivity.class;
+ } else if (classLoaderName.equals("InMemoryDexClassLoader") && hasCollision && !hasParent) {
+ cl = CollisionWithParentInMemoryDexClassLoaderActivity.class;
+ } else if (classLoaderName.equals("InMemoryDexClassLoader") && !hasCollision && hasParent) {
+ cl = NoCollisionWithoutParentInMemoryDexClassLoaderActivity.class;
+ } else if (classLoaderName.equals("InMemoryDexClassLoader") && !hasCollision && !hasParent) {
+ cl = NoCollisionWithoutParentInMemoryDexClassLoaderActivity.class;
+ } else if (classLoaderName.equals("PathClassLoader") && hasCollision && hasParent) {
+ cl = CollisionWithParentPathClassLoaderActivity.class;
+ } else if (classLoaderName.equals("PathClassLoader") && hasCollision && !hasParent) {
+ cl = CollisionWithParentPathClassLoaderActivity.class;
+ } else if (classLoaderName.equals("PathClassLoader") && !hasCollision && hasParent) {
+ cl = NoCollisionWithoutParentPathClassLoaderActivity.class;
+ } else if (classLoaderName.equals("PathClassLoader") && !hasCollision && !hasParent) {
+ cl = NoCollisionWithoutParentPathClassLoaderActivity.class;
+ } else {
+ Log.e("THESEUS", "error: unknown activity for " + classLoaderName + " with hasCollision = " + hasCollision + " and hasParent = " + hasParent);
+ return;
+ };
+ Intent intent = new Intent(this, cl);
intent.putExtra("classLoaderName", classLoaderName);
- intent.putExtra("direct", isDirect);
+ intent.putExtra("collision", hasCollision);
intent.putExtra("parent", hasParent);
startActivity(intent);
}
diff --git a/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/CollisionWithParentDelegateLastClassLoaderActivity.java b/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/CollisionWithParentDelegateLastClassLoaderActivity.java
new file mode 100644
index 0000000..5c62f70
--- /dev/null
+++ b/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/CollisionWithParentDelegateLastClassLoaderActivity.java
@@ -0,0 +1,3 @@
+package com.example.theseus.dynandref;
+
+public class CollisionWithParentDelegateLastClassLoaderActivity extends MethodActivity {}
diff --git a/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/CollisionWithParentDexClassLoaderActivity.java b/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/CollisionWithParentDexClassLoaderActivity.java
new file mode 100644
index 0000000..8abe43a
--- /dev/null
+++ b/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/CollisionWithParentDexClassLoaderActivity.java
@@ -0,0 +1,3 @@
+package com.example.theseus.dynandref;
+
+public class CollisionWithParentDexClassLoaderActivity extends MethodActivity {}
diff --git a/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/CollisionWithParentInMemoryDexClassLoaderActivity.java b/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/CollisionWithParentInMemoryDexClassLoaderActivity.java
new file mode 100644
index 0000000..ab8c1a3
--- /dev/null
+++ b/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/CollisionWithParentInMemoryDexClassLoaderActivity.java
@@ -0,0 +1,3 @@
+package com.example.theseus.dynandref;
+
+public class CollisionWithParentInMemoryDexClassLoaderActivity extends MethodActivity {}
diff --git a/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/CollisionWithParentPathClassLoaderActivity.java b/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/CollisionWithParentPathClassLoaderActivity.java
new file mode 100644
index 0000000..476810e
--- /dev/null
+++ b/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/CollisionWithParentPathClassLoaderActivity.java
@@ -0,0 +1,3 @@
+package com.example.theseus.dynandref;
+
+public class CollisionWithParentPathClassLoaderActivity extends MethodActivity {}
diff --git a/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/CollisionWithoutParentDelegateLastClassLoaderActivity.java b/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/CollisionWithoutParentDelegateLastClassLoaderActivity.java
new file mode 100644
index 0000000..b2044a0
--- /dev/null
+++ b/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/CollisionWithoutParentDelegateLastClassLoaderActivity.java
@@ -0,0 +1,3 @@
+package com.example.theseus.dynandref;
+
+public class CollisionWithoutParentDelegateLastClassLoaderActivity extends MethodActivity {}
diff --git a/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/CollisionWithoutParentDexClassLoaderActivity.java b/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/CollisionWithoutParentDexClassLoaderActivity.java
new file mode 100644
index 0000000..661c8e3
--- /dev/null
+++ b/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/CollisionWithoutParentDexClassLoaderActivity.java
@@ -0,0 +1,3 @@
+package com.example.theseus.dynandref;
+
+public class CollisionWithoutParentDexClassLoaderActivity extends MethodActivity {}
diff --git a/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/CollisionWithoutParentInMemoryDexClassLoaderActivity.java b/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/CollisionWithoutParentInMemoryDexClassLoaderActivity.java
new file mode 100644
index 0000000..28eb53e
--- /dev/null
+++ b/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/CollisionWithoutParentInMemoryDexClassLoaderActivity.java
@@ -0,0 +1,3 @@
+package com.example.theseus.dynandref;
+
+public class CollisionWithoutParentInMemoryDexClassLoaderActivity extends MethodActivity {}
diff --git a/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/CollisionWithoutParentPathClassLoaderActivity.java b/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/CollisionWithoutParentPathClassLoaderActivity.java
new file mode 100644
index 0000000..7504b64
--- /dev/null
+++ b/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/CollisionWithoutParentPathClassLoaderActivity.java
@@ -0,0 +1,3 @@
+package com.example.theseus.dynandref;
+
+public class CollisionWithoutParentPathClassLoaderActivity extends MethodActivity {}
diff --git a/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/DelegateLastClassLoaderActivity.java b/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/DelegateLastClassLoaderActivity.java
new file mode 100644
index 0000000..2f5f9f6
--- /dev/null
+++ b/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/DelegateLastClassLoaderActivity.java
@@ -0,0 +1,4 @@
+package com.example.theseus.dynandref;
+
+
+public class DelegateLastClassLoaderActivity extends ClassLoaderContextActivity {}
diff --git a/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/DexClassLoaderActivity.java b/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/DexClassLoaderActivity.java
new file mode 100644
index 0000000..f318737
--- /dev/null
+++ b/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/DexClassLoaderActivity.java
@@ -0,0 +1,4 @@
+package com.example.theseus.dynandref;
+
+
+public class DexClassLoaderActivity extends ClassLoaderContextActivity {}
diff --git a/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/InMemoryDexClassLoaderActivity.java b/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/InMemoryDexClassLoaderActivity.java
new file mode 100644
index 0000000..33c1289
--- /dev/null
+++ b/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/InMemoryDexClassLoaderActivity.java
@@ -0,0 +1,4 @@
+package com.example.theseus.dynandref;
+
+
+public class InMemoryDexClassLoaderActivity extends ClassLoaderContextActivity {}
diff --git a/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/Main.java b/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/Main.java
index ffdfc85..9ea83c6 100644
--- a/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/Main.java
+++ b/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/Main.java
@@ -29,7 +29,7 @@ public class Main {
return ByteBuffer.wrap(data);
}
- public static void run(Activity ac, String clname, boolean isDirect, boolean hasParent, String methodType) {
+ public static void run(Activity ac, String clname, boolean hasCollision, boolean hasParent, String methodType) {
try {
ClassLoader cl;
ClassLoader parent;
@@ -50,7 +50,13 @@ public class Main {
cl = Main.class.getClassLoader();
}
- Class clz = cl.loadClass("com.example.theseus.dynandref.Collider");
+ Class clz = null;
+ if (hasCollision) {
+ clz = cl.loadClass("com.example.theseus.dynandref.Collider");
+ } else {
+ clz = cl.loadClass("com.example.theseus.dynandref.AReflectee");
+ }
+
Object[] args = {
true,
(byte)42,
@@ -67,23 +73,95 @@ public class Main {
if (methodType.equals("Virtual")) {
Method mth = clz.getMethod("virtTransfer", boolean.class, byte.class, short.class, char.class, int.class, long.class, float.class, double.class, String.class, String[].class);
Object instance = clz.getDeclaredConstructor().newInstance();
- invoke(ac, instance, mth, args);
+ invoke(ac,
+ instance,
+ mth,
+ args,
+ true,
+ (byte)42,
+ (short)666,
+ '*',
+ 0xDEAD_BEEF,
+ 0xD1AB011C_5EAF00DL,
+ 0.99f,
+ 3.1415926535897932384626433d,
+ "",
+ new String[] {"some", "strings"}
+ );
} else if (methodType.equals("Static")) {
Method mth = clz.getMethod("staticTransfer", boolean.class, byte.class, short.class, char.class, int.class, long.class, float.class, double.class, String.class, String[].class);
- invoke(ac, null, mth, args);
+ invoke(ac,
+ null,
+ mth,
+ args,
+ true,
+ (byte)42,
+ (short)666,
+ '*',
+ 0xDEAD_BEEF,
+ 0xD1AB011C_5EAF00DL,
+ 0.99f,
+ 3.1415926535897932384626433d,
+ "",
+ new String[] {"some", "strings"}
+ );
} else if (methodType.equals("Extended")) {
Method mth = clz.getMethod("extendedTransfer", boolean.class, byte.class, short.class, char.class, int.class, long.class, float.class, double.class, String.class, String[].class);
Object instance = clz.getDeclaredConstructor().newInstance();
- invoke(ac, instance, mth, args);
+ invoke(ac,
+ instance,
+ mth,
+ args,
+ true,
+ (byte)42,
+ (short)666,
+ '*',
+ 0xDEAD_BEEF,
+ 0xD1AB011C_5EAF00DL,
+ 0.99f,
+ 3.1415926535897932384626433d,
+ "",
+ new String[] {"some", "strings"}
+ );
} else if (methodType.equals("Interface")) {
Method mth = clz.getMethod("interTransfer", boolean.class, byte.class, short.class, char.class, int.class, long.class, float.class, double.class, String.class, String[].class);
Object instance = clz.getDeclaredConstructor().newInstance();
- invoke(ac, instance, mth, args);
+ invoke(ac,
+ instance,
+ mth,
+ args,
+ true,
+ (byte)42,
+ (short)666,
+ '*',
+ 0xDEAD_BEEF,
+ 0xD1AB011C_5EAF00DL,
+ 0.99f,
+ 3.1415926535897932384626433d,
+ "",
+ new String[] {"some", "strings"}
+ );
} else if (methodType.equals("Interface Static")) {
- clz = cl.loadClass("com.example.theseus.dynandref.ICollider$-CC");
+ //clz = cl.loadClass("com.example.theseus.dynandref.ICollider$-CC");
+ //Method mth = clz.getMethod("$default$staticInterfaceTransfer", boolean.class, byte.class, short.class, char.class, int.class, long.class, float.class, double.class, String.class, String[].class);
+ clz = cl.loadClass("com.example.theseus.dynandref.ICollider");
Method mth = clz.getMethod("staticInterfaceTransfer", boolean.class, byte.class, short.class, char.class, int.class, long.class, float.class, double.class, String.class, String[].class);
- invoke(ac, null, mth, args);
- } else if (methodType.equals("Factory Pattern")) {
+ invoke(ac,
+ null,
+ mth,
+ args,
+ true,
+ (byte)42,
+ (short)666,
+ '*',
+ 0xDEAD_BEEF,
+ 0xD1AB011C_5EAF00DL,
+ 0.99f,
+ 3.1415926535897932384626433d,
+ "",
+ new String[] {"some", "strings"}
+ );
+ } else if (methodType.equals("Factory isDirectPattern")) {
return;
} else {
return;
@@ -93,9 +171,51 @@ public class Main {
}
}
- public static void invoke(Activity ac, Object instance, Method mth, Object[] args) throws Exception {
+ public static void invoke(
+ Activity ac, Object instance, Method mth, Object[] args,
+ // Additionnal args to check the register reservation
+ boolean bool,
+ byte by,
+ short sh,
+ char ch,
+ int in,
+ long lo,
+ float fl,
+ double dou,
+ String str,
+ String... strArgs
+ ) throws Exception {
args[8] = Utils.source();
+ Log.e("THESEUS", "instance: " + instance + " mth: " + mth);
String res = (String)mth.invoke(instance, args);
Utils.sink(ac, res);
+ if (!(
+ (bool == true) &&
+ (by == (byte)42) &&
+ (sh == (short)666) &&
+ (ch == '*') &&
+ (in == 0xDEAD_BEEF) &&
+ (lo == 0xD1AB011C_5EAF00DL) &&
+ (fl == 0.99f) &&
+ (dou == 3.1415926535897932384626433d) &&
+ str.equals("") &&
+ (strArgs.length == 2) &&
+ strArgs[0].equals("some") &&
+ strArgs[1].equals("strings")
+ )) {
+ Log.e("THESEUS", "Main.invoke additionnal arguments don't match");
+ Log.e("THESEUS", "bool: " + (bool == true));
+ Log.e("THESEUS", "by: " + (by == (byte)42));
+ Log.e("THESEUS", "sh: " + (sh == (short)666));
+ Log.e("THESEUS", "ch: " + (ch == '*'));
+ Log.e("THESEUS", "in: " + (in == 0xDEAD_BEEF));
+ Log.e("THESEUS", "lo: " + (lo == 0xD1AB011C_5EAF00DL));
+ Log.e("THESEUS", "fl: " + (fl == 0.99f));
+ Log.e("THESEUS", "dou: " + (dou == 3.1415926535897932384626433d));
+ Log.e("THESEUS", "str: " + str.equals(""));
+ Log.e("THESEUS", "strArgs.length: " + (strArgs.length == 2));
+ Log.e("THESEUS", "strArgs[0]: " + strArgs[0].equals("some"));
+ Log.e("THESEUS", "strArgs[1]: " + strArgs[1].equals("strings"));
+ }
}
}
diff --git a/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/MainActivity.java b/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/MainActivity.java
index 72484b7..f10871d 100644
--- a/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/MainActivity.java
+++ b/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/MainActivity.java
@@ -110,7 +110,9 @@ public class MainActivity extends Activity {
b1.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
v.setBackgroundTintList(buttonColor);
- nextActivity("DelegateLastClassLoader");
+ Intent intent = new Intent(ac, DelegateLastClassLoaderActivity.class);
+ intent.putExtra("classLoaderName", "DelegateLastClassLoader");
+ startActivity(intent);
}
});
@@ -118,7 +120,9 @@ public class MainActivity extends Activity {
b2.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
v.setBackgroundTintList(buttonColor);
- nextActivity("DexClassLoader");
+ Intent intent = new Intent(ac, DexClassLoaderActivity.class);
+ intent.putExtra("classLoaderName", "DexClassLoader");
+ startActivity(intent);
}
});
@@ -126,7 +130,9 @@ public class MainActivity extends Activity {
b3.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
v.setBackgroundTintList(buttonColor);
- nextActivity("InMemoryDexClassLoader");
+ Intent intent = new Intent(ac, InMemoryDexClassLoaderActivity.class);
+ intent.putExtra("classLoaderName", "InMemoryDexClassLoader");
+ startActivity(intent);
}
});
@@ -134,14 +140,10 @@ public class MainActivity extends Activity {
b4.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
v.setBackgroundTintList(buttonColor);
- nextActivity("PathClassLoader");
+ Intent intent = new Intent(ac, PathClassLoaderActivity.class);
+ intent.putExtra("classLoaderName", "PathClassLoader");
+ startActivity(intent);
}
});
}
-
- public void nextActivity(String classLoaderName) {
- Intent intent = new Intent(this, ClassLoaderContextActivity.class);
- intent.putExtra("classLoaderName", classLoaderName);
- startActivity(intent);
- }
}
diff --git a/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/MainIReflectee.java b/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/MainIReflectee.java
new file mode 100644
index 0000000..bfa075f
--- /dev/null
+++ b/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/MainIReflectee.java
@@ -0,0 +1,35 @@
+package com.example.theseus.dynandref;
+
+public interface MainIReflectee {
+ public String interTransfer(
+ boolean bool,
+ byte by,
+ short sh,
+ char ch,
+ int in,
+ long lo,
+ float fl,
+ double dou,
+ String str,
+ String... args
+ );
+
+ default public String staticInterfaceTransfer(
+ boolean bool,
+ byte by,
+ short sh,
+ char ch,
+ int in,
+ long lo,
+ float fl,
+ double dou,
+ String str,
+ String... args
+ ) {
+ String val = "";
+ for (String v : args) {
+ val += " " + v;
+ }
+ return "MainAPK:" + val + "(" + bool + " " + by + " " + sh + " " + ch + " " + in + " " + lo + " " + fl + " " + dou + " " + str + ")";
+ }
+}
diff --git a/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/MainPReflectee.java b/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/MainPReflectee.java
new file mode 100644
index 0000000..58dc549
--- /dev/null
+++ b/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/MainPReflectee.java
@@ -0,0 +1,22 @@
+package com.example.theseus.dynandref;
+
+public class MainPReflectee {
+ public String extendedTransfer(
+ boolean bool,
+ byte by,
+ short sh,
+ char ch,
+ int in,
+ long lo,
+ float fl,
+ double dou,
+ String str,
+ String... args
+ ) {
+ String val = "";
+ for (String v : args) {
+ val += " " + v;
+ }
+ return "MainAPK:" + val + "(" + bool + " " + by + " " + sh + " " + ch + " " + in + " " + lo + " " + fl + " " + dou + " " + str + ")";
+ }
+}
diff --git a/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/MainReflectee.java b/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/MainReflectee.java
new file mode 100644
index 0000000..5cb922b
--- /dev/null
+++ b/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/MainReflectee.java
@@ -0,0 +1,62 @@
+package com.example.theseus.dynandref;
+
+public class MainReflectee extends MainPReflectee implements MainIReflectee {
+ public static String getReflecteeId() {
+ return "MainAPK";
+ }
+ public String virtTransfer(
+ boolean bool,
+ byte by,
+ short sh,
+ char ch,
+ int in,
+ long lo,
+ float fl,
+ double dou,
+ String str,
+ String... args
+ ) {
+ String val = "";
+ for (String v : args) {
+ val += " " + v;
+ }
+ return getReflecteeId() + ":" + val + "(" + bool + " " + by + " " + sh + " " + ch + " " + in + " " + lo + " " + fl + " " + dou + " " + str + ")";
+ }
+ public static String staticTransfer(
+ boolean bool,
+ byte by,
+ short sh,
+ char ch,
+ int in,
+ long lo,
+ float fl,
+ double dou,
+ String str,
+ String... args
+ ) {
+ String val = "";
+ for (String v : args) {
+ val += " " + v;
+ }
+ return getReflecteeId() + ":" + val + "(" + bool + " " + by + " " + sh + " " + ch + " " + in + " " + lo + " " + fl + " " + dou + " " + str + ")";
+ }
+
+ public String interTransfer(
+ boolean bool,
+ byte by,
+ short sh,
+ char ch,
+ int in,
+ long lo,
+ float fl,
+ double dou,
+ String str,
+ String... args
+ ) {
+ String val = "";
+ for (String v : args) {
+ val += " " + v;
+ }
+ return getReflecteeId() + ":" + val + "(" + bool + " " + by + " " + sh + " " + ch + " " + in + " " + lo + " " + fl + " " + dou + " " + str + ")";
+ }
+}
diff --git a/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/MethodActivity.java b/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/MethodActivity.java
index 463ebb2..ff0194d 100644
--- a/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/MethodActivity.java
+++ b/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/MethodActivity.java
@@ -38,14 +38,13 @@ import java.util.Arrays;
public class MethodActivity extends Activity {
public String classLoaderName;
+ public boolean hasCollision;
public boolean hasParent;
- public boolean isDirect;
public String getdexfile(String name) {
File dexfile = new File(getCacheDir(), name);
dexfile.setReadOnly();
- Log.e("DEBUG", dexfile.getPath());
return dexfile.getPath();
}
@@ -54,7 +53,7 @@ public class MethodActivity extends Activity {
super.onCreate(savedInstanceState);
Intent intent = getIntent();
classLoaderName = intent.getStringExtra("classLoaderName");
- isDirect = intent.getBooleanExtra("direct", false);
+ hasCollision = intent.getBooleanExtra("collision", false);
hasParent = intent.getBooleanExtra("parent", false);
ColorStateList buttonColor = ColorStateList.valueOf(0xff808080);
@@ -95,7 +94,7 @@ public class MethodActivity extends Activity {
Button b5 = new Button(this);
b5.generateViewId();
- linLayout.addView(b5);
+ //linLayout.addView(b5); // Static Interface Methods are a pain
Button b6 = new Button(this);
b6.generateViewId();
@@ -111,7 +110,7 @@ public class MethodActivity extends Activity {
b1.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
v.setBackgroundTintList(buttonColor);
- Main.run(ac, classLoaderName, isDirect, hasParent, "Virtual");
+ Main.run(ac, classLoaderName, hasCollision, hasParent, "Virtual");
}
});
@@ -119,7 +118,7 @@ public class MethodActivity extends Activity {
b2.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
v.setBackgroundTintList(buttonColor);
- Main.run(ac, classLoaderName, isDirect, hasParent, "Static");
+ Main.run(ac, classLoaderName, hasCollision, hasParent, "Static");
}
});
@@ -127,7 +126,7 @@ public class MethodActivity extends Activity {
b3.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
v.setBackgroundTintList(buttonColor);
- Main.run(ac, classLoaderName, isDirect, hasParent, "Extended");
+ Main.run(ac, classLoaderName, hasCollision, hasParent, "Extended");
}
});
@@ -135,7 +134,7 @@ public class MethodActivity extends Activity {
b4.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
v.setBackgroundTintList(buttonColor);
- Main.run(ac, classLoaderName, isDirect, hasParent, "Interface");
+ Main.run(ac, classLoaderName, hasCollision, hasParent, "Interface");
}
});
@@ -143,7 +142,7 @@ public class MethodActivity extends Activity {
b5.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
v.setBackgroundTintList(buttonColor);
- Main.run(ac, classLoaderName, isDirect, hasParent, "Interface Static");
+ Main.run(ac, classLoaderName, hasCollision, hasParent, "Interface Static");
}
});
@@ -151,7 +150,7 @@ public class MethodActivity extends Activity {
b6.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
v.setBackgroundTintList(buttonColor);
- Main.run(ac, classLoaderName, isDirect, hasParent, "Factory Pattern");
+ Main.run(ac, classLoaderName, hasCollision, hasParent, "Factory Pattern");
}
});
}
diff --git a/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/NoCollisionWithParentDelegateLastClassLoaderActivity.java b/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/NoCollisionWithParentDelegateLastClassLoaderActivity.java
new file mode 100644
index 0000000..70dcc27
--- /dev/null
+++ b/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/NoCollisionWithParentDelegateLastClassLoaderActivity.java
@@ -0,0 +1,3 @@
+package com.example.theseus.dynandref;
+
+public class NoCollisionWithParentDelegateLastClassLoaderActivity extends MethodActivity {}
diff --git a/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/NoCollisionWithParentDexClassLoaderActivity.java b/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/NoCollisionWithParentDexClassLoaderActivity.java
new file mode 100644
index 0000000..6c3877b
--- /dev/null
+++ b/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/NoCollisionWithParentDexClassLoaderActivity.java
@@ -0,0 +1,3 @@
+package com.example.theseus.dynandref;
+
+public class NoCollisionWithParentDexClassLoaderActivity extends MethodActivity {}
diff --git a/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/NoCollisionWithParentInMemoryDexClassLoaderActivity.java b/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/NoCollisionWithParentInMemoryDexClassLoaderActivity.java
new file mode 100644
index 0000000..dab6939
--- /dev/null
+++ b/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/NoCollisionWithParentInMemoryDexClassLoaderActivity.java
@@ -0,0 +1,3 @@
+package com.example.theseus.dynandref;
+
+public class NoCollisionWithParentInMemoryDexClassLoaderActivity extends MethodActivity {}
diff --git a/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/NoCollisionWithParentPathClassLoaderActivity.java b/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/NoCollisionWithParentPathClassLoaderActivity.java
new file mode 100644
index 0000000..3f0b59a
--- /dev/null
+++ b/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/NoCollisionWithParentPathClassLoaderActivity.java
@@ -0,0 +1,3 @@
+package com.example.theseus.dynandref;
+
+public class NoCollisionWithParentPathClassLoaderActivity extends MethodActivity {}
diff --git a/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/NoCollisionWithoutParentDelegateLastClassLoaderActivity.java b/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/NoCollisionWithoutParentDelegateLastClassLoaderActivity.java
new file mode 100644
index 0000000..2309a6c
--- /dev/null
+++ b/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/NoCollisionWithoutParentDelegateLastClassLoaderActivity.java
@@ -0,0 +1,3 @@
+package com.example.theseus.dynandref;
+
+public class NoCollisionWithoutParentDelegateLastClassLoaderActivity extends MethodActivity {}
diff --git a/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/NoCollisionWithoutParentDexClassLoaderActivity.java b/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/NoCollisionWithoutParentDexClassLoaderActivity.java
new file mode 100644
index 0000000..e25c32a
--- /dev/null
+++ b/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/NoCollisionWithoutParentDexClassLoaderActivity.java
@@ -0,0 +1,3 @@
+package com.example.theseus.dynandref;
+
+public class NoCollisionWithoutParentDexClassLoaderActivity extends MethodActivity {}
diff --git a/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/NoCollisionWithoutParentInMemoryDexClassLoaderActivity.java b/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/NoCollisionWithoutParentInMemoryDexClassLoaderActivity.java
new file mode 100644
index 0000000..8e93136
--- /dev/null
+++ b/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/NoCollisionWithoutParentInMemoryDexClassLoaderActivity.java
@@ -0,0 +1,3 @@
+package com.example.theseus.dynandref;
+
+public class NoCollisionWithoutParentInMemoryDexClassLoaderActivity extends MethodActivity {}
diff --git a/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/NoCollisionWithoutParentPathClassLoaderActivity.java b/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/NoCollisionWithoutParentPathClassLoaderActivity.java
new file mode 100644
index 0000000..13d2ce1
--- /dev/null
+++ b/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/NoCollisionWithoutParentPathClassLoaderActivity.java
@@ -0,0 +1,3 @@
+package com.example.theseus.dynandref;
+
+public class NoCollisionWithoutParentPathClassLoaderActivity extends MethodActivity {}
diff --git a/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/PathClassLoaderActivity.java b/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/PathClassLoaderActivity.java
new file mode 100644
index 0000000..7dd267a
--- /dev/null
+++ b/test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/PathClassLoaderActivity.java
@@ -0,0 +1,4 @@
+package com.example.theseus.dynandref;
+
+
+public class PathClassLoaderActivity extends ClassLoaderContextActivity {}