From abd30de39c151882cecef56997cb13c58965aa1d Mon Sep 17 00:00:00 2001 From: Jean-Marie Mineau Date: Tue, 15 Apr 2025 17:30:48 +0200 Subject: [PATCH] add activities --- test_apks/dyn_and_ref/.gitignore | 1 + test_apks/dyn_and_ref/AndroidManifest.xml | 20 +++ test_apks/dyn_and_ref/Makefile | 8 +- .../theseus/dynandref/AIReflectee.java | 35 +++++ .../theseus/dynandref/APReflectee.java | 22 +++ .../example/theseus/dynandref/AReflectee.java | 62 ++++++++ .../example/theseus/dynandref/ICollider.java | 2 +- .../dynandref/ClassLoaderContextActivity.java | 52 ++++++- ...ParentDelegateLastClassLoaderActivity.java | 3 + ...isionWithParentDexClassLoaderActivity.java | 3 + ...hParentInMemoryDexClassLoaderActivity.java | 3 + ...sionWithParentPathClassLoaderActivity.java | 3 + ...ParentDelegateLastClassLoaderActivity.java | 3 + ...onWithoutParentDexClassLoaderActivity.java | 3 + ...tParentInMemoryDexClassLoaderActivity.java | 3 + ...nWithoutParentPathClassLoaderActivity.java | 3 + .../DelegateLastClassLoaderActivity.java | 4 + .../dynandref/DexClassLoaderActivity.java | 4 + .../InMemoryDexClassLoaderActivity.java | 4 + .../com/example/theseus/dynandref/Main.java | 140 ++++++++++++++++-- .../theseus/dynandref/MainActivity.java | 22 +-- .../theseus/dynandref/MainIReflectee.java | 35 +++++ .../theseus/dynandref/MainPReflectee.java | 22 +++ .../theseus/dynandref/MainReflectee.java | 62 ++++++++ .../theseus/dynandref/MethodActivity.java | 19 ++- ...ParentDelegateLastClassLoaderActivity.java | 3 + ...isionWithParentDexClassLoaderActivity.java | 3 + ...hParentInMemoryDexClassLoaderActivity.java | 3 + ...sionWithParentPathClassLoaderActivity.java | 3 + ...ParentDelegateLastClassLoaderActivity.java | 3 + ...onWithoutParentDexClassLoaderActivity.java | 3 + ...tParentInMemoryDexClassLoaderActivity.java | 3 + ...nWithoutParentPathClassLoaderActivity.java | 3 + .../dynandref/PathClassLoaderActivity.java | 4 + 34 files changed, 527 insertions(+), 39 deletions(-) create mode 100644 test_apks/dyn_and_ref/java/a/com/example/theseus/dynandref/AIReflectee.java create mode 100644 test_apks/dyn_and_ref/java/a/com/example/theseus/dynandref/APReflectee.java create mode 100644 test_apks/dyn_and_ref/java/a/com/example/theseus/dynandref/AReflectee.java create mode 100644 test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/CollisionWithParentDelegateLastClassLoaderActivity.java create mode 100644 test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/CollisionWithParentDexClassLoaderActivity.java create mode 100644 test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/CollisionWithParentInMemoryDexClassLoaderActivity.java create mode 100644 test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/CollisionWithParentPathClassLoaderActivity.java create mode 100644 test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/CollisionWithoutParentDelegateLastClassLoaderActivity.java create mode 100644 test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/CollisionWithoutParentDexClassLoaderActivity.java create mode 100644 test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/CollisionWithoutParentInMemoryDexClassLoaderActivity.java create mode 100644 test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/CollisionWithoutParentPathClassLoaderActivity.java create mode 100644 test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/DelegateLastClassLoaderActivity.java create mode 100644 test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/DexClassLoaderActivity.java create mode 100644 test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/InMemoryDexClassLoaderActivity.java create mode 100644 test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/MainIReflectee.java create mode 100644 test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/MainPReflectee.java create mode 100644 test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/MainReflectee.java create mode 100644 test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/NoCollisionWithParentDelegateLastClassLoaderActivity.java create mode 100644 test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/NoCollisionWithParentDexClassLoaderActivity.java create mode 100644 test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/NoCollisionWithParentInMemoryDexClassLoaderActivity.java create mode 100644 test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/NoCollisionWithParentPathClassLoaderActivity.java create mode 100644 test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/NoCollisionWithoutParentDelegateLastClassLoaderActivity.java create mode 100644 test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/NoCollisionWithoutParentDexClassLoaderActivity.java create mode 100644 test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/NoCollisionWithoutParentInMemoryDexClassLoaderActivity.java create mode 100644 test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/NoCollisionWithoutParentPathClassLoaderActivity.java create mode 100644 test_apks/dyn_and_ref/java/classes/com/example/theseus/dynandref/PathClassLoaderActivity.java 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 {}