1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
| int enable_api_hooks() { if (hook_java_apis() != 0) { return -1; } if (hook_native_apis() != 0) { return -1; } return 0; }
int hook_java_apis() { if (hook_java_method("android.os.SystemProperties", "get", "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;", (void*)shamiko_system_properties_get) != 0) { return -1; } if (hook_java_method("java.io.File", "exists", "()Z", (void*)shamiko_file_exists) != 0) { return -1; } if (hook_java_method("java.lang.ProcessBuilder", "start", "()Ljava/lang/Process;", (void*)shamiko_process_builder_start) != 0) { return -1; } return 0; }
jstring shamiko_system_properties_get(JNIEnv *env, jclass clazz, jstring key, jstring def) { const char *key_str = (*env)->GetStringUTFChars(env, key, NULL); const char *def_str = (*env)->GetStringUTFChars(env, def, NULL); if (is_root_prop(key_str)) { const char *fake_value = get_fake_prop_value(key_str); jstring result = (*env)->NewStringUTF(env, fake_value); (*env)->ReleaseStringUTFChars(env, key, key_str); (*env)->ReleaseStringUTFChars(env, def, def_str); return result; } jstring result = original_system_properties_get(env, clazz, key, def); (*env)->ReleaseStringUTFChars(env, key, key_str); (*env)->ReleaseStringUTFChars(env, def, def_str); return result; }
jboolean shamiko_file_exists(JNIEnv *env, jobject thiz) { jclass file_class = (*env)->GetObjectClass(env, thiz); jfieldID path_field = (*env)->GetFieldID(env, file_class, "path", "Ljava/lang/String;"); jstring path_obj = (jstring)(*env)->GetObjectField(env, thiz, path_field); const char *path_str = (*env)->GetStringUTFChars(env, path_obj, NULL); if (is_root_file(path_str)) { (*env)->ReleaseStringUTFChars(env, path_obj, path_str); return JNI_FALSE; } jboolean result = original_file_exists(env, thiz); (*env)->ReleaseStringUTFChars(env, path_obj, path_str); return result; }
|