Refactor VERBOSE_LOGS parsing to directly pass level from Native to Java

This commit is contained in:
osm0sis
2024-01-15 16:35:18 -04:00
parent 24db525cf3
commit 22e3a14a6f
2 changed files with 13 additions and 23 deletions
+9 -15
View File
@@ -156,9 +156,7 @@ public:
if (dexVector.empty() || json.empty()) return; if (dexVector.empty() || json.empty()) return;
readJson(); readJson();
doHook(); doHook();
inject(); inject();
dexVector.clear(); dexVector.clear();
@@ -178,7 +176,7 @@ private:
void readJson() { void readJson() {
LOGD("JSON contains %d keys!", static_cast<int>(json.size())); LOGD("JSON contains %d keys!", static_cast<int>(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.contains("VERBOSE_LOGS")) {
if (!json["VERBOSE_LOGS"].is_null() && json["VERBOSE_LOGS"].is_string() && json["VERBOSE_LOGS"] != "") { if (!json["VERBOSE_LOGS"].is_null() && json["VERBOSE_LOGS"].is_string() && json["VERBOSE_LOGS"] != "") {
VERBOSE_LOGS = stoi(json["VERBOSE_LOGS"].get<std::string>()); VERBOSE_LOGS = stoi(json["VERBOSE_LOGS"].get<std::string>());
@@ -186,6 +184,7 @@ private:
} else { } else {
LOGD("Error parsing VERBOSE_LOGS!"); LOGD("Error parsing VERBOSE_LOGS!");
} }
json.erase("VERBOSE_LOGS");
} }
std::vector<std::string> eraseKeys; std::vector<std::string> eraseKeys;
@@ -215,35 +214,30 @@ private:
void inject() { void inject() {
LOGD("get system classloader"); LOGD("get system classloader");
auto clClass = env->FindClass("java/lang/ClassLoader"); auto clClass = env->FindClass("java/lang/ClassLoader");
auto getSystemClassLoader = env->GetStaticMethodID(clClass, "getSystemClassLoader", auto getSystemClassLoader = env->GetStaticMethodID(clClass, "getSystemClassLoader", "()Ljava/lang/ClassLoader;");
"()Ljava/lang/ClassLoader;");
auto systemClassLoader = env->CallStaticObjectMethod(clClass, getSystemClassLoader); auto systemClassLoader = env->CallStaticObjectMethod(clClass, getSystemClassLoader);
LOGD("create class loader"); LOGD("create class loader");
auto dexClClass = env->FindClass("dalvik/system/InMemoryDexClassLoader"); auto dexClClass = env->FindClass("dalvik/system/InMemoryDexClassLoader");
auto dexClInit = env->GetMethodID(dexClClass, "<init>", auto dexClInit = env->GetMethodID(dexClClass, "<init>", "(Ljava/nio/ByteBuffer;Ljava/lang/ClassLoader;)V");
"(Ljava/nio/ByteBuffer;Ljava/lang/ClassLoader;)V"); auto buffer = env->NewDirectByteBuffer(dexVector.data(), static_cast<jlong>(dexVector.size()));
auto buffer = env->NewDirectByteBuffer(dexVector.data(),
static_cast<jlong>(dexVector.size()));
auto dexCl = env->NewObject(dexClClass, dexClInit, buffer, systemClassLoader); auto dexCl = env->NewObject(dexClClass, dexClInit, buffer, systemClassLoader);
LOGD("load class"); LOGD("load class");
auto loadClass = env->GetMethodID(clClass, "loadClass", auto loadClass = env->GetMethodID(clClass, "loadClass", "(Ljava/lang/String;)Ljava/lang/Class;");
"(Ljava/lang/String;)Ljava/lang/Class;");
auto entryClassName = env->NewStringUTF("es.chiteroman.playintegrityfix.EntryPoint"); auto entryClassName = env->NewStringUTF("es.chiteroman.playintegrityfix.EntryPoint");
auto entryClassObj = env->CallObjectMethod(dexCl, loadClass, entryClassName); auto entryClassObj = env->CallObjectMethod(dexCl, loadClass, entryClassName);
auto entryClass = (jclass) entryClassObj; auto entryClass = (jclass) entryClassObj;
LOGD("read json"); LOGD("read json");
auto readProps = env->GetStaticMethodID(entryClass, "readJson", auto readProps = env->GetStaticMethodID(entryClass, "readJson", "(Ljava/lang/String;)V");
"(Ljava/lang/String;)V");
auto javaStr = env->NewStringUTF(json.dump().c_str()); auto javaStr = env->NewStringUTF(json.dump().c_str());
env->CallStaticVoidMethod(entryClass, readProps, javaStr); env->CallStaticVoidMethod(entryClass, readProps, javaStr);
LOGD("call init"); LOGD("call init");
auto entryInit = env->GetStaticMethodID(entryClass, "init", "()V"); auto entryInit = env->GetStaticMethodID(entryClass, "init", "(I)V");
env->CallStaticVoidMethod(entryClass, entryInit); env->CallStaticVoidMethod(entryClass, entryInit, VERBOSE_LOGS);
} }
}; };
@@ -20,10 +20,11 @@ public final class EntryPoint {
private static final Map<String, String> map = new HashMap<>(); private static final Map<String, String> map = new HashMap<>();
public static void init() { public static void init(int level) {
verboseLogs = level;
if (verboseLogs > 99) logFields();
spoofProvider(); spoofProvider();
spoofDevice(); spoofDevice();
if (verboseLogs > 99) logFields();
} }
public static void readJson(String data) { public static void readJson(String data) {
@@ -69,12 +70,7 @@ public final class EntryPoint {
static void spoofDevice() { static void spoofDevice() {
for (String key : map.keySet()) { for (String key : map.keySet()) {
// Verbose logging if VERBOSE_LOGS with level number is last entry setField(key, map.get(key));
if (key.equals("VERBOSE_LOGS")) {
verboseLogs = Integer.parseInt(map.get("VERBOSE_LOGS"));
} else {
setField(key, map.get(key));
}
} }
} }