From e35925d520b5fab3acc96c1f137f951edca06760 Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Wed, 13 Dec 2023 03:27:38 +0800 Subject: [PATCH] Properly version zygisk APIs --- native/src/core/zygisk/api.hpp | 2 +- native/src/core/zygisk/gen_jni_hooks.py | 2 +- native/src/core/zygisk/jni_hooks.hpp | 30 ++++++++++---------- native/src/core/zygisk/module.cpp | 5 ++-- native/src/core/zygisk/module.hpp | 37 +++++++++++++++++-------- 5 files changed, 45 insertions(+), 31 deletions(-) diff --git a/native/src/core/zygisk/api.hpp b/native/src/core/zygisk/api.hpp index 7232a127c..a6310451c 100644 --- a/native/src/core/zygisk/api.hpp +++ b/native/src/core/zygisk/api.hpp @@ -23,7 +23,7 @@ #include -#define ZYGISK_API_VERSION 4 +#define ZYGISK_API_VERSION 5 /* diff --git a/native/src/core/zygisk/gen_jni_hooks.py b/native/src/core/zygisk/gen_jni_hooks.py index 4d1df5d5e..15923f2eb 100755 --- a/native/src/core/zygisk/gen_jni_hooks.py +++ b/native/src/core/zygisk/gen_jni_hooks.py @@ -87,7 +87,7 @@ class ForkAndSpec(JNIHook): return 'nativeForkAndSpecialize' def init_args(self): - return 'AppSpecializeArgs_v3 args(uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, nice_name, instruction_set, app_data_dir);' + return 'AppSpecializeArgs_v5 args(uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, nice_name, instruction_set, app_data_dir);' def body(self): decl = '' diff --git a/native/src/core/zygisk/jni_hooks.hpp b/native/src/core/zygisk/jni_hooks.hpp index 372a93786..4029afb97 100644 --- a/native/src/core/zygisk/jni_hooks.hpp +++ b/native/src/core/zygisk/jni_hooks.hpp @@ -4,7 +4,7 @@ namespace { void *nativeForkAndSpecialize_orig = nullptr; [[clang::no_stack_protector]] jint nativeForkAndSpecialize_l(JNIEnv *env, jclass clazz, jint uid, jint gid, jintArray gids, jint runtime_flags, jobjectArray rlimits, jint mount_external, jstring se_info, jstring nice_name, jintArray fds_to_close, jstring instruction_set, jstring app_data_dir) { - AppSpecializeArgs_v3 args(uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, nice_name, instruction_set, app_data_dir); + AppSpecializeArgs_v5 args(uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, nice_name, instruction_set, app_data_dir); ZygiskContext ctx(env, &args); ctx.nativeForkAndSpecialize_pre(); reinterpret_cast(nativeForkAndSpecialize_orig)( @@ -14,7 +14,7 @@ void *nativeForkAndSpecialize_orig = nullptr; return ctx.pid; } [[clang::no_stack_protector]] jint nativeForkAndSpecialize_o(JNIEnv *env, jclass clazz, jint uid, jint gid, jintArray gids, jint runtime_flags, jobjectArray rlimits, jint mount_external, jstring se_info, jstring nice_name, jintArray fds_to_close, jintArray fds_to_ignore, jstring instruction_set, jstring app_data_dir) { - AppSpecializeArgs_v3 args(uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, nice_name, instruction_set, app_data_dir); + AppSpecializeArgs_v5 args(uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, nice_name, instruction_set, app_data_dir); args.fds_to_ignore = &fds_to_ignore; ZygiskContext ctx(env, &args); ctx.nativeForkAndSpecialize_pre(); @@ -25,7 +25,7 @@ void *nativeForkAndSpecialize_orig = nullptr; return ctx.pid; } [[clang::no_stack_protector]] jint nativeForkAndSpecialize_p(JNIEnv *env, jclass clazz, jint uid, jint gid, jintArray gids, jint runtime_flags, jobjectArray rlimits, jint mount_external, jstring se_info, jstring nice_name, jintArray fds_to_close, jintArray fds_to_ignore, jboolean is_child_zygote, jstring instruction_set, jstring app_data_dir) { - AppSpecializeArgs_v3 args(uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, nice_name, instruction_set, app_data_dir); + AppSpecializeArgs_v5 args(uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, nice_name, instruction_set, app_data_dir); args.fds_to_ignore = &fds_to_ignore; args.is_child_zygote = &is_child_zygote; ZygiskContext ctx(env, &args); @@ -37,7 +37,7 @@ void *nativeForkAndSpecialize_orig = nullptr; return ctx.pid; } [[clang::no_stack_protector]] jint nativeForkAndSpecialize_q_alt(JNIEnv *env, jclass clazz, jint uid, jint gid, jintArray gids, jint runtime_flags, jobjectArray rlimits, jint mount_external, jstring se_info, jstring nice_name, jintArray fds_to_close, jintArray fds_to_ignore, jboolean is_child_zygote, jstring instruction_set, jstring app_data_dir, jboolean is_top_app) { - AppSpecializeArgs_v3 args(uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, nice_name, instruction_set, app_data_dir); + AppSpecializeArgs_v5 args(uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, nice_name, instruction_set, app_data_dir); args.fds_to_ignore = &fds_to_ignore; args.is_child_zygote = &is_child_zygote; args.is_top_app = &is_top_app; @@ -50,7 +50,7 @@ void *nativeForkAndSpecialize_orig = nullptr; return ctx.pid; } [[clang::no_stack_protector]] jint nativeForkAndSpecialize_r(JNIEnv *env, jclass clazz, jint uid, jint gid, jintArray gids, jint runtime_flags, jobjectArray rlimits, jint mount_external, jstring se_info, jstring nice_name, jintArray fds_to_close, jintArray fds_to_ignore, jboolean is_child_zygote, jstring instruction_set, jstring app_data_dir, jboolean is_top_app, jobjectArray pkg_data_info_list, jobjectArray whitelisted_data_info_list, jboolean mount_data_dirs, jboolean mount_storage_dirs) { - AppSpecializeArgs_v3 args(uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, nice_name, instruction_set, app_data_dir); + AppSpecializeArgs_v5 args(uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, nice_name, instruction_set, app_data_dir); args.fds_to_ignore = &fds_to_ignore; args.is_child_zygote = &is_child_zygote; args.is_top_app = &is_top_app; @@ -67,7 +67,7 @@ void *nativeForkAndSpecialize_orig = nullptr; return ctx.pid; } [[clang::no_stack_protector]] jint nativeForkAndSpecialize_u(JNIEnv *env, jclass clazz, jint uid, jint gid, jintArray gids, jint runtime_flags, jobjectArray rlimits, jint mount_external, jstring se_info, jstring nice_name, jintArray fds_to_close, jintArray fds_to_ignore, jboolean is_child_zygote, jstring instruction_set, jstring app_data_dir, jboolean is_top_app, jobjectArray pkg_data_info_list, jobjectArray whitelisted_data_info_list, jboolean mount_data_dirs, jboolean mount_storage_dirs, jboolean mount_sysprop_overrides) { - AppSpecializeArgs_v3 args(uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, nice_name, instruction_set, app_data_dir); + AppSpecializeArgs_v5 args(uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, nice_name, instruction_set, app_data_dir); args.fds_to_ignore = &fds_to_ignore; args.is_child_zygote = &is_child_zygote; args.is_top_app = &is_top_app; @@ -85,7 +85,7 @@ void *nativeForkAndSpecialize_orig = nullptr; return ctx.pid; } [[clang::no_stack_protector]] jint nativeForkAndSpecialize_samsung_m(JNIEnv *env, jclass clazz, jint uid, jint gid, jintArray gids, jint runtime_flags, jobjectArray rlimits, jint mount_external, jstring se_info, jint _0, jint _1, jstring nice_name, jintArray fds_to_close, jstring instruction_set, jstring app_data_dir) { - AppSpecializeArgs_v3 args(uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, nice_name, instruction_set, app_data_dir); + AppSpecializeArgs_v5 args(uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, nice_name, instruction_set, app_data_dir); ZygiskContext ctx(env, &args); ctx.nativeForkAndSpecialize_pre(); reinterpret_cast(nativeForkAndSpecialize_orig)( @@ -95,7 +95,7 @@ void *nativeForkAndSpecialize_orig = nullptr; return ctx.pid; } [[clang::no_stack_protector]] jint nativeForkAndSpecialize_samsung_n(JNIEnv *env, jclass clazz, jint uid, jint gid, jintArray gids, jint runtime_flags, jobjectArray rlimits, jint mount_external, jstring se_info, jint _2, jint _3, jstring nice_name, jintArray fds_to_close, jstring instruction_set, jstring app_data_dir, jint _4) { - AppSpecializeArgs_v3 args(uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, nice_name, instruction_set, app_data_dir); + AppSpecializeArgs_v5 args(uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, nice_name, instruction_set, app_data_dir); ZygiskContext ctx(env, &args); ctx.nativeForkAndSpecialize_pre(); reinterpret_cast(nativeForkAndSpecialize_orig)( @@ -105,7 +105,7 @@ void *nativeForkAndSpecialize_orig = nullptr; return ctx.pid; } [[clang::no_stack_protector]] jint nativeForkAndSpecialize_samsung_o(JNIEnv *env, jclass clazz, jint uid, jint gid, jintArray gids, jint runtime_flags, jobjectArray rlimits, jint mount_external, jstring se_info, jint _5, jint _6, jstring nice_name, jintArray fds_to_close, jintArray fds_to_ignore, jstring instruction_set, jstring app_data_dir) { - AppSpecializeArgs_v3 args(uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, nice_name, instruction_set, app_data_dir); + AppSpecializeArgs_v5 args(uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, nice_name, instruction_set, app_data_dir); args.fds_to_ignore = &fds_to_ignore; ZygiskContext ctx(env, &args); ctx.nativeForkAndSpecialize_pre(); @@ -116,7 +116,7 @@ void *nativeForkAndSpecialize_orig = nullptr; return ctx.pid; } [[clang::no_stack_protector]] jint nativeForkAndSpecialize_samsung_p(JNIEnv *env, jclass clazz, jint uid, jint gid, jintArray gids, jint runtime_flags, jobjectArray rlimits, jint mount_external, jstring se_info, jint _7, jint _8, jstring nice_name, jintArray fds_to_close, jintArray fds_to_ignore, jboolean is_child_zygote, jstring instruction_set, jstring app_data_dir) { - AppSpecializeArgs_v3 args(uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, nice_name, instruction_set, app_data_dir); + AppSpecializeArgs_v5 args(uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, nice_name, instruction_set, app_data_dir); args.fds_to_ignore = &fds_to_ignore; args.is_child_zygote = &is_child_zygote; ZygiskContext ctx(env, &args); @@ -182,7 +182,7 @@ std::array nativeForkAndSpecialize_methods = { void *nativeSpecializeAppProcess_orig = nullptr; [[clang::no_stack_protector]] void nativeSpecializeAppProcess_q(JNIEnv *env, jclass clazz, jint uid, jint gid, jintArray gids, jint runtime_flags, jobjectArray rlimits, jint mount_external, jstring se_info, jstring nice_name, jboolean is_child_zygote, jstring instruction_set, jstring app_data_dir) { - AppSpecializeArgs_v3 args(uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, nice_name, instruction_set, app_data_dir); + AppSpecializeArgs_v5 args(uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, nice_name, instruction_set, app_data_dir); args.is_child_zygote = &is_child_zygote; ZygiskContext ctx(env, &args); ctx.nativeSpecializeAppProcess_pre(); @@ -192,7 +192,7 @@ void *nativeSpecializeAppProcess_orig = nullptr; ctx.nativeSpecializeAppProcess_post(); } [[clang::no_stack_protector]] void nativeSpecializeAppProcess_q_alt(JNIEnv *env, jclass clazz, jint uid, jint gid, jintArray gids, jint runtime_flags, jobjectArray rlimits, jint mount_external, jstring se_info, jstring nice_name, jboolean is_child_zygote, jstring instruction_set, jstring app_data_dir, jboolean is_top_app) { - AppSpecializeArgs_v3 args(uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, nice_name, instruction_set, app_data_dir); + AppSpecializeArgs_v5 args(uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, nice_name, instruction_set, app_data_dir); args.is_child_zygote = &is_child_zygote; args.is_top_app = &is_top_app; ZygiskContext ctx(env, &args); @@ -203,7 +203,7 @@ void *nativeSpecializeAppProcess_orig = nullptr; ctx.nativeSpecializeAppProcess_post(); } [[clang::no_stack_protector]] void nativeSpecializeAppProcess_r(JNIEnv *env, jclass clazz, jint uid, jint gid, jintArray gids, jint runtime_flags, jobjectArray rlimits, jint mount_external, jstring se_info, jstring nice_name, jboolean is_child_zygote, jstring instruction_set, jstring app_data_dir, jboolean is_top_app, jobjectArray pkg_data_info_list, jobjectArray whitelisted_data_info_list, jboolean mount_data_dirs, jboolean mount_storage_dirs) { - AppSpecializeArgs_v3 args(uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, nice_name, instruction_set, app_data_dir); + AppSpecializeArgs_v5 args(uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, nice_name, instruction_set, app_data_dir); args.is_child_zygote = &is_child_zygote; args.is_top_app = &is_top_app; args.pkg_data_info_list = &pkg_data_info_list; @@ -218,7 +218,7 @@ void *nativeSpecializeAppProcess_orig = nullptr; ctx.nativeSpecializeAppProcess_post(); } [[clang::no_stack_protector]] void nativeSpecializeAppProcess_u(JNIEnv *env, jclass clazz, jint uid, jint gid, jintArray gids, jint runtime_flags, jobjectArray rlimits, jint mount_external, jstring se_info, jstring nice_name, jboolean is_child_zygote, jstring instruction_set, jstring app_data_dir, jboolean is_top_app, jobjectArray pkg_data_info_list, jobjectArray whitelisted_data_info_list, jboolean mount_data_dirs, jboolean mount_storage_dirs, jboolean mount_sysprop_overrides) { - AppSpecializeArgs_v3 args(uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, nice_name, instruction_set, app_data_dir); + AppSpecializeArgs_v5 args(uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, nice_name, instruction_set, app_data_dir); args.is_child_zygote = &is_child_zygote; args.is_top_app = &is_top_app; args.pkg_data_info_list = &pkg_data_info_list; @@ -234,7 +234,7 @@ void *nativeSpecializeAppProcess_orig = nullptr; ctx.nativeSpecializeAppProcess_post(); } [[clang::no_stack_protector]] void nativeSpecializeAppProcess_samsung_q(JNIEnv *env, jclass clazz, jint uid, jint gid, jintArray gids, jint runtime_flags, jobjectArray rlimits, jint mount_external, jstring se_info, jint _9, jint _10, jstring nice_name, jboolean is_child_zygote, jstring instruction_set, jstring app_data_dir) { - AppSpecializeArgs_v3 args(uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, nice_name, instruction_set, app_data_dir); + AppSpecializeArgs_v5 args(uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, nice_name, instruction_set, app_data_dir); args.is_child_zygote = &is_child_zygote; ZygiskContext ctx(env, &args); ctx.nativeSpecializeAppProcess_pre(); diff --git a/native/src/core/zygisk/module.cpp b/native/src/core/zygisk/module.cpp index 38065178f..813d25dc4 100644 --- a/native/src/core/zygisk/module.cpp +++ b/native/src/core/zygisk/module.cpp @@ -126,15 +126,16 @@ case 2: { \ } \ case 3: \ case 4: \ +case 5: \ mod.v1->method(mod.v1->impl, args);\ break; \ } -void ZygiskModule::preAppSpecialize(AppSpecializeArgs_v3 *args) const { +void ZygiskModule::preAppSpecialize(AppSpecializeArgs_v5 *args) const { call_app(preAppSpecialize) } -void ZygiskModule::postAppSpecialize(const AppSpecializeArgs_v3 *args) const { +void ZygiskModule::postAppSpecialize(const AppSpecializeArgs_v5 *args) const { call_app(postAppSpecialize) } diff --git a/native/src/core/zygisk/module.hpp b/native/src/core/zygisk/module.hpp index 21b704712..83c6a8a4d 100644 --- a/native/src/core/zygisk/module.hpp +++ b/native/src/core/zygisk/module.hpp @@ -13,16 +13,19 @@ struct AppSpecializeArgs_v1; using AppSpecializeArgs_v2 = AppSpecializeArgs_v1; struct AppSpecializeArgs_v3; using AppSpecializeArgs_v4 = AppSpecializeArgs_v3; +struct AppSpecializeArgs_v5; struct module_abi_v1; using module_abi_v2 = module_abi_v1; using module_abi_v3 = module_abi_v1; using module_abi_v4 = module_abi_v1; +using module_abi_v5 = module_abi_v1; struct api_abi_v1; struct api_abi_v2; using api_abi_v3 = api_abi_v2; struct api_abi_v4; +using api_abi_v5 = api_abi_v4; union ApiTable; @@ -45,7 +48,6 @@ struct AppSpecializeArgs_v3 { jobjectArray *whitelisted_data_info_list = nullptr; jboolean *mount_data_dirs = nullptr; jboolean *mount_storage_dirs = nullptr; - jboolean *mount_sysprop_overrides = nullptr; AppSpecializeArgs_v3( jint &uid, jint &gid, jintArray &gids, jint &runtime_flags, @@ -56,6 +58,17 @@ struct AppSpecializeArgs_v3 { instruction_set(instruction_set), app_data_dir(app_data_dir) {} }; +struct AppSpecializeArgs_v5 : public AppSpecializeArgs_v3 { + jboolean *mount_sysprop_overrides = nullptr; + + AppSpecializeArgs_v5( + jint &uid, jint &gid, jintArray &gids, jint &runtime_flags, + jobjectArray &rlimits, jint &mount_external, jstring &se_info, jstring &nice_name, + jstring &instruction_set, jstring &app_data_dir) : AppSpecializeArgs_v3( + uid, gid, gids, runtime_flags, rlimits, mount_external, + se_info, nice_name, instruction_set, app_data_dir) {} +}; + struct AppSpecializeArgs_v1 { jint &uid; jint &gid; @@ -74,14 +87,14 @@ struct AppSpecializeArgs_v1 { jboolean *const mount_data_dirs; jboolean *const mount_storage_dirs; - AppSpecializeArgs_v1(const AppSpecializeArgs_v3 *v3) : - uid(v3->uid), gid(v3->gid), gids(v3->gids), runtime_flags(v3->runtime_flags), - mount_external(v3->mount_external), se_info(v3->se_info), nice_name(v3->nice_name), - instruction_set(v3->instruction_set), app_data_dir(v3->app_data_dir), - is_child_zygote(v3->is_child_zygote), is_top_app(v3->is_top_app), - pkg_data_info_list(v3->pkg_data_info_list), - whitelisted_data_info_list(v3->whitelisted_data_info_list), - mount_data_dirs(v3->mount_data_dirs), mount_storage_dirs(v3->mount_storage_dirs) {} + AppSpecializeArgs_v1(const AppSpecializeArgs_v5 *a) : + uid(a->uid), gid(a->gid), gids(a->gids), runtime_flags(a->runtime_flags), + mount_external(a->mount_external), se_info(a->se_info), nice_name(a->nice_name), + instruction_set(a->instruction_set), app_data_dir(a->app_data_dir), + is_child_zygote(a->is_child_zygote), is_top_app(a->is_top_app), + pkg_data_info_list(a->pkg_data_info_list), + whitelisted_data_info_list(a->whitelisted_data_info_list), + mount_data_dirs(a->mount_data_dirs), mount_storage_dirs(a->mount_storage_dirs) {} }; struct ServerSpecializeArgs_v1 { @@ -164,8 +177,8 @@ struct ZygiskModule { entry.fn(&api, env); } - void preAppSpecialize(AppSpecializeArgs_v3 *args) const; - void postAppSpecialize(const AppSpecializeArgs_v3 *args) const; + void preAppSpecialize(AppSpecializeArgs_v5 *args) const; + void postAppSpecialize(const AppSpecializeArgs_v5 *args) const; void preServerSpecialize(ServerSpecializeArgs_v1 *args) const; void postServerSpecialize(const ServerSpecializeArgs_v1 *args) const; @@ -222,7 +235,7 @@ struct ZygiskContext { JNIEnv *env; union { void *ptr; - AppSpecializeArgs_v3 *app; + AppSpecializeArgs_v5 *app; ServerSpecializeArgs_v1 *server; } args;