From 858ec910fda7c261bb0f7231be7244b6bfaf3670 Mon Sep 17 00:00:00 2001 From: weishu Date: Sun, 24 Mar 2024 16:41:45 +0800 Subject: [PATCH] kernel: clean memory when exit --- kernel/core_hook.c | 6 +++++- kernel/ksu.c | 15 +++++++++++---- kernel/ksud.c | 11 ++++++++++- kernel/sucompat.c | 10 +++++++++- kernel/throne_tracker.c | 7 +++---- kernel/throne_tracker.h | 4 ++-- 6 files changed, 40 insertions(+), 13 deletions(-) diff --git a/kernel/core_hook.c b/kernel/core_hook.c index bdcc01af..69495ecc 100644 --- a/kernel/core_hook.c +++ b/kernel/core_hook.c @@ -838,5 +838,9 @@ void __init ksu_core_init(void) void ksu_core_exit(void) { - pr_info("ksu_kprobe_exit\n"); +#ifdef CONFIG_KPROBES + pr_info("ksu_core_kprobe_exit\n"); + // we dont use this now + // ksu_kprobe_exit(); +#endif } diff --git a/kernel/ksu.c b/kernel/ksu.c index 3a84e556..22d0672e 100644 --- a/kernel/ksu.c +++ b/kernel/ksu.c @@ -32,8 +32,10 @@ int ksu_handle_execveat(int *fd, struct filename **filename_ptr, void *argv, flags); } -extern void ksu_enable_sucompat(); -extern void ksu_enable_ksud(); +extern void ksu_sucompat_init(); +extern void ksu_sucompat_exit(); +extern void ksu_ksud_init(); +extern void ksu_ksud_exit(); int __init kernelsu_init(void) { @@ -56,8 +58,8 @@ int __init kernelsu_init(void) ksu_throne_tracker_init(); #ifdef CONFIG_KPROBES - ksu_enable_sucompat(); - ksu_enable_ksud(); + ksu_sucompat_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 @@ -78,6 +80,11 @@ void kernelsu_exit(void) destroy_workqueue(ksu_workqueue); +#ifdef CONFIG_KPROBES + ksu_ksud_exit(); + ksu_sucompat_exit(); +#endif + ksu_core_exit(); } diff --git a/kernel/ksud.c b/kernel/ksud.c index 08ab1575..f1ba3e2e 100644 --- a/kernel/ksud.c +++ b/kernel/ksud.c @@ -589,7 +589,7 @@ static void stop_input_hook() } // ksud: module support -void ksu_enable_ksud() +void ksu_ksud_init() { #ifdef CONFIG_KPROBES int ret; @@ -608,3 +608,12 @@ void ksu_enable_ksud() INIT_WORK(&stop_input_hook_work, do_stop_input_hook); #endif } + +void ksu_ksud_exit() { +#ifdef CONFIG_KPROBES + unregister_kprobe(&execve_kp); + // this should be done before unregister vfs_read_kp + // unregister_kprobe(&vfs_read_kp); + unregister_kprobe(&input_handle_event_kp); +#endif +} \ No newline at end of file diff --git a/kernel/sucompat.c b/kernel/sucompat.c index 50d9bfc6..56c430c4 100644 --- a/kernel/sucompat.c +++ b/kernel/sucompat.c @@ -242,7 +242,7 @@ static struct kprobe execve_kp = { #endif // sucompat: permited process can execute 'su' to gain root access. -void ksu_enable_sucompat() +void ksu_sucompat_init() { #ifdef CONFIG_KPROBES int ret; @@ -254,3 +254,11 @@ void ksu_enable_sucompat() pr_info("sucompat: faccessat_kp: %d\n", ret); #endif } + +void ksu_sucompat_exit() { +#ifdef CONFIG_KPROBES + unregister_kprobe(&execve_kp); + unregister_kprobe(&newfstatat_kp); + unregister_kprobe(&faccessat_kp); +#endif +} \ No newline at end of file diff --git a/kernel/throne_tracker.c b/kernel/throne_tracker.c index aa36c926..f726e4e0 100644 --- a/kernel/throne_tracker.c +++ b/kernel/throne_tracker.c @@ -308,13 +308,12 @@ void track_throne() ksu_queue_work(&ksu_update_uid_work); } -int ksu_throne_tracker_init() +void ksu_throne_tracker_init() { INIT_WORK(&ksu_update_uid_work, do_update_uid); - return 0; } -int ksu_throne_tracker_exit() +void ksu_throne_tracker_exit() { - return 0; + // nothing to do } diff --git a/kernel/throne_tracker.h b/kernel/throne_tracker.h index ff5770ad..5d7f4770 100644 --- a/kernel/throne_tracker.h +++ b/kernel/throne_tracker.h @@ -1,9 +1,9 @@ #ifndef __KSU_H_UID_OBSERVER #define __KSU_H_UID_OBSERVER -int ksu_throne_tracker_init(); +void ksu_throne_tracker_init(); -int ksu_throne_tracker_exit(); +void ksu_throne_tracker_exit(); void track_throne();