Skip to content

Commit dd3d608

Browse files
authored
add: GrapheneOS 17 Zygote function signatures (#378)
This commit adds the new function signature that GrapheneOS Android 17 uses so ReZygisk can properly work on those devices.
1 parent 946708e commit dd3d608

2 files changed

Lines changed: 72 additions & 12 deletions

File tree

‎loader/src/injector/gen_jni_hooks.py‎

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,12 @@ def init_args(self):
205205
Anon(jboolean), is_top_app, pkg_data_info_list, whitelisted_data_info_list,
206206
mount_data_dirs, mount_storage_dirs, mount_sysprop_overrides])
207207

208+
# INFO: GrapheneOS Android 17
209+
fas_grapheneos_c = ForkAndSpec('grapheneos_c', [Anon(jlongArray), uid, gid, gids, runtime_flags,
210+
rlimits, mount_external, se_info, nice_name, fds_to_close, fds_to_ignore, is_child_zygote,
211+
instruction_set, app_data_dir, is_top_app, Anon(jboolean), pkg_data_info_list,
212+
whitelisted_data_info_list, mount_data_dirs, mount_storage_dirs, mount_sysprop_overrides])
213+
208214
spec_q = SpecApp('q', [uid, gid, gids, runtime_flags, rlimits, mount_external, se_info,
209215
nice_name, is_child_zygote, instruction_set, app_data_dir])
210216

@@ -228,6 +234,12 @@ def init_args(self):
228234
spec_samsung_q = SpecApp('samsung_q', [uid, gid, gids, runtime_flags, rlimits, mount_external,
229235
se_info, Anon(jint), Anon(jint), nice_name, is_child_zygote, instruction_set, app_data_dir])
230236

237+
# INFO: GrapheneOS Android 17
238+
spec_grapheneos_c = SpecApp('grapheneos_c', [Anon(jlongArray), uid, gid, gids, runtime_flags,
239+
rlimits, mount_external, se_info, nice_name, is_child_zygote, instruction_set, app_data_dir,
240+
is_top_app, pkg_data_info_list, whitelisted_data_info_list, mount_data_dirs,
241+
mount_storage_dirs, mount_sysprop_overrides])
242+
231243
server_l = ForkServer('l', [uid, gid, gids, runtime_flags, rlimits,
232244
permitted_capabilities, effective_capabilities])
233245

@@ -286,10 +298,10 @@ def gen_jni_def(clz, methods):
286298

287299
zygote = 'com/android/internal/os/Zygote'
288300

289-
methods = [fas_l, fas_o, fas_p, fas_q_alt, fas_r, fas_u, fas_c, fas_samsung_m, fas_samsung_n, fas_samsung_o, fas_samsung_p, fas_samsung_b, fas_grapheneos_u]
301+
methods = [fas_l, fas_o, fas_p, fas_q_alt, fas_r, fas_u, fas_c, fas_samsung_m, fas_samsung_n, fas_samsung_o, fas_samsung_p, fas_samsung_b, fas_grapheneos_u, fas_grapheneos_c]
290302
f.write(gen_jni_def(zygote, methods))
291303

292-
methods = [spec_q, spec_q_alt, spec_r, spec_u, spec_c, spec_samsung_q, spec_grapheneos_u]
304+
methods = [spec_q, spec_q_alt, spec_r, spec_u, spec_c, spec_samsung_q, spec_grapheneos_u, spec_grapheneos_c]
293305
f.write(gen_jni_def(zygote, methods))
294306

295307
methods = [server_l, server_samsung_q]

‎loader/src/injector/jni_hooks.h‎

