Skip to content

Commit

Permalink
add Android Q nativeSpecializeBlastula (Q haven't enabled the usage o…
Browse files Browse the repository at this point in the history
…f it)
  • Loading branch information
RikkaW committed Apr 12, 2019
1 parent 478ce37 commit 3604dd4
Show file tree
Hide file tree
Showing 8 changed files with 116 additions and 4 deletions.
16 changes: 16 additions & 0 deletions app/src/main/cpp/helper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ static void *get_handle() {

return handle;
}

static jint get_riru_rersion(JNIEnv *env, jobject thiz) {
static void *sym;
void *handle;
Expand Down Expand Up @@ -107,6 +108,20 @@ static jstring get_nativeForkAndSpecialize_signature(JNIEnv *env, jobject thiz)
return nullptr;
}

static jstring get_nativeSpecializeBlastula_signature(JNIEnv *env, jobject thiz) {
static void *sym;
void *handle;
if ((handle = get_handle()) == nullptr) return nullptr;
if (sym == nullptr) sym = dlsym(handle, "riru_get_original_native_methods");
if (sym) {
auto method = ((const JNINativeMethod *(*)(const char *, const char *, const char *)) sym)(
"com/android/internal/os/Zygote", "nativeSpecializeBlastula", nullptr);
if (method != nullptr)
return env->NewStringUTF(method->signature);
}
return nullptr;
}

