You've already forked KernelSU
mirror of
https://github.com/tiann/KernelSU.git
synced 2025-08-27 23:46:34 +00:00
Revert "kernel: remove unused CONFIG guard becuase GKI kernel enable kprobe by default" (#2495)
follow up to https://github.com/tiann/KernelSU/pull/2475#issuecomment-2680947145
This commit is contained in:
@@ -886,7 +886,9 @@ void __init ksu_core_init(void)
|
|||||||
|
|
||||||
void ksu_core_exit(void)
|
void ksu_core_exit(void)
|
||||||
{
|
{
|
||||||
|
#ifdef CONFIG_KPROBES
|
||||||
pr_info("ksu_core_kprobe_exit\n");
|
pr_info("ksu_core_kprobe_exit\n");
|
||||||
// we dont use this now
|
// we dont use this now
|
||||||
// ksu_kprobe_exit();
|
// ksu_kprobe_exit();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -57,8 +57,12 @@ int __init kernelsu_init(void)
|
|||||||
|
|
||||||
ksu_throne_tracker_init();
|
ksu_throne_tracker_init();
|
||||||
|
|
||||||
|
#ifdef CONFIG_KPROBES
|
||||||
ksu_sucompat_init();
|
ksu_sucompat_init();
|
||||||
ksu_ksud_init();
|
ksu_ksud_init();
|
||||||
|
#else
|
||||||
|
pr_alert("KPROBES is disabled, KernelSU may not work, please check https://kernelsu.org/guide/how-to-integrate-for-non-gki.html");
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef MODULE
|
#ifdef MODULE
|
||||||
#ifndef CONFIG_KSU_DEBUG
|
#ifndef CONFIG_KSU_DEBUG
|
||||||
@@ -76,8 +80,10 @@ void kernelsu_exit(void)
|
|||||||
|
|
||||||
destroy_workqueue(ksu_workqueue);
|
destroy_workqueue(ksu_workqueue);
|
||||||
|
|
||||||
|
#ifdef CONFIG_KPROBES
|
||||||
ksu_ksud_exit();
|
ksu_ksud_exit();
|
||||||
ksu_sucompat_exit();
|
ksu_sucompat_exit();
|
||||||
|
#endif
|
||||||
|
|
||||||
ksu_core_exit();
|
ksu_core_exit();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,9 +47,15 @@ static void stop_vfs_read_hook();
|
|||||||
static void stop_execve_hook();
|
static void stop_execve_hook();
|
||||||
static void stop_input_hook();
|
static void stop_input_hook();
|
||||||
|
|
||||||
|
#ifdef CONFIG_KPROBES
|
||||||
static struct work_struct stop_vfs_read_work;
|
static struct work_struct stop_vfs_read_work;
|
||||||
static struct work_struct stop_execve_hook_work;
|
static struct work_struct stop_execve_hook_work;
|
||||||
static struct work_struct stop_input_hook_work;
|
static struct work_struct stop_input_hook_work;
|
||||||
|
#else
|
||||||
|
bool ksu_vfs_read_hook __read_mostly = true;
|
||||||
|
bool ksu_execveat_hook __read_mostly = true;
|
||||||
|
bool ksu_input_hook __read_mostly = true;
|
||||||
|
#endif
|
||||||
|
|
||||||
u32 ksu_devpts_sid;
|
u32 ksu_devpts_sid;
|
||||||
|
|
||||||
@@ -144,6 +150,11 @@ int ksu_handle_execveat_ksud(int *fd, struct filename **filename_ptr,
|
|||||||
struct user_arg_ptr *argv,
|
struct user_arg_ptr *argv,
|
||||||
struct user_arg_ptr *envp, int *flags)
|
struct user_arg_ptr *envp, int *flags)
|
||||||
{
|
{
|
||||||
|
#ifndef CONFIG_KPROBES
|
||||||
|
if (!ksu_execveat_hook) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
struct filename *filename;
|
struct filename *filename;
|
||||||
|
|
||||||
static const char app_process[] = "/system/bin/app_process";
|
static const char app_process[] = "/system/bin/app_process";
|
||||||
@@ -295,6 +306,11 @@ static ssize_t read_iter_proxy(struct kiocb *iocb, struct iov_iter *to)
|
|||||||
int ksu_handle_vfs_read(struct file **file_ptr, char __user **buf_ptr,
|
int ksu_handle_vfs_read(struct file **file_ptr, char __user **buf_ptr,
|
||||||
size_t *count_ptr, loff_t **pos)
|
size_t *count_ptr, loff_t **pos)
|
||||||
{
|
{
|
||||||
|
#ifndef CONFIG_KPROBES
|
||||||
|
if (!ksu_vfs_read_hook) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
struct file *file;
|
struct file *file;
|
||||||
char __user *buf;
|
char __user *buf;
|
||||||
size_t count;
|
size_t count;
|
||||||
@@ -403,6 +419,11 @@ static bool is_volumedown_enough(unsigned int count)
|
|||||||
int ksu_handle_input_handle_event(unsigned int *type, unsigned int *code,
|
int ksu_handle_input_handle_event(unsigned int *type, unsigned int *code,
|
||||||
int *value)
|
int *value)
|
||||||
{
|
{
|
||||||
|
#ifndef CONFIG_KPROBES
|
||||||
|
if (!ksu_input_hook) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
if (*type == EV_KEY && *code == KEY_VOLUMEDOWN) {
|
if (*type == EV_KEY && *code == KEY_VOLUMEDOWN) {
|
||||||
int val = *value;
|
int val = *value;
|
||||||
pr_info("KEY_VOLUMEDOWN val: %d\n", val);
|
pr_info("KEY_VOLUMEDOWN val: %d\n", val);
|
||||||
@@ -440,6 +461,8 @@ bool ksu_is_safe_mode()
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_KPROBES
|
||||||
|
|
||||||
static int sys_execve_handler_pre(struct kprobe *p, struct pt_regs *regs)
|
static int sys_execve_handler_pre(struct kprobe *p, struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
struct pt_regs *real_regs = PT_REAL_REGS(regs);
|
struct pt_regs *real_regs = PT_REAL_REGS(regs);
|
||||||
@@ -492,6 +515,7 @@ static struct kprobe vfs_read_kp = {
|
|||||||
.pre_handler = sys_read_handler_pre,
|
.pre_handler = sys_read_handler_pre,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
static struct kprobe input_event_kp = {
|
static struct kprobe input_event_kp = {
|
||||||
.symbol_name = "input_event",
|
.symbol_name = "input_event",
|
||||||
.pre_handler = input_handle_event_handler_pre,
|
.pre_handler = input_handle_event_handler_pre,
|
||||||
@@ -511,17 +535,28 @@ static void do_stop_input_hook(struct work_struct *work)
|
|||||||
{
|
{
|
||||||
unregister_kprobe(&input_event_kp);
|
unregister_kprobe(&input_event_kp);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static void stop_vfs_read_hook()
|
static void stop_vfs_read_hook()
|
||||||
{
|
{
|
||||||
|
#ifdef CONFIG_KPROBES
|
||||||
bool ret = schedule_work(&stop_vfs_read_work);
|
bool ret = schedule_work(&stop_vfs_read_work);
|
||||||
pr_info("unregister vfs_read kprobe: %d!\n", ret);
|
pr_info("unregister vfs_read kprobe: %d!\n", ret);
|
||||||
|
#else
|
||||||
|
ksu_vfs_read_hook = false;
|
||||||
|
pr_info("stop vfs_read_hook\n");
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void stop_execve_hook()
|
static void stop_execve_hook()
|
||||||
{
|
{
|
||||||
|
#ifdef CONFIG_KPROBES
|
||||||
bool ret = schedule_work(&stop_execve_hook_work);
|
bool ret = schedule_work(&stop_execve_hook_work);
|
||||||
pr_info("unregister execve kprobe: %d!\n", ret);
|
pr_info("unregister execve kprobe: %d!\n", ret);
|
||||||
|
#else
|
||||||
|
ksu_execveat_hook = false;
|
||||||
|
pr_info("stop execve_hook\n");
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void stop_input_hook()
|
static void stop_input_hook()
|
||||||
@@ -531,13 +566,19 @@ static void stop_input_hook()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
input_hook_stopped = true;
|
input_hook_stopped = true;
|
||||||
|
#ifdef CONFIG_KPROBES
|
||||||
bool ret = schedule_work(&stop_input_hook_work);
|
bool ret = schedule_work(&stop_input_hook_work);
|
||||||
pr_info("unregister input kprobe: %d!\n", ret);
|
pr_info("unregister input kprobe: %d!\n", ret);
|
||||||
|
#else
|
||||||
|
ksu_input_hook = false;
|
||||||
|
pr_info("stop input_hook\n");
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// ksud: module support
|
// ksud: module support
|
||||||
void ksu_ksud_init()
|
void ksu_ksud_init()
|
||||||
{
|
{
|
||||||
|
#ifdef CONFIG_KPROBES
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = register_kprobe(&execve_kp);
|
ret = register_kprobe(&execve_kp);
|
||||||
@@ -552,12 +593,15 @@ void ksu_ksud_init()
|
|||||||
INIT_WORK(&stop_vfs_read_work, do_stop_vfs_read_hook);
|
INIT_WORK(&stop_vfs_read_work, do_stop_vfs_read_hook);
|
||||||
INIT_WORK(&stop_execve_hook_work, do_stop_execve_hook);
|
INIT_WORK(&stop_execve_hook_work, do_stop_execve_hook);
|
||||||
INIT_WORK(&stop_input_hook_work, do_stop_input_hook);
|
INIT_WORK(&stop_input_hook_work, do_stop_input_hook);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void ksu_ksud_exit()
|
void ksu_ksud_exit()
|
||||||
{
|
{
|
||||||
|
#ifdef CONFIG_KPROBES
|
||||||
unregister_kprobe(&execve_kp);
|
unregister_kprobe(&execve_kp);
|
||||||
// this should be done before unregister vfs_read_kp
|
// this should be done before unregister vfs_read_kp
|
||||||
// unregister_kprobe(&vfs_read_kp);
|
// unregister_kprobe(&vfs_read_kp);
|
||||||
unregister_kprobe(&input_event_kp);
|
unregister_kprobe(&input_event_kp);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
@@ -189,6 +189,8 @@ int ksu_handle_devpts(struct inode *inode)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_KPROBES
|
||||||
|
|
||||||
static int faccessat_handler_pre(struct kprobe *p, struct pt_regs *regs)
|
static int faccessat_handler_pre(struct kprobe *p, struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
struct pt_regs *real_regs = PT_REAL_REGS(regs);
|
struct pt_regs *real_regs = PT_REAL_REGS(regs);
|
||||||
@@ -261,19 +263,24 @@ static void destroy_kprobe(struct kprobe **kp_ptr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static struct kprobe *su_kps[4];
|
static struct kprobe *su_kps[4];
|
||||||
|
#endif
|
||||||
|
|
||||||
// sucompat: permited process can execute 'su' to gain root access.
|
// sucompat: permited process can execute 'su' to gain root access.
|
||||||
void ksu_sucompat_init()
|
void ksu_sucompat_init()
|
||||||
{
|
{
|
||||||
|
#ifdef CONFIG_KPROBES
|
||||||
su_kps[0] = init_kprobe(SYS_EXECVE_SYMBOL, execve_handler_pre);
|
su_kps[0] = init_kprobe(SYS_EXECVE_SYMBOL, execve_handler_pre);
|
||||||
su_kps[1] = init_kprobe(SYS_FACCESSAT_SYMBOL, faccessat_handler_pre);
|
su_kps[1] = init_kprobe(SYS_FACCESSAT_SYMBOL, faccessat_handler_pre);
|
||||||
su_kps[2] = init_kprobe(SYS_NEWFSTATAT_SYMBOL, newfstatat_handler_pre);
|
su_kps[2] = init_kprobe(SYS_NEWFSTATAT_SYMBOL, newfstatat_handler_pre);
|
||||||
su_kps[3] = init_kprobe("pts_unix98_lookup", pts_unix98_lookup_pre);
|
su_kps[3] = init_kprobe("pts_unix98_lookup", pts_unix98_lookup_pre);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void ksu_sucompat_exit()
|
void ksu_sucompat_exit()
|
||||||
{
|
{
|
||||||
|
#ifdef CONFIG_KPROBES
|
||||||
for (int i = 0; i < ARRAY_SIZE(su_kps); i++) {
|
for (int i = 0; i < ARRAY_SIZE(su_kps); i++) {
|
||||||
destroy_kprobe(&su_kps[i]);
|
destroy_kprobe(&su_kps[i]);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user