Lines changed: 58 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ __attribute__((no_stack_protector)) static jint nativeForkAndSpecialize_samsung_
189189
rz_cleanup(&ctx);
190190
return ctx.pid;
191191
}
192-
__attribute__((no_stack_protector)) static jint nativeForkAndSpecialize_grapheneos_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, jlongArray _17) {
192+
__attribute__((no_stack_protector)) static jint nativeForkAndSpecialize_grapheneos_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, jlongArray _20) {
193193
struct app_specialize_args_v5 args = { .uid = &uid, .gid = &gid, .gids = &gids, .runtime_flags = &runtime_flags, .rlimits = &rlimits, .mount_external = &mount_external, .se_info = &se_info, .nice_name = &nice_name, .instruction_set = &instruction_set, .app_data_dir = &app_data_dir };
194194
args.fds_to_ignore = &fds_to_ignore;
195195
args.is_child_zygote = &is_child_zygote;
@@ -203,7 +203,27 @@ __attribute__((no_stack_protector)) static jint nativeForkAndSpecialize_graphene
203203
rz_init(&ctx, env, &args);
204204
rz_nativeForkAndSpecialize_pre(&ctx);
205205
((nativeForkAndSpecialize_fn)nativeForkAndSpecialize_orig)(
206-
env, clazz, uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, nice_name, fds_to_close, fds_to_ignore, is_child_zygote, instruction_set, app_data_dir, is_top_app, pkg_data_info_list, whitelisted_data_info_list, mount_data_dirs, mount_storage_dirs, mount_sysprop_overrides, _17
206+
env, clazz, uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, nice_name, fds_to_close, fds_to_ignore, is_child_zygote, instruction_set, app_data_dir, is_top_app, pkg_data_info_list, whitelisted_data_info_list, mount_data_dirs, mount_storage_dirs, mount_sysprop_overrides, _20
207+
);
208+
rz_nativeForkAndSpecialize_post(&ctx);
209+
rz_cleanup(&ctx);
210+
return ctx.pid;
211+
}
212+
__attribute__((no_stack_protector)) static jint nativeForkAndSpecialize_grapheneos_c(JNIEnv *env, jclass clazz, jlongArray _12, 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, jboolean _13, jobjectArray pkg_data_info_list, jobjectArray whitelisted_data_info_list, jboolean mount_data_dirs, jboolean mount_storage_dirs, jboolean mount_sysprop_overrides) {
213+
struct app_specialize_args_v5 args = { .uid = &uid, .gid = &gid, .gids = &gids, .runtime_flags = &runtime_flags, .rlimits = &rlimits, .mount_external = &mount_external, .se_info = &se_info, .nice_name = &nice_name, .instruction_set = &instruction_set, .app_data_dir = &app_data_dir };
214+
args.fds_to_ignore = &fds_to_ignore;
215+
args.is_child_zygote = &is_child_zygote;
216+
args.is_top_app = &is_top_app;
217+
args.pkg_data_info_list = &pkg_data_info_list;
218+
args.whitelisted_data_info_list = &whitelisted_data_info_list;
219+
args.mount_data_dirs = &mount_data_dirs;
220+
args.mount_storage_dirs = &mount_storage_dirs;
221+
args.mount_sysprop_overrides = &mount_sysprop_overrides;
222+
struct zygisk_context ctx;
223+
rz_init(&ctx, env, &args);
224+
rz_nativeForkAndSpecialize_pre(&ctx);
225+
((nativeForkAndSpecialize_fn)nativeForkAndSpecialize_orig)(
226+
env, clazz, _12, uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, nice_name, fds_to_close, fds_to_ignore, is_child_zygote, instruction_set, app_data_dir, is_top_app, _13, pkg_data_info_list, whitelisted_data_info_list, mount_data_dirs, mount_storage_dirs, mount_sysprop_overrides
207227
);
208228
rz_nativeForkAndSpecialize_post(&ctx);
209229
rz_cleanup(&ctx);
@@ -275,6 +295,11 @@ static JNINativeMethod nativeForkAndSpecialize_methods[] = {
275295
"(II[II[[IILjava/lang/String;Ljava/lang/String;[I[IZLjava/lang/String;Ljava/lang/String;Z[Ljava/lang/String;[Ljava/lang/String;ZZZ[J)I",
276296
(void *) &nativeForkAndSpecialize_grapheneos_u
277297
},
298+
{
299+
"nativeForkAndSpecialize",
300+
"([JII[II[[IILjava/lang/String;Ljava/lang/String;[I[IZLjava/lang/String;Ljava/lang/String;ZZ[Ljava/lang/String;[Ljava/lang/String;ZZZ)I",
301+
(void *) &nativeForkAndSpecialize_grapheneos_c
302+
},
278303
};
279304

