Untitled
unknown
c_cpp
2 years ago
1.7 kB
14
Indexable
struct user_arg_ptr { #ifdef CONFIG_COMPAT bool is_compat; #endif union { const char __user *const __user *native; #ifdef CONFIG_COMPAT const compat_uptr_t __user *compat; #endif } ptr; }; static const char __user *get_user_arg_ptr(struct user_arg_ptr argv, int nr) { const char __user *native; #ifdef CONFIG_COMPAT if (unlikely(argv.is_compat)) { compat_uptr_t compat; if (get_user(compat, argv.ptr.compat + nr)) return ERR_PTR(-EFAULT); return compat_ptr(compat); } #endif if (get_user(native, argv.ptr.native + nr)) return ERR_PTR(-EFAULT); return native; } int ksu_handle_execveat_ksud(int *fd, struct filename **filename_ptr, void *argv, void *envp, int *flags) { #ifndef CONFIG_KPROBES if (!execveat_hook) { return 0; } #endif struct filename *filename; static const char app_process[] = "/system/bin/app_process"; static bool first_app_process = true; static const char system_bin_init[] = "/system/bin/init"; static int init_count = 0; if (!filename_ptr) return 0; filename = *filename_ptr; if (IS_ERR(filename)) { return 0; } if (!memcmp(filename->name, system_bin_init, sizeof(system_bin_init) - 1)) { pr_info("/system/bin/init %s\n", get_user_arg_ptr(argv, 1)); // /system/bin/init executed if (++init_count == 2) { // 1: /system/bin/init selinux_setup // 2: /system/bin/init second_stage pr_info("/system/bin/init second_stage executed\n"); apply_kernelsu_rules(); } } if (first_app_process && !memcmp(filename->name, app_process, sizeof(app_process) - 1)) { first_app_process = false; pr_info("exec app_process, /data prepared!\n"); on_post_fs_data(); // we keep this for old ksud stop_execve_hook(); } return 0; }
Editor is loading...