mirror of
https://github.com/topjohnwu/Magisk.git
synced 2024-12-26 02:47:39 +00:00
Use code generator for jni_hooks
This commit is contained in:
parent
00a1e18959
commit
25efdd3d6f
201
native/jni/inject/gen_jni_hooks.py
Executable file
201
native/jni/inject/gen_jni_hooks.py
Executable file
@ -0,0 +1,201 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
primitives = ['jint', 'jboolean', 'jlong']
|
||||||
|
|
||||||
|
class JType:
|
||||||
|
def __init__(self, name, sig) -> None:
|
||||||
|
self.name = name
|
||||||
|
self.sig = sig
|
||||||
|
|
||||||
|
|
||||||
|
class JArray(JType):
|
||||||
|
def __init__(self, type) -> None:
|
||||||
|
if type.name in primitives:
|
||||||
|
name = type.name + 'Array'
|
||||||
|
else:
|
||||||
|
name = 'jobjectArray'
|
||||||
|
super().__init__(name, '[' + type.sig)
|
||||||
|
|
||||||
|
|
||||||
|
class Argument:
|
||||||
|
def __init__(self, name, type, set_arg = False) -> None:
|
||||||
|
self.name = name
|
||||||
|
self.type = type
|
||||||
|
self.set_arg = set_arg
|
||||||
|
|
||||||
|
def cpp(self):
|
||||||
|
return f'{self.type.name} {self.name}'
|
||||||
|
|
||||||
|
|
||||||
|
class Method:
|
||||||
|
def __init__(self, name, args) -> None:
|
||||||
|
self.name = name
|
||||||
|
self.args = args
|
||||||
|
|
||||||
|
def cpp(self):
|
||||||
|
return ', '.join(map(lambda a: a.cpp(), self.args))
|
||||||
|
|
||||||
|
def name_list(self):
|
||||||
|
return ', '.join(map(lambda a: a.name, self.args))
|
||||||
|
|
||||||
|
def jni(self):
|
||||||
|
return ''.join(map(lambda a: a.type.sig, self.args))
|
||||||
|
|
||||||
|
|
||||||
|
# Common types
|
||||||
|
jint = JType('jint', 'I')
|
||||||
|
jintArray = JArray(jint)
|
||||||
|
jstring = JType('jstring', 'Ljava/lang/String;')
|
||||||
|
jboolean = JType('jboolean', 'Z')
|
||||||
|
jlong = JType('jlong', 'J')
|
||||||
|
|
||||||
|
# Common args
|
||||||
|
uid = Argument('uid', jint)
|
||||||
|
gid = Argument('gid', jint)
|
||||||
|
gids = Argument('gids', jintArray)
|
||||||
|
runtime_flags = Argument('runtime_flags', jint)
|
||||||
|
rlimits = Argument('rlimits', JArray(jintArray))
|
||||||
|
mount_external = Argument('mount_external', jint)
|
||||||
|
se_info = Argument('se_info', jstring)
|
||||||
|
nice_name = Argument('nice_name', jstring)
|
||||||
|
fds_to_close = Argument('fds_to_close', jintArray)
|
||||||
|
instruction_set = Argument('instruction_set', jstring)
|
||||||
|
app_data_dir = Argument('app_data_dir', jstring)
|
||||||
|
|
||||||
|
# o
|
||||||
|
fds_to_ignore = Argument('fds_to_ignore', jintArray)
|
||||||
|
|
||||||
|
# p
|
||||||
|
is_child_zygote = Argument('is_child_zygote', jboolean, True)
|
||||||
|
|
||||||
|
# q_alt
|
||||||
|
is_top_app = Argument('is_top_app', jboolean, True)
|
||||||
|
|
||||||
|
# r
|
||||||
|
pkg_data_info_list = Argument('pkg_data_info_list', JArray(jstring), True)
|
||||||
|
whitelisted_data_info_list = Argument('whitelisted_data_info_list', JArray(jstring), True)
|
||||||
|
mount_data_dirs = Argument('mount_data_dirs', jboolean, True)
|
||||||
|
mount_storage_dirs = Argument('mount_storage_dirs', jboolean, True)
|
||||||
|
|
||||||
|
# samsung (non-standard arguments)
|
||||||
|
i1 = Argument('i1', jint)
|
||||||
|
i2 = Argument('i2', jint)
|
||||||
|
i3 = Argument('i3', jint)
|
||||||
|
|
||||||
|
# server
|
||||||
|
permitted_capabilities = Argument('permitted_capabilities', jlong)
|
||||||
|
effective_capabilities = Argument('effective_capabilities', jlong)
|
||||||
|
|
||||||
|
# Method definitions
|
||||||
|
fork_m = Method('m', [uid, gid, gids, runtime_flags, rlimits, mount_external,
|
||||||
|
se_info, nice_name, fds_to_close, instruction_set, app_data_dir])
|
||||||
|
|
||||||
|
fork_o = Method('o', [uid, gid, gids, runtime_flags, rlimits, mount_external,
|
||||||
|
se_info, nice_name, fds_to_close, fds_to_ignore, instruction_set, app_data_dir])
|
||||||
|
|
||||||
|
fork_p = Method('p', [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])
|
||||||
|
|
||||||
|
fork_q_alt = Method('q_alt', [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])
|
||||||
|
|
||||||
|
fork_r = Method('r', [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])
|
||||||
|
|
||||||
|
fork_samsung_m = Method('samsung_m', [uid, gid, gids, runtime_flags, rlimits, mount_external,
|
||||||
|
se_info, i1, i2, nice_name, fds_to_close, instruction_set, app_data_dir])
|
||||||
|
|
||||||
|
fork_samsung_n = Method('samsung_n', [uid, gid, gids, runtime_flags, rlimits, mount_external,
|
||||||
|
se_info, i1, i2, nice_name, fds_to_close, instruction_set, app_data_dir, i3])
|
||||||
|
|
||||||
|
fork_samsung_o = Method('samsung_o', [uid, gid, gids, runtime_flags, rlimits, mount_external,
|
||||||
|
se_info, i1, i2, nice_name, fds_to_close, fds_to_ignore, instruction_set, app_data_dir])
|
||||||
|
|
||||||
|
fork_samsung_p = Method('samsung_p', [uid, gid, gids, runtime_flags, rlimits, mount_external,
|
||||||
|
se_info, i1, i2, nice_name, fds_to_close, fds_to_ignore, is_child_zygote, instruction_set, app_data_dir])
|
||||||
|
|
||||||
|
spec_q = Method('q', [uid, gid, gids, runtime_flags, rlimits, mount_external, se_info,
|
||||||
|
nice_name, is_child_zygote, instruction_set, app_data_dir])
|
||||||
|
|
||||||
|
spec_q_alt = Method('q_alt', [uid, gid, gids, runtime_flags, rlimits, mount_external, se_info,
|
||||||
|
nice_name, is_child_zygote, instruction_set, app_data_dir, is_top_app])
|
||||||
|
|
||||||
|
spec_r = Method('r', [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])
|
||||||
|
|
||||||
|
spec_samsung_q = Method('samsung_q', [uid, gid, gids, runtime_flags, rlimits, mount_external,
|
||||||
|
se_info, i1, i2, nice_name, is_child_zygote, instruction_set, app_data_dir])
|
||||||
|
|
||||||
|
server_m = Method('m', [uid, gid, gids, runtime_flags, rlimits,
|
||||||
|
permitted_capabilities, effective_capabilities])
|
||||||
|
|
||||||
|
server_samsung_q = Method('samsung_q', [uid, gid, gids, runtime_flags, i1, i2, rlimits,
|
||||||
|
permitted_capabilities, effective_capabilities])
|
||||||
|
|
||||||
|
|
||||||
|
def ind(i):
|
||||||
|
return '\n' + ' ' * i
|
||||||
|
|
||||||
|
def gen_definitions(methods, base_name):
|
||||||
|
decl = ''
|
||||||
|
if base_name != 'nativeSpecializeAppProcess':
|
||||||
|
ret_stat = ind(1) + 'return ctx.pid;'
|
||||||
|
cpp_ret = 'jint'
|
||||||
|
jni_ret = 'I'
|
||||||
|
else:
|
||||||
|
ret_stat = ''
|
||||||
|
cpp_ret = 'void'
|
||||||
|
jni_ret = 'V'
|
||||||
|
for m in methods:
|
||||||
|
func_name = f'{base_name}_{m.name}'
|
||||||
|
decl += ind(0) + f'static {cpp_ret} {func_name}(JNIEnv *env, jclass clazz, {m.cpp()}) {{'
|
||||||
|
decl += ind(1) + 'HookContext ctx{};'
|
||||||
|
if base_name == 'nativeForkSystemServer':
|
||||||
|
decl += ind(1) + 'ForkSystemServerArgs args(uid, gid, gids, runtime_flags, permitted_capabilities, effective_capabilities);'
|
||||||
|
else:
|
||||||
|
decl += ind(1) + 'SpecializeAppProcessArgs args(uid, gid, gids, runtime_flags, mount_external, se_info, nice_name, instruction_set, app_data_dir);'
|
||||||
|
for a in m.args:
|
||||||
|
if a.set_arg:
|
||||||
|
decl += ind(1) + f'args.{a.name} = &{a.name};'
|
||||||
|
decl += ind(1) + 'ctx.raw_args = &args;'
|
||||||
|
decl += ind(1) + f'{base_name}_pre(&ctx, env, clazz);'
|
||||||
|
decl += ind(1) + f'reinterpret_cast<decltype(&{func_name})>({base_name}_orig)('
|
||||||
|
decl += ind(2) + f'env, clazz, {m.name_list()}'
|
||||||
|
decl += ind(1) + ');'
|
||||||
|
decl += ind(1) + f'{base_name}_post(&ctx, env, clazz);'
|
||||||
|
decl += ret_stat
|
||||||
|
decl += ind(0) + '}'
|
||||||
|
|
||||||
|
decl += ind(0) + 'namespace {'
|
||||||
|
decl += ind(0) + f'const JNINativeMethod {base_name}_methods[] = {{'
|
||||||
|
for m in methods:
|
||||||
|
decl += ind(1) + '{'
|
||||||
|
decl += ind(2) + f'"{base_name}",'
|
||||||
|
decl += ind(2) + f'"({m.jni()}){jni_ret}",'
|
||||||
|
decl += ind(2) + f'(void *) &{base_name}_{m.name}'
|
||||||
|
decl += ind(1) + '},'
|
||||||
|
decl += ind(0) + '};'
|
||||||
|
decl += ind(0) + f'const int {base_name}_methods_num = std::size({base_name}_methods);'
|
||||||
|
decl += ind(0) + '} // namespace'
|
||||||
|
decl += ind(0)
|
||||||
|
return decl
|
||||||
|
|
||||||
|
def gen_fork():
|
||||||
|
methods = [fork_m, fork_o, fork_p, fork_q_alt, fork_r, fork_samsung_m, fork_samsung_n, fork_samsung_o, fork_samsung_p]
|
||||||
|
return gen_definitions(methods, 'nativeForkAndSpecialize')
|
||||||
|
|
||||||
|
def gen_spec():
|
||||||
|
methods = [spec_q, spec_q_alt, spec_r, spec_samsung_q]
|
||||||
|
return gen_definitions(methods, 'nativeSpecializeAppProcess')
|
||||||
|
|
||||||
|
def gen_server():
|
||||||
|
methods = [server_m, server_samsung_q]
|
||||||
|
return gen_definitions(methods, 'nativeForkSystemServer')
|
||||||
|
|
||||||
|
with open('jni_hooks.hpp', 'w') as f:
|
||||||
|
f.write('// Generated by gen_jni_hooks.py\n')
|
||||||
|
f.write(gen_fork())
|
||||||
|
f.write(gen_spec())
|
||||||
|
f.write(gen_server())
|
@ -11,9 +11,58 @@ using jni_hook::hash_map;
|
|||||||
using jni_hook::tree_map;
|
using jni_hook::tree_map;
|
||||||
using xstring = jni_hook::string;
|
using xstring = jni_hook::string;
|
||||||
|
|
||||||
|
struct SpecializeAppProcessArgs {
|
||||||
|
jint &uid;
|
||||||
|
jint &gid;
|
||||||
|
jintArray &gids;
|
||||||
|
jint &runtime_flags;
|
||||||
|
jint &mount_external;
|
||||||
|
jstring &se_info;
|
||||||
|
jstring &nice_name;
|
||||||
|
jstring &instruction_set;
|
||||||
|
jstring &app_data_dir;
|
||||||
|
|
||||||
|
/* Optional */
|
||||||
|
jboolean *is_child_zygote = nullptr;
|
||||||
|
jboolean *is_top_app = nullptr;
|
||||||
|
jobjectArray *pkg_data_info_list = nullptr;
|
||||||
|
jobjectArray *whitelisted_data_info_list = nullptr;
|
||||||
|
jboolean *mount_data_dirs = nullptr;
|
||||||
|
jboolean *mount_storage_dirs = nullptr;
|
||||||
|
|
||||||
|
SpecializeAppProcessArgs(
|
||||||
|
jint &uid, jint &gid, jintArray &gids, jint &runtime_flags,
|
||||||
|
jint &mount_external, jstring &se_info, jstring &nice_name,
|
||||||
|
jstring &instruction_set, jstring &app_data_dir) :
|
||||||
|
uid(uid), gid(gid), gids(gids), runtime_flags(runtime_flags),
|
||||||
|
mount_external(mount_external), se_info(se_info), nice_name(nice_name),
|
||||||
|
instruction_set(instruction_set), app_data_dir(app_data_dir) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ForkSystemServerArgs {
|
||||||
|
jint &uid;
|
||||||
|
jint &gid;
|
||||||
|
jintArray &gids;
|
||||||
|
jint &runtime_flags;
|
||||||
|
jlong &permitted_capabilities;
|
||||||
|
jlong &effective_capabilities;
|
||||||
|
|
||||||
|
ForkSystemServerArgs(
|
||||||
|
jint &uid, jint &gid, jintArray &gids, jint &runtime_flags,
|
||||||
|
jlong &permitted_capabilities, jlong &effective_capabilities) :
|
||||||
|
uid(uid), gid(gid), gids(gids), runtime_flags(runtime_flags),
|
||||||
|
permitted_capabilities(permitted_capabilities),
|
||||||
|
effective_capabilities(effective_capabilities) {}
|
||||||
|
};
|
||||||
|
|
||||||
struct HookContext {
|
struct HookContext {
|
||||||
int pid;
|
int pid;
|
||||||
bool do_hide;
|
bool do_hide;
|
||||||
|
union {
|
||||||
|
SpecializeAppProcessArgs *args;
|
||||||
|
ForkSystemServerArgs *server_args;
|
||||||
|
void *raw_args;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
static vector<tuple<const char *, const char *, void **>> *xhook_list;
|
static vector<tuple<const char *, const char *, void **>> *xhook_list;
|
||||||
@ -21,7 +70,6 @@ static vector<JNINativeMethod> *jni_hook_list;
|
|||||||
static hash_map<xstring, tree_map<xstring, tree_map<xstring, void *>>> *jni_method_map;
|
static hash_map<xstring, tree_map<xstring, tree_map<xstring, void *>>> *jni_method_map;
|
||||||
|
|
||||||
static JavaVM *g_jvm;
|
static JavaVM *g_jvm;
|
||||||
static int prev_fork_pid = -1;
|
|
||||||
static HookContext *current_ctx;
|
static HookContext *current_ctx;
|
||||||
|
|
||||||
#define DCL_HOOK_FUNC(ret, func, ...) \
|
#define DCL_HOOK_FUNC(ret, func, ...) \
|
||||||
@ -29,10 +77,7 @@ static HookContext *current_ctx;
|
|||||||
static ret new_##func(__VA_ARGS__)
|
static ret new_##func(__VA_ARGS__)
|
||||||
|
|
||||||
#define DCL_JNI_FUNC(name) \
|
#define DCL_JNI_FUNC(name) \
|
||||||
static int name##_orig_idx; \
|
static void *name##_orig; \
|
||||||
static inline JNINativeMethod &name##_orig() { \
|
|
||||||
return (*jni_hook_list)[name##_orig_idx]; \
|
|
||||||
} \
|
|
||||||
extern const JNINativeMethod name##_methods[]; \
|
extern const JNINativeMethod name##_methods[]; \
|
||||||
extern const int name##_methods_num;
|
extern const int name##_methods_num;
|
||||||
|
|
||||||
@ -44,9 +89,9 @@ DCL_JNI_FUNC(nativeForkSystemServer)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#define HOOK_JNI(method) \
|
#define HOOK_JNI(method) \
|
||||||
if (hooked < 3 && methods[i].name == #method##sv) { \
|
if (methods[i].name == #method##sv) { \
|
||||||
jni_hook_list->push_back(methods[i]); \
|
jni_hook_list->push_back(methods[i]); \
|
||||||
method##_orig_idx = jni_hook_list->size() - 1; \
|
method##_orig = methods[i].fnPtr; \
|
||||||
for (int j = 0; j < method##_methods_num; ++j) { \
|
for (int j = 0; j < method##_methods_num; ++j) { \
|
||||||
if (strcmp(methods[i].signature, method##_methods[j].signature) == 0) { \
|
if (strcmp(methods[i].signature, method##_methods[j].signature) == 0) { \
|
||||||
newMethods[i] = method##_methods[j]; \
|
newMethods[i] = method##_methods[j]; \
|
||||||
@ -78,22 +123,18 @@ DCL_HOOK_FUNC(int, jniRegisterNativeMethods,
|
|||||||
auto &class_map = (*jni_method_map)[className];
|
auto &class_map = (*jni_method_map)[className];
|
||||||
for (int i = 0; i < numMethods; ++i) {
|
for (int i = 0; i < numMethods; ++i) {
|
||||||
class_map[methods[i].name][methods[i].signature] = methods[i].fnPtr;
|
class_map[methods[i].name][methods[i].signature] = methods[i].fnPtr;
|
||||||
HOOK_JNI(nativeForkAndSpecialize);
|
if (hooked < 3) {
|
||||||
HOOK_JNI(nativeSpecializeAppProcess);
|
HOOK_JNI(nativeForkAndSpecialize);
|
||||||
HOOK_JNI(nativeForkSystemServer);
|
HOOK_JNI(nativeSpecializeAppProcess);
|
||||||
|
HOOK_JNI(nativeForkSystemServer);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return old_jniRegisterNativeMethods(env, className, newMethods.get() ?: methods, numMethods);
|
return old_jniRegisterNativeMethods(env, className, newMethods.get() ?: methods, numMethods);
|
||||||
}
|
}
|
||||||
|
|
||||||
DCL_HOOK_FUNC(int, fork) {
|
DCL_HOOK_FUNC(int, fork) {
|
||||||
if (prev_fork_pid < 0)
|
return current_ctx ? current_ctx->pid : old_fork();
|
||||||
return old_fork();
|
|
||||||
|
|
||||||
// Skip an actual fork and return the previous fork result
|
|
||||||
int pid = prev_fork_pid;
|
|
||||||
prev_fork_pid = -1;
|
|
||||||
return pid;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DCL_HOOK_FUNC(int, selinux_android_setcontext,
|
DCL_HOOK_FUNC(int, selinux_android_setcontext,
|
||||||
@ -114,103 +155,73 @@ static int sigmask(int how, int signum) {
|
|||||||
return sigprocmask(how, &set, nullptr);
|
return sigprocmask(how, &set, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int pre_specialize_fork() {
|
|
||||||
// First block SIGCHLD, unblock after original fork is done
|
|
||||||
sigmask(SIG_BLOCK, SIGCHLD);
|
|
||||||
prev_fork_pid = old_fork();
|
|
||||||
return prev_fork_pid;
|
|
||||||
}
|
|
||||||
|
|
||||||
// -----------------------------------------------------------------
|
// -----------------------------------------------------------------
|
||||||
|
|
||||||
static void nativeSpecializeAppProcess_pre(HookContext *ctx,
|
static void nativeSpecializeAppProcess_pre(HookContext *ctx, JNIEnv *env, jclass clazz) {
|
||||||
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) {
|
|
||||||
|
|
||||||
current_ctx = ctx;
|
current_ctx = ctx;
|
||||||
|
const char *process = env->GetStringUTFChars(ctx->args->nice_name, nullptr);
|
||||||
const char *process = env->GetStringUTFChars(nice_name, nullptr);
|
|
||||||
LOGD("hook: %s %s\n", __FUNCTION__, process);
|
LOGD("hook: %s %s\n", __FUNCTION__, process);
|
||||||
|
|
||||||
if (mount_external != 0 /* TODO: Handle MOUNT_EXTERNAL_NONE cases */
|
if (ctx->args->mount_external != 0 /* TODO: Handle MOUNT_EXTERNAL_NONE cases */
|
||||||
&& remote_check_hide(uid, process)) {
|
&& remote_check_hide(ctx->args->uid, process)) {
|
||||||
ctx->do_hide = true;
|
ctx->do_hide = true;
|
||||||
LOGI("hook: [%s] should be hidden\n", process);
|
LOGI("hook: [%s] should be hidden\n", process);
|
||||||
}
|
}
|
||||||
|
|
||||||
env->ReleaseStringUTFChars(nice_name, process);
|
env->ReleaseStringUTFChars(ctx->args->nice_name, process);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void nativeSpecializeAppProcess_post(HookContext *ctx, JNIEnv *env, jclass clazz) {
|
static void nativeSpecializeAppProcess_post(HookContext *ctx, JNIEnv *env, jclass clazz) {
|
||||||
|
current_ctx = nullptr;
|
||||||
LOGD("hook: %s\n", __FUNCTION__);
|
LOGD("hook: %s\n", __FUNCTION__);
|
||||||
|
|
||||||
if (ctx->do_hide)
|
if (ctx->do_hide)
|
||||||
self_unload();
|
self_unload();
|
||||||
|
|
||||||
current_ctx = nullptr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------
|
// -----------------------------------------------------------------
|
||||||
|
|
||||||
static void nativeForkAndSpecialize_pre(HookContext *ctx,
|
// Do our own fork before loading any 3rd party code
|
||||||
JNIEnv *env, jclass clazz, jint &uid, jint &gid, jintArray &gids, jint &runtime_flags,
|
// First block SIGCHLD, unblock after original fork is done
|
||||||
jobjectArray &rlimits, jint &mount_external, jstring &se_info, jstring &nice_name,
|
#define PRE_FORK() \
|
||||||
jintArray fds_to_close, jintArray fds_to_ignore, /* These 2 arguments are unique to fork */
|
current_ctx = ctx; \
|
||||||
jboolean &is_child_zygote, jstring &instruction_set, jstring &app_data_dir,
|
sigmask(SIG_BLOCK, SIGCHLD); \
|
||||||
jboolean &is_top_app, jobjectArray &pkg_data_info_list,
|
ctx->pid = old_fork(); \
|
||||||
jobjectArray &whitelisted_data_info_list, jboolean &mount_data_dirs,
|
if (ctx->pid != 0) \
|
||||||
jboolean &mount_storage_dirs) {
|
|
||||||
|
|
||||||
// Do our own fork before loading any 3rd party code
|
|
||||||
ctx->pid = pre_specialize_fork();
|
|
||||||
if (ctx->pid != 0)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
nativeSpecializeAppProcess_pre(
|
// Unblock SIGCHLD in case the original method didn't
|
||||||
ctx, env, clazz, uid, gid, gids, runtime_flags, rlimits, mount_external, se_info,
|
#define POST_FORK() \
|
||||||
nice_name, is_child_zygote, instruction_set, app_data_dir, is_top_app,
|
current_ctx = nullptr; \
|
||||||
pkg_data_info_list, whitelisted_data_info_list, mount_data_dirs, mount_storage_dirs);
|
sigmask(SIG_UNBLOCK, SIGCHLD); \
|
||||||
|
if (ctx->pid != 0)\
|
||||||
|
return;
|
||||||
|
|
||||||
|
static void nativeForkAndSpecialize_pre(HookContext *ctx, JNIEnv *env, jclass clazz) {
|
||||||
|
PRE_FORK();
|
||||||
|
nativeSpecializeAppProcess_pre(ctx, env, clazz);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void nativeForkAndSpecialize_post(HookContext *ctx, JNIEnv *env, jclass clazz) {
|
static void nativeForkAndSpecialize_post(HookContext *ctx, JNIEnv *env, jclass clazz) {
|
||||||
// Unblock SIGCHLD in case the original method didn't
|
POST_FORK();
|
||||||
sigmask(SIG_UNBLOCK, SIGCHLD);
|
|
||||||
if (ctx->pid != 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
nativeSpecializeAppProcess_post(ctx, env, clazz);
|
nativeSpecializeAppProcess_post(ctx, env, clazz);
|
||||||
}
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------
|
// -----------------------------------------------------------------
|
||||||
|
|
||||||
static void nativeForkSystemServer_pre(HookContext *ctx,
|
static void nativeForkSystemServer_pre(HookContext *ctx, JNIEnv *env, jclass clazz) {
|
||||||
JNIEnv *env, jclass clazz, uid_t &uid, gid_t &gid, jintArray &gids, jint &runtime_flags,
|
PRE_FORK();
|
||||||
jobjectArray &rlimits, jlong &permitted_capabilities, jlong &effective_capabilities) {
|
|
||||||
|
|
||||||
// Do our own fork before loading any 3rd party code
|
|
||||||
ctx->pid = pre_specialize_fork();
|
|
||||||
if (ctx->pid != 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
current_ctx = ctx;
|
|
||||||
LOGD("hook: %s\n", __FUNCTION__);
|
LOGD("hook: %s\n", __FUNCTION__);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void nativeForkSystemServer_post(HookContext *ctx, JNIEnv *env, jclass clazz) {
|
static void nativeForkSystemServer_post(HookContext *ctx, JNIEnv *env, jclass clazz) {
|
||||||
// Unblock SIGCHLD in case the original method didn't
|
POST_FORK();
|
||||||
sigmask(SIG_UNBLOCK, SIGCHLD);
|
|
||||||
|
|
||||||
if (ctx->pid != 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
LOGD("hook: %s\n", __FUNCTION__);
|
LOGD("hook: %s\n", __FUNCTION__);
|
||||||
current_ctx = nullptr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#undef PRE_FORK
|
||||||
|
#undef POST_FORK
|
||||||
|
|
||||||
// -----------------------------------------------------------------
|
// -----------------------------------------------------------------
|
||||||
|
|
||||||
static bool hook_refresh() {
|
static bool hook_refresh() {
|
||||||
@ -282,4 +293,5 @@ bool unhook_functions() {
|
|||||||
return hook_refresh();
|
return hook_refresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// JNI method definitions, include all method signatures of past Android versions
|
||||||
#include "jni_hooks.hpp"
|
#include "jni_hooks.hpp"
|
||||||
|
@ -1,365 +1,275 @@
|
|||||||
/*
|
// Generated by gen_jni_hooks.py
|
||||||
* Original code from: https://github.com/RikkaApps/Riru
|
|
||||||
* The code is modified and sublicensed to GPLv3 for incorporating into Magisk.
|
|
||||||
*
|
|
||||||
* Copyright (c) 2018-2021, RikkaW
|
|
||||||
* Copyright (c) 2021, John 'topjohnwu' Wu
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define ENABLE_LEGACY_DP 0 // Nobody should use outdated developer preview...
|
static jint nativeForkAndSpecialize_m(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) {
|
||||||
|
HookContext ctx{};
|
||||||
// All possible missing arguments
|
SpecializeAppProcessArgs args(uid, gid, gids, runtime_flags, mount_external, se_info, nice_name, instruction_set, app_data_dir);
|
||||||
static union {
|
ctx.raw_args = &args;
|
||||||
struct {
|
nativeForkAndSpecialize_pre(&ctx, env, clazz);
|
||||||
jintArray fds_to_ignore;
|
reinterpret_cast<decltype(&nativeForkAndSpecialize_m)>(nativeForkAndSpecialize_orig)(
|
||||||
jboolean is_child_zygote;
|
env, clazz, uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, nice_name, fds_to_close, instruction_set, app_data_dir
|
||||||
jboolean is_top_app;
|
);
|
||||||
jobjectArray pkg_data_info_list;
|
nativeForkAndSpecialize_post(&ctx, env, clazz);
|
||||||
jobjectArray whitelisted_data_info_list;
|
return ctx.pid;
|
||||||
jboolean mount_data_dirs;
|
|
||||||
jboolean mount_storage_dirs;
|
|
||||||
};
|
|
||||||
size_t args_buf[8]; // Easy access to wipe all variables at once
|
|
||||||
};
|
|
||||||
|
|
||||||
#define DCL_JNI(ret, name, sig, ...) \
|
|
||||||
const static char name##_sig[] = sig; \
|
|
||||||
static ret name(__VA_ARGS__)
|
|
||||||
|
|
||||||
// -----------------------------------------------------------------
|
|
||||||
|
|
||||||
#define pre_fork() \
|
|
||||||
HookContext ctx{}; \
|
|
||||||
memset(args_buf, 0, sizeof(args_buf)); \
|
|
||||||
nativeForkAndSpecialize_pre(&ctx, 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)
|
|
||||||
|
|
||||||
#define orig_fork(ver, ...) \
|
|
||||||
reinterpret_cast<decltype(&nativeForkAndSpecialize_##ver)> \
|
|
||||||
(nativeForkAndSpecialize_orig().fnPtr)(__VA_ARGS__)
|
|
||||||
|
|
||||||
#define post_fork() \
|
|
||||||
nativeForkAndSpecialize_post(&ctx, env, clazz); \
|
|
||||||
return ctx.pid
|
|
||||||
|
|
||||||
#define DCL_FORK_AND_SPECIALIZE(ver, sig, ...) \
|
|
||||||
DCL_JNI(jint, nativeForkAndSpecialize_##ver, sig, __VA_ARGS__)
|
|
||||||
|
|
||||||
DCL_FORK_AND_SPECIALIZE(m,
|
|
||||||
"(II[II[[IILjava/lang/String;Ljava/lang/String;[ILjava/lang/String;Ljava/lang/String;)I",
|
|
||||||
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) {
|
|
||||||
pre_fork();
|
|
||||||
orig_fork(m, env, clazz, uid, gid, gids, runtime_flags, rlimits, mount_external,
|
|
||||||
se_info, nice_name, fds_to_close, instruction_set, app_data_dir);
|
|
||||||
post_fork();
|
|
||||||
}
|
}
|
||||||
|
static 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) {
|
||||||
DCL_FORK_AND_SPECIALIZE(o,
|
HookContext ctx{};
|
||||||
"(II[II[[IILjava/lang/String;Ljava/lang/String;[I[ILjava/lang/String;Ljava/lang/String;)I",
|
SpecializeAppProcessArgs args(uid, gid, gids, runtime_flags, mount_external, se_info, nice_name, instruction_set, app_data_dir);
|
||||||
JNIEnv *env, jclass clazz, jint uid, jint gid, jintArray gids, jint runtime_flags,
|
ctx.raw_args = &args;
|
||||||
jobjectArray rlimits, jint mount_external, jstring se_info, jstring nice_name,
|
nativeForkAndSpecialize_pre(&ctx, env, clazz);
|
||||||
jintArray fds_to_close, jintArray fds_to_ignore, jstring instruction_set, jstring app_data_dir) {
|
reinterpret_cast<decltype(&nativeForkAndSpecialize_o)>(nativeForkAndSpecialize_orig)(
|
||||||
pre_fork();
|
env, clazz, uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, nice_name, fds_to_close, fds_to_ignore, instruction_set, app_data_dir
|
||||||
orig_fork(o, env, clazz, uid, gid, gids, runtime_flags, rlimits, mount_external,
|
);
|
||||||
se_info, nice_name, fds_to_close, fds_to_ignore, instruction_set, app_data_dir);
|
nativeForkAndSpecialize_post(&ctx, env, clazz);
|
||||||
post_fork();
|
return ctx.pid;
|
||||||
}
|
}
|
||||||
|
static 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) {
|
||||||
DCL_FORK_AND_SPECIALIZE(p,
|
HookContext ctx{};
|
||||||
"(II[II[[IILjava/lang/String;Ljava/lang/String;[I[IZLjava/lang/String;Ljava/lang/String;)I",
|
SpecializeAppProcessArgs args(uid, gid, gids, runtime_flags, mount_external, se_info, nice_name, instruction_set, app_data_dir);
|
||||||
JNIEnv *env, jclass clazz, jint uid, jint gid, jintArray gids, jint runtime_flags,
|
args.is_child_zygote = &is_child_zygote;
|
||||||
jobjectArray rlimits, jint mount_external, jstring se_info, jstring nice_name,
|
ctx.raw_args = &args;
|
||||||
jintArray fds_to_close, jintArray fds_to_ignore, jboolean is_child_zygote,
|
nativeForkAndSpecialize_pre(&ctx, env, clazz);
|
||||||
jstring instruction_set, jstring app_data_dir) {
|
reinterpret_cast<decltype(&nativeForkAndSpecialize_p)>(nativeForkAndSpecialize_orig)(
|
||||||
pre_fork();
|
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
|
||||||
orig_fork(p, 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);
|
nativeForkAndSpecialize_post(&ctx, env, clazz);
|
||||||
post_fork();
|
return ctx.pid;
|
||||||
}
|
}
|
||||||
|
static 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) {
|
||||||
DCL_FORK_AND_SPECIALIZE(q_alt,
|
HookContext ctx{};
|
||||||
"(II[II[[IILjava/lang/String;Ljava/lang/String;[I[IZLjava/lang/String;Ljava/lang/String;Z)I",
|
SpecializeAppProcessArgs args(uid, gid, gids, runtime_flags, mount_external, se_info, nice_name, instruction_set, app_data_dir);
|
||||||
JNIEnv *env, jclass clazz, jint uid, jint gid, jintArray gids, jint runtime_flags,
|
args.is_child_zygote = &is_child_zygote;
|
||||||
jobjectArray rlimits, jint mount_external, jstring se_info, jstring nice_name,
|
args.is_top_app = &is_top_app;
|
||||||
jintArray fds_to_close, jintArray fds_to_ignore, jboolean is_child_zygote,
|
ctx.raw_args = &args;
|
||||||
jstring instruction_set, jstring app_data_dir, jboolean is_top_app) {
|
nativeForkAndSpecialize_pre(&ctx, env, clazz);
|
||||||
pre_fork();
|
reinterpret_cast<decltype(&nativeForkAndSpecialize_q_alt)>(nativeForkAndSpecialize_orig)(
|
||||||
orig_fork(q_alt, env, clazz, uid, gid, gids, runtime_flags, rlimits, mount_external, se_info,
|
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
|
||||||
nice_name, fds_to_close, fds_to_ignore, is_child_zygote, instruction_set, app_data_dir, is_top_app);
|
);
|
||||||
post_fork();
|
nativeForkAndSpecialize_post(&ctx, env, clazz);
|
||||||
|
return ctx.pid;
|
||||||
}
|
}
|
||||||
|
static 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) {
|
||||||
#if ENABLE_LEGACY_DP
|
HookContext ctx{};
|
||||||
DCL_FORK_AND_SPECIALIZE(r_dp2,
|
SpecializeAppProcessArgs args(uid, gid, gids, runtime_flags, mount_external, se_info, nice_name, instruction_set, app_data_dir);
|
||||||
"(II[II[[IILjava/lang/String;Ljava/lang/String;[I[IZLjava/lang/String;Ljava/lang/String;Z[Ljava/lang/String;)I",
|
args.is_child_zygote = &is_child_zygote;
|
||||||
JNIEnv *env, jclass clazz, jint uid, jint gid, jintArray gids, jint runtime_flags,
|
args.is_top_app = &is_top_app;
|
||||||
jobjectArray rlimits, jint mount_external, jstring se_info, jstring nice_name,
|
args.pkg_data_info_list = &pkg_data_info_list;
|
||||||
jintArray fds_to_close, jintArray fds_to_ignore, jboolean is_child_zygote,
|
args.whitelisted_data_info_list = &whitelisted_data_info_list;
|
||||||
jstring instruction_set, jstring app_data_dir, jboolean is_top_app, jobjectArray pkg_data_info_list) {
|
args.mount_data_dirs = &mount_data_dirs;
|
||||||
pre_fork();
|
args.mount_storage_dirs = &mount_storage_dirs;
|
||||||
orig_fork(r_dp2, env, clazz, uid, gid, gids, runtime_flags, rlimits, mount_external, se_info,
|
ctx.raw_args = &args;
|
||||||
nice_name, fds_to_close, fds_to_ignore, is_child_zygote, instruction_set, app_data_dir,
|
nativeForkAndSpecialize_pre(&ctx, env, clazz);
|
||||||
is_top_app, pkg_data_info_list);
|
reinterpret_cast<decltype(&nativeForkAndSpecialize_r)>(nativeForkAndSpecialize_orig)(
|
||||||
post_fork();
|
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
|
||||||
|
);
|
||||||
|
nativeForkAndSpecialize_post(&ctx, env, clazz);
|
||||||
|
return ctx.pid;
|
||||||
}
|
}
|
||||||
|
static 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 i1, jint i2, jstring nice_name, jintArray fds_to_close, jstring instruction_set, jstring app_data_dir) {
|
||||||
DCL_FORK_AND_SPECIALIZE(r_dp3,
|
HookContext ctx{};
|
||||||
"(II[II[[IILjava/lang/String;Ljava/lang/String;[I[IZLjava/lang/String;Ljava/lang/String;Z[Ljava/lang/String;Z)I",
|
SpecializeAppProcessArgs args(uid, gid, gids, runtime_flags, mount_external, se_info, nice_name, instruction_set, app_data_dir);
|
||||||
JNIEnv *env, jclass clazz, jint uid, jint gid, jintArray gids, jint runtime_flags,
|
ctx.raw_args = &args;
|
||||||
jobjectArray rlimits, jint mount_external, jstring se_info, jstring nice_name,
|
nativeForkAndSpecialize_pre(&ctx, env, clazz);
|
||||||
jintArray fds_to_close, jintArray fds_to_ignore, jboolean is_child_zygote,
|
reinterpret_cast<decltype(&nativeForkAndSpecialize_samsung_m)>(nativeForkAndSpecialize_orig)(
|
||||||
jstring instruction_set, jstring app_data_dir, jboolean is_top_app, jobjectArray pkg_data_info_list,
|
env, clazz, uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, i1, i2, nice_name, fds_to_close, instruction_set, app_data_dir
|
||||||
jboolean mount_storage_dirs) {
|
);
|
||||||
pre_fork();
|
nativeForkAndSpecialize_post(&ctx, env, clazz);
|
||||||
orig_fork(r_dp3, env, clazz, uid, gid, gids, runtime_flags, rlimits, mount_external,
|
return ctx.pid;
|
||||||
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, mount_storage_dirs);
|
|
||||||
post_fork();
|
|
||||||
}
|
}
|
||||||
#endif // ENABLE_LEGACY_DP
|
static 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 i1, jint i2, jstring nice_name, jintArray fds_to_close, jstring instruction_set, jstring app_data_dir, jint i3) {
|
||||||
|
HookContext ctx{};
|
||||||
DCL_FORK_AND_SPECIALIZE(r,
|
SpecializeAppProcessArgs args(uid, gid, gids, runtime_flags, mount_external, se_info, nice_name, instruction_set, app_data_dir);
|
||||||
"(II[II[[IILjava/lang/String;Ljava/lang/String;[I[IZLjava/lang/String;Ljava/lang/String;Z[Ljava/lang/String;[Ljava/lang/String;ZZ)I",
|
ctx.raw_args = &args;
|
||||||
JNIEnv *env, jclass clazz, jint uid, jint gid, jintArray gids, jint runtime_flags,
|
nativeForkAndSpecialize_pre(&ctx, env, clazz);
|
||||||
jobjectArray rlimits, jint mount_external, jstring se_info, jstring nice_name,
|
reinterpret_cast<decltype(&nativeForkAndSpecialize_samsung_n)>(nativeForkAndSpecialize_orig)(
|
||||||
jintArray fds_to_close, jintArray fds_to_ignore, jboolean is_child_zygote,
|
env, clazz, uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, i1, i2, nice_name, fds_to_close, instruction_set, app_data_dir, i3
|
||||||
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) {
|
nativeForkAndSpecialize_post(&ctx, env, clazz);
|
||||||
pre_fork();
|
return ctx.pid;
|
||||||
orig_fork(r, 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);
|
|
||||||
post_fork();
|
|
||||||
}
|
}
|
||||||
|
static 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 i1, jint i2, jstring nice_name, jintArray fds_to_close, jintArray fds_to_ignore, jstring instruction_set, jstring app_data_dir) {
|
||||||
DCL_FORK_AND_SPECIALIZE(samsung_m,
|
HookContext ctx{};
|
||||||
"(II[II[[IILjava/lang/String;IILjava/lang/String;[ILjava/lang/String;Ljava/lang/String;)I",
|
SpecializeAppProcessArgs args(uid, gid, gids, runtime_flags, mount_external, se_info, nice_name, instruction_set, app_data_dir);
|
||||||
JNIEnv *env, jclass clazz, jint uid, jint gid, jintArray gids, jint runtime_flags,
|
ctx.raw_args = &args;
|
||||||
jobjectArray rlimits, jint mount_external, jstring se_info, jint category, jint accessInfo,
|
nativeForkAndSpecialize_pre(&ctx, env, clazz);
|
||||||
jstring nice_name, jintArray fds_to_close, jstring instruction_set, jstring app_data_dir) {
|
reinterpret_cast<decltype(&nativeForkAndSpecialize_samsung_o)>(nativeForkAndSpecialize_orig)(
|
||||||
pre_fork();
|
env, clazz, uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, i1, i2, nice_name, fds_to_close, fds_to_ignore, instruction_set, app_data_dir
|
||||||
orig_fork(samsung_m, env, clazz, uid, gid, gids, runtime_flags, rlimits, mount_external,
|
);
|
||||||
se_info, category, accessInfo, nice_name, fds_to_close, instruction_set, app_data_dir);
|
nativeForkAndSpecialize_post(&ctx, env, clazz);
|
||||||
post_fork();
|
return ctx.pid;
|
||||||
}
|
}
|
||||||
|
static 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 i1, jint i2, jstring nice_name, jintArray fds_to_close, jintArray fds_to_ignore, jboolean is_child_zygote, jstring instruction_set, jstring app_data_dir) {
|
||||||
DCL_FORK_AND_SPECIALIZE(samsung_n,
|
HookContext ctx{};
|
||||||
"(II[II[[IILjava/lang/String;IILjava/lang/String;[ILjava/lang/String;Ljava/lang/String;I)I",
|
SpecializeAppProcessArgs args(uid, gid, gids, runtime_flags, mount_external, se_info, nice_name, instruction_set, app_data_dir);
|
||||||
JNIEnv *env, jclass clazz, jint uid, jint gid, jintArray gids, jint runtime_flags,
|
args.is_child_zygote = &is_child_zygote;
|
||||||
jobjectArray rlimits, jint mount_external, jstring se_info, jint category, jint accessInfo,
|
ctx.raw_args = &args;
|
||||||
jstring nice_name, jintArray fds_to_close, jstring instruction_set, jstring app_data_dir, jint a1) {
|
nativeForkAndSpecialize_pre(&ctx, env, clazz);
|
||||||
pre_fork();
|
reinterpret_cast<decltype(&nativeForkAndSpecialize_samsung_p)>(nativeForkAndSpecialize_orig)(
|
||||||
orig_fork(samsung_n, env, clazz, uid, gid, gids, runtime_flags, rlimits, mount_external,
|
env, clazz, uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, i1, i2, nice_name, fds_to_close, fds_to_ignore, is_child_zygote, instruction_set, app_data_dir
|
||||||
se_info, category, accessInfo, nice_name, fds_to_close, instruction_set, app_data_dir, a1);
|
);
|
||||||
post_fork();
|
nativeForkAndSpecialize_post(&ctx, env, clazz);
|
||||||
|
return ctx.pid;
|
||||||
}
|
}
|
||||||
|
|
||||||
DCL_FORK_AND_SPECIALIZE(samsung_o,
|
|
||||||
"(II[II[[IILjava/lang/String;IILjava/lang/String;[I[ILjava/lang/String;Ljava/lang/String;)I",
|
|
||||||
JNIEnv *env, jclass clazz, jint uid, jint gid, jintArray gids, jint runtime_flags,
|
|
||||||
jobjectArray rlimits, jint mount_external, jstring se_info, jint category, jint accessInfo,
|
|
||||||
jstring nice_name, jintArray fds_to_close, jintArray fds_to_ignore, jstring instruction_set,
|
|
||||||
jstring app_data_dir) {
|
|
||||||
pre_fork();
|
|
||||||
orig_fork(samsung_o, env, clazz, uid, gid, gids, runtime_flags, rlimits, mount_external,
|
|
||||||
se_info, category, accessInfo, nice_name, fds_to_close, fds_to_ignore,
|
|
||||||
instruction_set, app_data_dir);
|
|
||||||
post_fork();
|
|
||||||
}
|
|
||||||
|
|
||||||
DCL_FORK_AND_SPECIALIZE(samsung_p,
|
|
||||||
"(II[II[[IILjava/lang/String;IILjava/lang/String;[I[IZLjava/lang/String;Ljava/lang/String;)I",
|
|
||||||
JNIEnv *env, jclass clazz, jint uid, jint gid, jintArray gids, jint runtime_flags,
|
|
||||||
jobjectArray rlimits, jint mount_external, jstring se_info, jint category, jint accessInfo,
|
|
||||||
jstring nice_name, jintArray fds_to_close, jintArray fds_to_ignore, jboolean is_child_zygote,
|
|
||||||
jstring instruction_set, jstring app_data_dir) {
|
|
||||||
pre_fork();
|
|
||||||
orig_fork(samsung_p, env, clazz, uid, gid, gids, runtime_flags, rlimits, mount_external,
|
|
||||||
se_info, category, accessInfo, nice_name, fds_to_close, fds_to_ignore, is_child_zygote,
|
|
||||||
instruction_set, app_data_dir);
|
|
||||||
post_fork();
|
|
||||||
}
|
|
||||||
|
|
||||||
#define DEF_FORK(ver) { \
|
|
||||||
"nativeForkAndSpecialize", \
|
|
||||||
nativeForkAndSpecialize_##ver##_sig, \
|
|
||||||
(void *) &nativeForkAndSpecialize_##ver \
|
|
||||||
}
|
|
||||||
|
|
||||||
// -----------------------------------------------------------------
|
|
||||||
|
|
||||||
#define pre_spec() \
|
|
||||||
HookContext ctx{}; \
|
|
||||||
memset(args_buf, 0, sizeof(args_buf)); \
|
|
||||||
nativeSpecializeAppProcess_pre(&ctx, \
|
|
||||||
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)
|
|
||||||
|
|
||||||
#define orig_spec(ver, ...) \
|
|
||||||
reinterpret_cast<decltype(&nativeSpecializeAppProcess_##ver)> \
|
|
||||||
(nativeSpecializeAppProcess_orig().fnPtr)(__VA_ARGS__)
|
|
||||||
|
|
||||||
#define post_spec() \
|
|
||||||
nativeSpecializeAppProcess_post(&ctx, env, clazz)
|
|
||||||
|
|
||||||
#define DCL_SPECIALIZE_APP(ver, sig, ...) \
|
|
||||||
DCL_JNI(void, nativeSpecializeAppProcess_##ver, sig, __VA_ARGS__)
|
|
||||||
|
|
||||||
DCL_SPECIALIZE_APP(q,
|
|
||||||
"(II[II[[IILjava/lang/String;Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;)V",
|
|
||||||
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) {
|
|
||||||
pre_spec();
|
|
||||||
orig_spec(q, env, clazz, uid, gid, gids, runtime_flags, rlimits, mount_external, se_info,
|
|
||||||
nice_name, is_child_zygote, instruction_set, app_data_dir);
|
|
||||||
post_spec();
|
|
||||||
}
|
|
||||||
|
|
||||||
DCL_SPECIALIZE_APP(q_alt,
|
|
||||||
"(II[II[[IILjava/lang/String;Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;Z)V",
|
|
||||||
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) {
|
|
||||||
pre_spec();
|
|
||||||
orig_spec(q_alt, 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);
|
|
||||||
post_spec();
|
|
||||||
}
|
|
||||||
|
|
||||||
#if ENABLE_LEGACY_DP
|
|
||||||
DCL_SPECIALIZE_APP(r_dp2,
|
|
||||||
"(II[II[[IILjava/lang/String;Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;Z[Ljava/lang/String;)V",
|
|
||||||
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) {
|
|
||||||
pre_spec();
|
|
||||||
orig_spec(r_dp2, 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);
|
|
||||||
post_spec();
|
|
||||||
}
|
|
||||||
|
|
||||||
DCL_SPECIALIZE_APP(r_dp3,
|
|
||||||
"(II[II[[IILjava/lang/String;Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;Z[Ljava/lang/String;Z)V",
|
|
||||||
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, jboolean mount_storage_dirs) {
|
|
||||||
pre_spec();
|
|
||||||
orig_spec(r_dp3, 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,
|
|
||||||
mount_storage_dirs);
|
|
||||||
post_spec();
|
|
||||||
}
|
|
||||||
#endif // ENABLE_LEGACY_DP
|
|
||||||
|
|
||||||
DCL_SPECIALIZE_APP(r,
|
|
||||||
"(II[II[[IILjava/lang/String;Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;Z[Ljava/lang/String;[Ljava/lang/String;ZZ)V",
|
|
||||||
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) {
|
|
||||||
pre_spec();
|
|
||||||
orig_spec(r, 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);
|
|
||||||
post_spec();
|
|
||||||
}
|
|
||||||
|
|
||||||
DCL_SPECIALIZE_APP(samsung_q,
|
|
||||||
"(II[II[[IILjava/lang/String;IILjava/lang/String;ZLjava/lang/String;Ljava/lang/String;)V",
|
|
||||||
JNIEnv *env, jclass clazz, jint uid, jint gid, jintArray gids, jint runtime_flags,
|
|
||||||
jobjectArray rlimits, jint mount_external, jstring se_info, jint space, jint accessInfo,
|
|
||||||
jstring nice_name, jboolean is_child_zygote, jstring instruction_set, jstring app_data_dir) {
|
|
||||||
pre_spec();
|
|
||||||
orig_spec(samsung_q, env, clazz, uid, gid, gids, runtime_flags, rlimits, mount_external,
|
|
||||||
se_info, space, accessInfo, nice_name, is_child_zygote, instruction_set, app_data_dir);
|
|
||||||
post_spec();
|
|
||||||
}
|
|
||||||
|
|
||||||
#define DEF_SPEC(ver) { \
|
|
||||||
"nativeSpecializeAppProcess", \
|
|
||||||
nativeSpecializeAppProcess_##ver##_sig, \
|
|
||||||
(void *) &nativeSpecializeAppProcess_##ver \
|
|
||||||
}
|
|
||||||
|
|
||||||
// -----------------------------------------------------------------
|
|
||||||
|
|
||||||
#define pre_server() \
|
|
||||||
HookContext ctx{}; \
|
|
||||||
memset(args_buf, 0, sizeof(args_buf)); \
|
|
||||||
nativeForkSystemServer_pre(&ctx, env, clazz, uid, gid, gids, runtime_flags, \
|
|
||||||
rlimits, permitted_capabilities, effective_capabilities)
|
|
||||||
|
|
||||||
#define orig_server(ver, ...) \
|
|
||||||
reinterpret_cast<decltype(&nativeForkSystemServer_##ver)> \
|
|
||||||
(nativeForkSystemServer_orig().fnPtr)(__VA_ARGS__)
|
|
||||||
|
|
||||||
#define post_server() \
|
|
||||||
nativeForkSystemServer_post(&ctx, env, clazz); \
|
|
||||||
return ctx.pid
|
|
||||||
|
|
||||||
#define DCL_FORK_SERVER(ver, sig, ...) \
|
|
||||||
DCL_JNI(jint, nativeForkSystemServer_##ver, sig, __VA_ARGS__)
|
|
||||||
|
|
||||||
DCL_FORK_SERVER(m, "(II[II[[IJJ)I",
|
|
||||||
JNIEnv *env, jclass clazz, uid_t uid, gid_t gid, jintArray gids, jint runtime_flags,
|
|
||||||
jobjectArray rlimits, jlong permitted_capabilities, jlong effective_capabilities) {
|
|
||||||
pre_server();
|
|
||||||
orig_server(m, env, clazz, uid, gid, gids, runtime_flags, rlimits, permitted_capabilities,
|
|
||||||
effective_capabilities);
|
|
||||||
post_server();
|
|
||||||
}
|
|
||||||
|
|
||||||
DCL_FORK_SERVER(samsung_q, "(II[IIII[[IJJ)I",
|
|
||||||
JNIEnv *env, jclass clazz, uid_t uid, gid_t gid, jintArray gids, jint runtime_flags,
|
|
||||||
jint space, jint accessInfo, jobjectArray rlimits, jlong permitted_capabilities,
|
|
||||||
jlong effective_capabilities) {
|
|
||||||
pre_server();
|
|
||||||
orig_server(samsung_q, env, clazz, uid, gid, gids, runtime_flags, space, accessInfo, rlimits,
|
|
||||||
permitted_capabilities, effective_capabilities);
|
|
||||||
post_server();
|
|
||||||
}
|
|
||||||
|
|
||||||
#define DEF_SERVER(ver) { \
|
|
||||||
"nativeForkSystemServer", \
|
|
||||||
nativeForkSystemServer_##ver##_sig, \
|
|
||||||
(void *) &nativeForkSystemServer_##ver \
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
const JNINativeMethod nativeForkAndSpecialize_methods[] = {
|
const JNINativeMethod nativeForkAndSpecialize_methods[] = {
|
||||||
DEF_FORK(m), DEF_FORK(o), DEF_FORK(p),
|
{
|
||||||
DEF_FORK(q_alt), DEF_FORK(r),
|
"nativeForkAndSpecialize",
|
||||||
DEF_FORK(samsung_m), DEF_FORK(samsung_n),
|
"(II[II[[IILjava/lang/String;Ljava/lang/String;[ILjava/lang/String;Ljava/lang/String;)I",
|
||||||
DEF_FORK(samsung_o), DEF_FORK(samsung_p),
|
(void *) &nativeForkAndSpecialize_m
|
||||||
#if ENABLE_LEGACY_DP
|
},
|
||||||
DEF_FORK(r_dp2), DEF_FORK(r_dp3)
|
{
|
||||||
#endif
|
"nativeForkAndSpecialize",
|
||||||
|
"(II[II[[IILjava/lang/String;Ljava/lang/String;[I[ILjava/lang/String;Ljava/lang/String;)I",
|
||||||
|
(void *) &nativeForkAndSpecialize_o
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nativeForkAndSpecialize",
|
||||||
|
"(II[II[[IILjava/lang/String;Ljava/lang/String;[I[IZLjava/lang/String;Ljava/lang/String;)I",
|
||||||
|
(void *) &nativeForkAndSpecialize_p
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nativeForkAndSpecialize",
|
||||||
|
"(II[II[[IILjava/lang/String;Ljava/lang/String;[I[IZLjava/lang/String;Ljava/lang/String;Z)I",
|
||||||
|
(void *) &nativeForkAndSpecialize_q_alt
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nativeForkAndSpecialize",
|
||||||
|
"(II[II[[IILjava/lang/String;Ljava/lang/String;[I[IZLjava/lang/String;Ljava/lang/String;Z[Ljava/lang/String;[Ljava/lang/String;ZZ)I",
|
||||||
|
(void *) &nativeForkAndSpecialize_r
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nativeForkAndSpecialize",
|
||||||
|
"(II[II[[IILjava/lang/String;IILjava/lang/String;[ILjava/lang/String;Ljava/lang/String;)I",
|
||||||
|
(void *) &nativeForkAndSpecialize_samsung_m
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nativeForkAndSpecialize",
|
||||||
|
"(II[II[[IILjava/lang/String;IILjava/lang/String;[ILjava/lang/String;Ljava/lang/String;I)I",
|
||||||
|
(void *) &nativeForkAndSpecialize_samsung_n
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nativeForkAndSpecialize",
|
||||||
|
"(II[II[[IILjava/lang/String;IILjava/lang/String;[I[ILjava/lang/String;Ljava/lang/String;)I",
|
||||||
|
(void *) &nativeForkAndSpecialize_samsung_o
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nativeForkAndSpecialize",
|
||||||
|
"(II[II[[IILjava/lang/String;IILjava/lang/String;[I[IZLjava/lang/String;Ljava/lang/String;)I",
|
||||||
|
(void *) &nativeForkAndSpecialize_samsung_p
|
||||||
|
},
|
||||||
};
|
};
|
||||||
const int nativeForkAndSpecialize_methods_num = std::size(nativeForkAndSpecialize_methods);
|
const int nativeForkAndSpecialize_methods_num = std::size(nativeForkAndSpecialize_methods);
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
static 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) {
|
||||||
|
HookContext ctx{};
|
||||||
|
SpecializeAppProcessArgs args(uid, gid, gids, runtime_flags, mount_external, se_info, nice_name, instruction_set, app_data_dir);
|
||||||
|
args.is_child_zygote = &is_child_zygote;
|
||||||
|
ctx.raw_args = &args;
|
||||||
|
nativeSpecializeAppProcess_pre(&ctx, env, clazz);
|
||||||
|
reinterpret_cast<decltype(&nativeSpecializeAppProcess_q)>(nativeSpecializeAppProcess_orig)(
|
||||||
|
env, clazz, uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, nice_name, is_child_zygote, instruction_set, app_data_dir
|
||||||
|
);
|
||||||
|
nativeSpecializeAppProcess_post(&ctx, env, clazz);
|
||||||
|
}
|
||||||
|
static 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) {
|
||||||
|
HookContext ctx{};
|
||||||
|
SpecializeAppProcessArgs args(uid, gid, gids, runtime_flags, 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;
|
||||||
|
ctx.raw_args = &args;
|
||||||
|
nativeSpecializeAppProcess_pre(&ctx, env, clazz);
|
||||||
|
reinterpret_cast<decltype(&nativeSpecializeAppProcess_q_alt)>(nativeSpecializeAppProcess_orig)(
|
||||||
|
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
|
||||||
|
);
|
||||||
|
nativeSpecializeAppProcess_post(&ctx, env, clazz);
|
||||||
|
}
|
||||||
|
static 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) {
|
||||||
|
HookContext ctx{};
|
||||||
|
SpecializeAppProcessArgs args(uid, gid, gids, runtime_flags, 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;
|
||||||
|
args.whitelisted_data_info_list = &whitelisted_data_info_list;
|
||||||
|
args.mount_data_dirs = &mount_data_dirs;
|
||||||
|
args.mount_storage_dirs = &mount_storage_dirs;
|
||||||
|
ctx.raw_args = &args;
|
||||||
|
nativeSpecializeAppProcess_pre(&ctx, env, clazz);
|
||||||
|
reinterpret_cast<decltype(&nativeSpecializeAppProcess_r)>(nativeSpecializeAppProcess_orig)(
|
||||||
|
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
|
||||||
|
);
|
||||||
|
nativeSpecializeAppProcess_post(&ctx, env, clazz);
|
||||||
|
}
|
||||||
|
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 i1, jint i2, jstring nice_name, jboolean is_child_zygote, jstring instruction_set, jstring app_data_dir) {
|
||||||
|
HookContext ctx{};
|
||||||
|
SpecializeAppProcessArgs args(uid, gid, gids, runtime_flags, mount_external, se_info, nice_name, instruction_set, app_data_dir);
|
||||||
|
args.is_child_zygote = &is_child_zygote;
|
||||||
|
ctx.raw_args = &args;
|
||||||
|
nativeSpecializeAppProcess_pre(&ctx, env, clazz);
|
||||||
|
reinterpret_cast<decltype(&nativeSpecializeAppProcess_samsung_q)>(nativeSpecializeAppProcess_orig)(
|
||||||
|
env, clazz, uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, i1, i2, nice_name, is_child_zygote, instruction_set, app_data_dir
|
||||||
|
);
|
||||||
|
nativeSpecializeAppProcess_post(&ctx, env, clazz);
|
||||||
|
}
|
||||||
|
namespace {
|
||||||
const JNINativeMethod nativeSpecializeAppProcess_methods[] = {
|
const JNINativeMethod nativeSpecializeAppProcess_methods[] = {
|
||||||
DEF_SPEC(q), DEF_SPEC(q_alt),
|
{
|
||||||
DEF_SPEC(r), DEF_SPEC(samsung_q),
|
"nativeSpecializeAppProcess",
|
||||||
#if ENABLE_LEGACY_DP
|
"(II[II[[IILjava/lang/String;Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;)V",
|
||||||
DEF_SPEC(r_dp2), DEF_SPEC(r_dp3)
|
(void *) &nativeSpecializeAppProcess_q
|
||||||
#endif
|
},
|
||||||
|
{
|
||||||
|
"nativeSpecializeAppProcess",
|
||||||
|
"(II[II[[IILjava/lang/String;Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;Z)V",
|
||||||
|
(void *) &nativeSpecializeAppProcess_q_alt
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nativeSpecializeAppProcess",
|
||||||
|
"(II[II[[IILjava/lang/String;Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;Z[Ljava/lang/String;[Ljava/lang/String;ZZ)V",
|
||||||
|
(void *) &nativeSpecializeAppProcess_r
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nativeSpecializeAppProcess",
|
||||||
|
"(II[II[[IILjava/lang/String;IILjava/lang/String;ZLjava/lang/String;Ljava/lang/String;)V",
|
||||||
|
(void *) &nativeSpecializeAppProcess_samsung_q
|
||||||
|
},
|
||||||
};
|
};
|
||||||
const int nativeSpecializeAppProcess_methods_num = std::size(nativeSpecializeAppProcess_methods);
|
const int nativeSpecializeAppProcess_methods_num = std::size(nativeSpecializeAppProcess_methods);
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
static jint nativeForkSystemServer_m(JNIEnv *env, jclass clazz, jint uid, jint gid, jintArray gids, jint runtime_flags, jobjectArray rlimits, jlong permitted_capabilities, jlong effective_capabilities) {
|
||||||
|
HookContext ctx{};
|
||||||
|
ForkSystemServerArgs args(uid, gid, gids, runtime_flags, permitted_capabilities, effective_capabilities);
|
||||||
|
ctx.raw_args = &args;
|
||||||
|
nativeForkSystemServer_pre(&ctx, env, clazz);
|
||||||
|
reinterpret_cast<decltype(&nativeForkSystemServer_m)>(nativeForkSystemServer_orig)(
|
||||||
|
env, clazz, uid, gid, gids, runtime_flags, rlimits, permitted_capabilities, effective_capabilities
|
||||||
|
);
|
||||||
|
nativeForkSystemServer_post(&ctx, env, clazz);
|
||||||
|
return ctx.pid;
|
||||||
|
}
|
||||||
|
static jint nativeForkSystemServer_samsung_q(JNIEnv *env, jclass clazz, jint uid, jint gid, jintArray gids, jint runtime_flags, jint i1, jint i2, jobjectArray rlimits, jlong permitted_capabilities, jlong effective_capabilities) {
|
||||||
|
HookContext ctx{};
|
||||||
|
ForkSystemServerArgs args(uid, gid, gids, runtime_flags, permitted_capabilities, effective_capabilities);
|
||||||
|
ctx.raw_args = &args;
|
||||||
|
nativeForkSystemServer_pre(&ctx, env, clazz);
|
||||||
|
reinterpret_cast<decltype(&nativeForkSystemServer_samsung_q)>(nativeForkSystemServer_orig)(
|
||||||
|
env, clazz, uid, gid, gids, runtime_flags, i1, i2, rlimits, permitted_capabilities, effective_capabilities
|
||||||
|
);
|
||||||
|
nativeForkSystemServer_post(&ctx, env, clazz);
|
||||||
|
return ctx.pid;
|
||||||
|
}
|
||||||
|
namespace {
|
||||||
const JNINativeMethod nativeForkSystemServer_methods[] = {
|
const JNINativeMethod nativeForkSystemServer_methods[] = {
|
||||||
DEF_SERVER(m), DEF_SERVER(samsung_q)
|
{
|
||||||
|
"nativeForkSystemServer",
|
||||||
|
"(II[II[[IJJ)I",
|
||||||
|
(void *) &nativeForkSystemServer_m
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nativeForkSystemServer",
|
||||||
|
"(II[IIII[[IJJ)I",
|
||||||
|
(void *) &nativeForkSystemServer_samsung_q
|
||||||
|
},
|
||||||
};
|
};
|
||||||
const int nativeForkSystemServer_methods_num = std::size(nativeForkSystemServer_methods);
|
const int nativeForkSystemServer_methods_num = std::size(nativeForkSystemServer_methods);
|
||||||
|
} // namespace
|
||||||
}
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user