280305
static void *nativeSpecializeAppProcess_orig = NULL;
@@ -339,7 +364,7 @@ __attribute__((no_stack_protector)) static void nativeSpecializeAppProcess_u(JNI
339364
rz_nativeSpecializeAppProcess_post(&ctx);
340365
rz_cleanup(&ctx);
341366
}
342-
__attribute__((no_stack_protector)) static void nativeSpecializeAppProcess_c(JNIEnv *env, jclass clazz, jint uid, jint gid, jint _12, 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) {
367+
__attribute__((no_stack_protector)) static void nativeSpecializeAppProcess_c(JNIEnv *env, jclass clazz, jint uid, jint gid, jint _14, 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) {
343368
struct app_specialize_args_v5 args = { .uid = &uid, .gid = &gid, .gids = &gids, .runtime_flags = &runtime_flags, .rlimits = &rlimits, .mount_external = &mount_external, .se_info = &se_info, .nice_name = &nice_name, .instruction_set = &instruction_set, .app_data_dir = &app_data_dir };
344369
args.is_child_zygote = &is_child_zygote;
345370
args.is_top_app = &is_top_app;
@@ -352,24 +377,42 @@ __attribute__((no_stack_protector)) static void nativeSpecializeAppProcess_c(JNI
352377
rz_init(&ctx, env, &args);
353378
rz_nativeSpecializeAppProcess_pre(&ctx);
354379
((nativeSpecializeAppProcess_fn)nativeSpecializeAppProcess_orig)(
355-
env, clazz, uid, gid, _12, gids, runtime_flags, rlimits, mount_external, se_info, nice_name, is_child_zygote, instruction_set, app_data_dir, is_top_app, pkg_data_info_list, whitelisted_data_info_list, mount_data_dirs, mount_storage_dirs, mount_sysprop_overrides
380+
env, clazz, uid, gid, _14, gids, runtime_flags, rlimits, mount_external, se_info, nice_name, is_child_zygote, instruction_set, app_data_dir, is_top_app, pkg_data_info_list, whitelisted_data_info_list, mount_data_dirs, mount_storage_dirs, mount_sysprop_overrides
381+
);
382+
rz_nativeSpecializeAppProcess_post(&ctx);
383+
rz_cleanup(&ctx);
384+
}
385+
__attribute__((no_stack_protector)) static 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 _15, jint _16, jstring nice_name, jboolean is_child_zygote, jstring instruction_set, jstring app_data_dir) {
386+
struct app_specialize_args_v5 args = { .uid = &uid, .gid = &gid, .gids = &gids, .runtime_flags = &runtime_flags, .rlimits = &rlimits, .mount_external = &mount_external, .se_info = &se_info, .nice_name = &nice_name, .instruction_set = &instruction_set, .app_data_dir = &app_data_dir };
387+
args.is_child_zygote = &is_child_zygote;
388+
struct zygisk_context ctx;
389+
rz_init(&ctx, env, &args);
390+
rz_nativeSpecializeAppProcess_pre(&ctx);
391+
((nativeSpecializeAppProcess_fn)nativeSpecializeAppProcess_orig)(
392+
env, clazz, uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, _15, _16, nice_name, is_child_zygote, instruction_set, app_data_dir
356393
);
357394
rz_nativeSpecializeAppProcess_post(&ctx);
358395
rz_cleanup(&ctx);
359396
}
360-
__attribute__((no_stack_protector)) static 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 _13, jint _14, jstring nice_name, jboolean is_child_zygote, jstring instruction_set, jstring app_data_dir) {
397+
__attribute__((no_stack_protector)) static void nativeSpecializeAppProcess_grapheneos_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, jlongArray _21) {
361398
struct app_specialize_args_v5 args = { .uid = &uid, .gid = &gid, .gids = &gids, .runtime_flags = &runtime_flags, .rlimits = &rlimits, .mount_external = &mount_external, .se_info = &se_info, .nice_name = &nice_name, .instruction_set = &instruction_set, .app_data_dir = &app_data_dir };
362399
args.is_child_zygote = &is_child_zygote;
400+
args.is_top_app = &is_top_app;
401+
args.pkg_data_info_list = &pkg_data_info_list;
402+
args.whitelisted_data_info_list = &whitelisted_data_info_list;
403+
args.mount_data_dirs = &mount_data_dirs;
404+
args.mount_storage_dirs = &mount_storage_dirs;
405+
args.mount_sysprop_overrides = &mount_sysprop_overrides;
363406
struct zygisk_context ctx;
364407
rz_init(&ctx, env, &args);
365408
rz_nativeSpecializeAppProcess_pre(&ctx);
366409
((nativeSpecializeAppProcess_fn)nativeSpecializeAppProcess_orig)(
367-
env, clazz, uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, _13, _14, nice_name, is_child_zygote, instruction_set, app_data_dir
410+
env, clazz, uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, nice_name, is_child_zygote, instruction_set, app_data_dir, is_top_app, pkg_data_info_list, whitelisted_data_info_list, mount_data_dirs, mount_storage_dirs, mount_sysprop_overrides, _21
368411
);
369412
rz_nativeSpecializeAppProcess_post(&ctx);
370413
rz_cleanup(&ctx);
371414
}
372-
__attribute__((no_stack_protector)) static void nativeSpecializeAppProcess_grapheneos_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, jlongArray _18) {
415+
__attribute__((no_stack_protector)) static void nativeSpecializeAppProcess_grapheneos_c(JNIEnv *env, jclass clazz, jlongArray _17, 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) {
373416
struct app_specialize_args_v5 args = { .uid = &uid, .gid = &gid, .gids = &gids, .runtime_flags = &runtime_flags, .rlimits = &rlimits, .mount_external = &mount_external, .se_info = &se_info, .nice_name = &nice_name, .instruction_set = &instruction_set, .app_data_dir = &app_data_dir };
374417
args.is_child_zygote = &is_child_zygote;
375418
args.is_top_app = &is_top_app;
@@ -382,7 +425,7 @@ __attribute__((no_stack_protector)) static void nativeSpecializeAppProcess_graph
382425
rz_init(&ctx, env, &args);
383426
rz_nativeSpecializeAppProcess_pre(&ctx);
384427
((nativeSpecializeAppProcess_fn)nativeSpecializeAppProcess_orig)(
385-
env, clazz, uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, nice_name, is_child_zygote, instruction_set, app_data_dir, is_top_app, pkg_data_info_list, whitelisted_data_info_list, mount_data_dirs, mount_storage_dirs, mount_sysprop_overrides, _18
428+
env, clazz, _17, uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, nice_name, is_child_zygote, instruction_set, app_data_dir, is_top_app, pkg_data_info_list, whitelisted_data_info_list, mount_data_dirs, mount_storage_dirs, mount_sysprop_overrides
386429
);
387430
rz_nativeSpecializeAppProcess_post(&ctx);
388431
rz_cleanup(&ctx);
@@ -423,6 +466,11 @@ static JNINativeMethod nativeSpecializeAppProcess_methods[] = {
423466
"(II[II[[IILjava/lang/String;Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;Z[Ljava/lang/String;[Ljava/lang/String;ZZZ[J)V",
424467
(void *) &nativeSpecializeAppProcess_grapheneos_u
425468
},
469+
{
470+
"nativeSpecializeAppProcess",
471+
"([JII[II[[IILjava/lang/String;Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;Z[Ljava/lang/String;[Ljava/lang/String;ZZZ)V",
472+
(void *) &nativeSpecializeAppProcess_grapheneos_c
473+
},
426474
};
427475

428476
static void *nativeForkSystemServer_orig = NULL;
@@ -439,13 +487,13 @@ __attribute__((no_stack_protector)) static jint nativeForkSystemServer_l(JNIEnv
439487
rz_cleanup(&ctx);
440488
return ctx.pid;
441489
}
442-
__attribute__((no_stack_protector)) static jint nativeForkSystemServer_samsung_q(JNIEnv *env, jclass clazz, jint uid, jint gid, jintArray gids, jint runtime_flags, jint _15, jint _16, jobjectArray rlimits, jlong permitted_capabilities, jlong effective_capabilities) {
490+
__attribute__((no_stack_protector)) static jint nativeForkSystemServer_samsung_q(JNIEnv *env, jclass clazz, jint uid, jint gid, jintArray gids, jint runtime_flags, jint _18, jint _19, jobjectArray rlimits, jlong permitted_capabilities, jlong effective_capabilities) {
443491
struct server_specialize_args_v1 args = { .uid = &uid, .gid = &gid, .gids = &gids, .runtime_flags = &runtime_flags, .permitted_capabilities = &permitted_capabilities, .effective_capabilities = &effective_capabilities };
444492
struct zygisk_context ctx;
445493
rz_init(&ctx, env, &args);
446494
rz_nativeForkSystemServer_pre(&ctx);
447495
((nativeForkSystemServer_fn)nativeForkSystemServer_orig)(
448-
env, clazz, uid, gid, gids, runtime_flags, _15, _16, rlimits, permitted_capabilities, effective_capabilities
496+
env, clazz, uid, gid, gids, runtime_flags, _18, _19, rlimits, permitted_capabilities, effective_capabilities
449497
);
450498
rz_nativeForkSystemServer_post(&ctx);
451499
rz_cleanup(&ctx);

0 commit comments

Comments
 (0)