From 22e3a14a6f60654051743c98d6060e03268a1193 Mon Sep 17 00:00:00 2001 From: osm0sis Date: Mon, 15 Jan 2024 16:35:18 -0400 Subject: [PATCH] Refactor VERBOSE_LOGS parsing to directly pass level from Native to Java --- app/src/main/cpp/main.cpp | 24 +++++++------------ .../playintegrityfix/EntryPoint.java | 12 ++++------ 2 files changed, 13 insertions(+), 23 deletions(-) diff --git a/app/src/main/cpp/main.cpp b/app/src/main/cpp/main.cpp index a190b8d..00177d9 100644 --- a/app/src/main/cpp/main.cpp +++ b/app/src/main/cpp/main.cpp @@ -156,9 +156,7 @@ public: if (dexVector.empty() || json.empty()) return; readJson(); - doHook(); - inject(); dexVector.clear(); @@ -178,7 +176,7 @@ private: void readJson() { LOGD("JSON contains %d keys!", static_cast(json.size())); - // Verbose logging if VERBOSE_LOGS with level number is last entry + // Verbose logging if VERBOSE_LOGS with level number is present if (json.contains("VERBOSE_LOGS")) { if (!json["VERBOSE_LOGS"].is_null() && json["VERBOSE_LOGS"].is_string() && json["VERBOSE_LOGS"] != "") { VERBOSE_LOGS = stoi(json["VERBOSE_LOGS"].get()); @@ -186,6 +184,7 @@ private: } else { LOGD("Error parsing VERBOSE_LOGS!"); } + json.erase("VERBOSE_LOGS"); } std::vector eraseKeys; @@ -215,35 +214,30 @@ private: void inject() { LOGD("get system classloader"); auto clClass = env->FindClass("java/lang/ClassLoader"); - auto getSystemClassLoader = env->GetStaticMethodID(clClass, "getSystemClassLoader", - "()Ljava/lang/ClassLoader;"); + auto getSystemClassLoader = env->GetStaticMethodID(clClass, "getSystemClassLoader", "()Ljava/lang/ClassLoader;"); auto systemClassLoader = env->CallStaticObjectMethod(clClass, getSystemClassLoader); LOGD("create class loader"); auto dexClClass = env->FindClass("dalvik/system/InMemoryDexClassLoader"); - auto dexClInit = env->GetMethodID(dexClClass, "", - "(Ljava/nio/ByteBuffer;Ljava/lang/ClassLoader;)V"); - auto buffer = env->NewDirectByteBuffer(dexVector.data(), - static_cast(dexVector.size())); + auto dexClInit = env->GetMethodID(dexClClass, "", "(Ljava/nio/ByteBuffer;Ljava/lang/ClassLoader;)V"); + auto buffer = env->NewDirectByteBuffer(dexVector.data(), static_cast(dexVector.size())); auto dexCl = env->NewObject(dexClClass, dexClInit, buffer, systemClassLoader); LOGD("load class"); - auto loadClass = env->GetMethodID(clClass, "loadClass", - "(Ljava/lang/String;)Ljava/lang/Class;"); + auto loadClass = env->GetMethodID(clClass, "loadClass", "(Ljava/lang/String;)Ljava/lang/Class;"); auto entryClassName = env->NewStringUTF("es.chiteroman.playintegrityfix.EntryPoint"); auto entryClassObj = env->CallObjectMethod(dexCl, loadClass, entryClassName); auto entryClass = (jclass) entryClassObj; LOGD("read json"); - auto readProps = env->GetStaticMethodID(entryClass, "readJson", - "(Ljava/lang/String;)V"); + auto readProps = env->GetStaticMethodID(entryClass, "readJson", "(Ljava/lang/String;)V"); auto javaStr = env->NewStringUTF(json.dump().c_str()); env->CallStaticVoidMethod(entryClass, readProps, javaStr); LOGD("call init"); - auto entryInit = env->GetStaticMethodID(entryClass, "init", "()V"); - env->CallStaticVoidMethod(entryClass, entryInit); + auto entryInit = env->GetStaticMethodID(entryClass, "init", "(I)V"); + env->CallStaticVoidMethod(entryClass, entryInit, VERBOSE_LOGS); } }; diff --git a/app/src/main/java/es/chiteroman/playintegrityfix/EntryPoint.java b/app/src/main/java/es/chiteroman/playintegrityfix/EntryPoint.java index caf8ded..b5838cb 100644 --- a/app/src/main/java/es/chiteroman/playintegrityfix/EntryPoint.java +++ b/app/src/main/java/es/chiteroman/playintegrityfix/EntryPoint.java @@ -20,10 +20,11 @@ public final class EntryPoint { private static final Map map = new HashMap<>(); - public static void init() { + public static void init(int level) { + verboseLogs = level; + if (verboseLogs > 99) logFields(); spoofProvider(); spoofDevice(); - if (verboseLogs > 99) logFields(); } public static void readJson(String data) { @@ -69,12 +70,7 @@ public final class EntryPoint { static void spoofDevice() { for (String key : map.keySet()) { - // Verbose logging if VERBOSE_LOGS with level number is last entry - if (key.equals("VERBOSE_LOGS")) { - verboseLogs = Integer.parseInt(map.get("VERBOSE_LOGS")); - } else { - setField(key, map.get(key)); - } + setField(key, map.get(key)); } }