static jstring get_nativeForkSystemServer_signature(JNIEnv *env, jobject thiz) {
static void *sym;
void *handle;
Expand All @@ -129,6 +144,7 @@ static JNINativeMethod gMethods[] = {
{"getNativeForkAndSpecializeCallsCount", "()I", (void *) get_nativeForkAndSpecialize_calls_count},
{"getNativeForkSystemServerCallsCount", "()I", (void *) get_nativeForkSystemServer_calls_count},
{"getNativeForkAndSpecializeSignature", "()Ljava/lang/String;", (void *) get_nativeForkAndSpecialize_signature},
{"getNativeSpecializeBlastulaSignature", "()Ljava/lang/String;", (void *) get_nativeSpecializeBlastula_signature},
{"getNativeForkSystemServerSignature", "()Ljava/lang/String;", (void *) get_nativeForkSystemServer_signature},
};

Expand Down
4 changes: 3 additions & 1 deletion app/src/main/java/moe/riru/manager/MainActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {

boolean init, isZygoteMethodsReplaced;
int version, nativeForkAndSpecializeCallsCount, nativeForkSystemServerCallsCount;
String nativeForkAndSpecializeSignature, nativeForkSystemServerSignature;
String nativeForkAndSpecializeSignature, nativeSpecializeBlastulaSignature, nativeForkSystemServerSignature;

StringBuilder sb = new StringBuilder();

Expand All @@ -33,6 +33,7 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {
nativeForkAndSpecializeCallsCount = NativeHelper.getNativeForkAndSpecializeCallsCount();
nativeForkSystemServerCallsCount = NativeHelper.getNativeForkSystemServerCallsCount();
nativeForkAndSpecializeSignature = NativeHelper.getNativeForkAndSpecializeSignature();
nativeSpecializeBlastulaSignature = NativeHelper.getNativeSpecializeBlastulaSignature();
nativeForkSystemServerSignature = NativeHelper.getNativeForkSystemServerSignature();

sb.append("Riru ").append(NativeHelper.versionName(this, version)).append(" found.").append("<br>");
Expand Down Expand Up @@ -75,6 +76,7 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {
Log.i("RiruManager", "getNativeForkAndSpecializeCallsCount: " + NativeHelper.getNativeForkAndSpecializeCallsCount());
Log.i("RiruManager", "getNativeForkSystemServerCallsCount: " + NativeHelper.getNativeForkSystemServerCallsCount());
Log.i("RiruManager", "getNativeForkAndSpecializeSignature: " + NativeHelper.getNativeForkAndSpecializeSignature());
Log.i("RiruManager", "getNativeSpecializeBlastulaSignature: " + NativeHelper.getNativeSpecializeBlastulaSignature());
Log.i("RiruManager", "getNativeForkSystemServerSignature: " + NativeHelper.getNativeForkSystemServerSignature());
}
}
10 changes: 10 additions & 0 deletions app/src/main/java/moe/riru/manager/utils/BuildUtils.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package moe.riru.manager.utils;

import android.os.Build;

public class BuildUtils {

public static boolean isQ() {
return "Q".equals(Build.VERSION.RELEASE) || Build.VERSION.SDK_INT >= 29;
}
}
1 change: 1 addition & 0 deletions app/src/main/java/moe/riru/manager/utils/NativeHelper.java
Original file line number Diff line number Diff line change
Expand Up @@ -42,5 +42,6 @@ public static String versionName(Context context, int versionCode) {
public static native int getNativeForkAndSpecializeCallsCount();
public static native int getNativeForkSystemServerCallsCount();
public static native String getNativeForkAndSpecializeSignature();
public static native String getNativeSpecializeBlastulaSignature();
public static native String getNativeForkSystemServerSignature();
}
2 changes: 1 addition & 1 deletion riru-core/jni/main/JNIHelper.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
#include <jni.h>
#include "logging.h"

int ClearException(JNIEnv *env) {
static int ClearException(JNIEnv *env) {
jthrowable exception = env->ExceptionOccurred();
if (exception != nullptr) {
env->ExceptionDescribe();
Expand Down
49 changes: 49 additions & 0 deletions riru-core/jni/main/jni_native_method.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,18 @@
#include "api.h"

static void *_nativeForkAndSpecialize = nullptr;
static void *_nativeSpecializeBlastula = nullptr;
static void *_nativeForkSystemServer = nullptr;
static void *_SystemProperties_set = nullptr;

void set_nativeForkAndSpecialize(void *addr) {
_nativeForkAndSpecialize = addr;
}

void set_nativeSpecializeBlastula(void *addr) {
_nativeSpecializeBlastula = addr;
}

void set_nativeForkSystemServer(void *addr) {
_nativeForkSystemServer = addr;
}
Expand Down Expand Up @@ -46,6 +51,8 @@ int riru_get_nativeForkSystemServer_calls_count() {
return nativeForkSystemServer_calls_count;
}

// -----------------------------------------------------------------

static void nativeForkAndSpecialize_pre(
JNIEnv *env, jclass clazz, jint &uid, jint &gid, jintArray &gids, jint &runtime_flags,
jobjectArray &rlimits, jint &mount_external, jstring &se_info, jstring &se_name,
Expand Down Expand Up @@ -112,6 +119,24 @@ static void nativeForkAndSpecialize_post(JNIEnv *env, jclass clazz, jint uid, ji
}
}

// -----------------------------------------------------------------

static void nativeSpecializeBlastula_pre(
JNIEnv *env, jclass clazz, jint uid, jint gid, jintArray gids, jint runtimeFlags,
jobjectArray rlimits, jint mountExternal, jstring seInfo, jstring niceName,
jboolean startChildZygote, jstring instructionSet, jstring appDataDir, jstring packageName,
jobjectArray packagesForUID, jobjectArray visibleVolIDs) {
/*const char *cPackageName = env->GetStringUTFChars(packageName, nullptr);
LOGI("nativeSpecializeBlastulaPre: uid=%d, packageName=%s, from_uid=%d", uid, cPackageName, getuid());
env->ReleaseStringUTFChars(packageName, cPackageName);*/
}

static void nativeSpecializeBlastula_post(JNIEnv *env, jclass clazz) {
//LOGI("nativeSpecializeBlastulaPost: from_uid=%d", getuid());
}

// -----------------------------------------------------------------

static void nativeForkSystemServer_pre(
JNIEnv *env, jclass clazz, uid_t &uid, gid_t &gid, jintArray &gids, jint &debug_flags,
jobjectArray &rlimits, jlong &permittedCapabilities, jlong &effectiveCapabilities) {
Expand Down Expand Up @@ -144,6 +169,7 @@ static void nativeForkSystemServer_post(JNIEnv *env, jclass clazz, jint res) {
}
}

// -----------------------------------------------------------------

jint nativeForkAndSpecialize_marshmallow(
JNIEnv *env, jclass clazz, jint uid, jint gid, jintArray gids, jint debug_flags,
Expand Down Expand Up @@ -333,6 +359,29 @@ jint nativeForkAndSpecialize_samsung_m(
return res;
}

// -----------------------------------------------------------------

void nativeSpecializeBlastula(
JNIEnv *env, jclass clazz, jint uid, jint gid, jintArray gids, jint runtimeFlags,
jobjectArray rlimits, jint mountExternal, jstring seInfo, jstring niceName,
jboolean startChildZygote, jstring instructionSet, jstring appDataDir, jstring packageName,
jobjectArray packagesForUID, jobjectArray visibleVolIDs) {

nativeSpecializeBlastula_pre(
env, clazz, uid, gid, gids, runtimeFlags, rlimits, mountExternal, seInfo, niceName,
startChildZygote, instructionSet, appDataDir, packageName, packagesForUID,
visibleVolIDs);

((nativeSpecializeBlastula_t) _nativeSpecializeBlastula)(
env, clazz, uid, gid, gids, runtimeFlags, rlimits, mountExternal, seInfo, niceName,
startChildZygote, instructionSet, appDataDir, packageName, packagesForUID,
visibleVolIDs);

nativeSpecializeBlastula_post(env, clazz);
}

// -----------------------------------------------------------------

jint nativeForkSystemServer(
JNIEnv *env, jclass clazz, uid_t uid, gid_t gid, jintArray gids, jint debug_flags,
jobjectArray rlimits, jlong permittedCapabilities, jlong effectiveCapabilities) {
Expand Down
18 changes: 18 additions & 0 deletions riru-core/jni/main/jni_native_method.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@

void set_nativeForkAndSpecialize(void *addr);

void set_nativeSpecializeBlastula(void *addr);

void set_nativeForkSystemServer(void *addr);

void set_SystemProperties_set(void *addr);
Expand Down Expand Up @@ -102,6 +104,22 @@ jint nativeForkAndSpecialize_samsung_m(
jobjectArray rlimits, jint mount_external, jstring se_info, jint category, jint accessInfo,
jstring se_name, jintArray fdsToClose, jstring instructionSet, jstring appDataDir);

// -----------------------------------------------------------------

const static char *nativeSpecializeBlastula_sig = "(II[II[[IILjava/lang/String;Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V";

typedef void (*nativeSpecializeBlastula_t)(
JNIEnv *, jclass, jint, jint, jintArray, jint, jobjectArray, jint, jstring, jstring,
jboolean, jstring, jstring, jstring, jobjectArray, jobjectArray);

void nativeSpecializeBlastula(
JNIEnv *env, jclass clazz, jint uid, jint gid, jintArray gids, jint runtimeFlags,
jobjectArray rlimits, jint mountExternal, jstring seInfo, jstring niceName,
jboolean startChildZygote, jstring instructionSet, jstring appDataDir, jstring packageName,
jobjectArray packagesForUID, jobjectArray visibleVolIDs);

// -----------------------------------------------------------------

const static char *nativeForkSystemServer_sig = "(II[II[[IJJ)I";

typedef jint (*nativeForkSystemServer_t)(
Expand Down
20 changes: 18 additions & 2 deletions riru-core/jni/main/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,21 @@ static JNINativeMethod *onRegisterZygote(JNIEnv *env, const char *className,

replaced += 1;
}
} else if (strcmp(method.name, "nativeSpecializeBlastula") == 0) {
set_nativeSpecializeBlastula(method.fnPtr);

if (strcmp(nativeSpecializeBlastula_sig, method.signature) == 0)
newMethods[i].fnPtr = (void *) nativeSpecializeBlastula;
else
LOGW("found nativeSpecializeBlastula but signature %s mismatch", method.signature);

if (newMethods[i].fnPtr != methods[i].fnPtr) {
LOGI("replaced com.android.internal.os.Zygote#nativeSpecializeBlastula");
riru_set_native_method_func(MODULE_NAME_CORE, className, newMethods[i].name,
newMethods[i].signature, newMethods[i].fnPtr);

//replaced += 1;
}
} else if (strcmp(method.name, "nativeForkSystemServer") == 0) {
set_nativeForkSystemServer(method.fnPtr);

Expand All @@ -187,7 +202,7 @@ static JNINativeMethod *onRegisterZygote(JNIEnv *env, const char *className,
}
}

methods_replaced = replaced == 2;
methods_replaced = replaced == 2/*(isQ() ? 3 : 2)*/;

return newMethods;
}
Expand Down Expand Up @@ -294,7 +309,8 @@ void constructor() {
#endif

if (access(CONFIG_DIR "/.disable", F_OK) == 0) {
LOGI(CONFIG_DIR "/.disable exists, do nothing.");
LOGI(CONFIG_DIR
"/.disable exists, do nothing.");
return;
}

Expand Down

0 comments on commit 3604dd4

Please sign in to comment.