@@ -440,6 +440,42 @@ static struct kprobe *pts_kp = NULL;
|
|||||||
|
|
||||||
#ifdef CONFIG_KRETPROBES
|
#ifdef CONFIG_KRETPROBES
|
||||||
|
|
||||||
|
static struct kretprobe *init_kretprobe(const char *name,
|
||||||
|
kretprobe_handler_t handler)
|
||||||
|
{
|
||||||
|
struct kretprobe *rp = kzalloc(sizeof(struct kretprobe), GFP_KERNEL);
|
||||||
|
if (!rp)
|
||||||
|
return NULL;
|
||||||
|
rp->kp.symbol_name = name;
|
||||||
|
rp->handler = handler;
|
||||||
|
rp->data_size = 0;
|
||||||
|
rp->maxactive = 0;
|
||||||
|
|
||||||
|
int ret = register_kretprobe(rp);
|
||||||
|
pr_info("sucompat: register_%s kretprobe: %d\n", name, ret);
|
||||||
|
if (ret) {
|
||||||
|
kfree(rp);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return rp;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void destroy_kretprobe(struct kretprobe **rp_ptr)
|
||||||
|
{
|
||||||
|
struct kretprobe *rp = *rp_ptr;
|
||||||
|
if (!rp)
|
||||||
|
return;
|
||||||
|
unregister_kretprobe(rp);
|
||||||
|
synchronize_rcu();
|
||||||
|
kfree(rp);
|
||||||
|
*rp_ptr = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_KRETPROBES
|
||||||
|
|
||||||
static int tracepoint_reg_count = 0;
|
static int tracepoint_reg_count = 0;
|
||||||
static DEFINE_SPINLOCK(tracepoint_reg_lock);
|
static DEFINE_SPINLOCK(tracepoint_reg_lock);
|
||||||
|
|
||||||
@@ -477,21 +513,8 @@ static int syscall_unregfunc_handler(struct kretprobe_instance *ri, struct pt_re
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct kretprobe syscall_regfunc_rp = {
|
static struct kretprobe *syscall_regfunc_rp = NULL;
|
||||||
.kp.symbol_name = "syscall_regfunc",
|
static struct kretprobe *syscall_unregfunc_rp = NULL;
|
||||||
.handler = syscall_regfunc_handler,
|
|
||||||
.entry_handler = NULL,
|
|
||||||
.data_size = 0,
|
|
||||||
.maxactive = 0,
|
|
||||||
};
|
|
||||||
|
|
||||||
struct kretprobe syscall_unregfunc_rp = {
|
|
||||||
.kp.symbol_name = "syscall_unregfunc",
|
|
||||||
.handler = syscall_unregfunc_handler,
|
|
||||||
.entry_handler = NULL,
|
|
||||||
.data_size = 0,
|
|
||||||
.maxactive = 0,
|
|
||||||
};
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void ksu_sucompat_enable()
|
void ksu_sucompat_enable()
|
||||||
@@ -505,22 +528,13 @@ void ksu_sucompat_enable()
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_KRETPROBES
|
#ifdef CONFIG_KRETPROBES
|
||||||
ret = register_kretprobe(&syscall_regfunc_rp);
|
// Register kretprobe for syscall_regfunc
|
||||||
if (ret) {
|
syscall_regfunc_rp = init_kretprobe("syscall_regfunc", syscall_regfunc_handler);
|
||||||
pr_err("sucompat: failed to register syscall_regfunc kretprobe: %d\n", ret);
|
// Register kretprobe for syscall_unregfunc
|
||||||
} else {
|
syscall_unregfunc_rp = init_kretprobe("syscall_unregfunc", syscall_unregfunc_handler);
|
||||||
pr_info("sucompat: syscall_regfunc kretprobe registered\n");
|
|
||||||
}
|
|
||||||
ret = register_kretprobe(&syscall_unregfunc_rp);
|
|
||||||
if (ret) {
|
|
||||||
pr_err("sucompat: failed to register syscall_unregfunc kretprobe: %d\n", ret);
|
|
||||||
} else {
|
|
||||||
pr_info("sucompat: syscall_unregfunc kretprobe registered\n");
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef KSU_HAVE_SYSCALL_TRACEPOINTS_HOOK
|
#ifdef KSU_HAVE_SYSCALL_TRACEPOINTS_HOOK
|
||||||
// Register sys_enter tracepoint for syscall interception
|
|
||||||
ret = register_trace_sys_enter(sucompat_sys_enter_handler, NULL);
|
ret = register_trace_sys_enter(sucompat_sys_enter_handler, NULL);
|
||||||
#ifndef CONFIG_KRETPROBES
|
#ifndef CONFIG_KRETPROBES
|
||||||
unmark_all_process();
|
unmark_all_process();
|
||||||
@@ -541,7 +555,6 @@ void ksu_sucompat_disable()
|
|||||||
{
|
{
|
||||||
pr_info("sucompat: ksu_sucompat_disable called\n");
|
pr_info("sucompat: ksu_sucompat_disable called\n");
|
||||||
#ifdef KSU_HAVE_SYSCALL_TRACEPOINTS_HOOK
|
#ifdef KSU_HAVE_SYSCALL_TRACEPOINTS_HOOK
|
||||||
// Unregister sys_enter tracepoint
|
|
||||||
unregister_trace_sys_enter(sucompat_sys_enter_handler, NULL);
|
unregister_trace_sys_enter(sucompat_sys_enter_handler, NULL);
|
||||||
tracepoint_synchronize_unregister();
|
tracepoint_synchronize_unregister();
|
||||||
pr_info("sucompat: sys_enter tracepoint unregistered\n");
|
pr_info("sucompat: sys_enter tracepoint unregistered\n");
|
||||||
@@ -551,16 +564,11 @@ void ksu_sucompat_disable()
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_KRETPROBES
|
#ifdef CONFIG_KRETPROBES
|
||||||
// Unregister syscall_regfunc kretprobe
|
destroy_kretprobe(&syscall_regfunc_rp);
|
||||||
unregister_kretprobe(&syscall_regfunc_rp);
|
destroy_kretprobe(&syscall_unregfunc_rp);
|
||||||
pr_info("sucompat: syscall_regfunc kretprobe unregistered\n");
|
|
||||||
// Unregister syscall_unregfunc kretprobe
|
|
||||||
unregister_kretprobe(&syscall_unregfunc_rp);
|
|
||||||
pr_info("sucompat: syscall_unregfunc kretprobe unregistered\n");
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef KSU_KPROBES_HOOK
|
#ifdef KSU_KPROBES_HOOK
|
||||||
// Unregister pts_unix98_lookup kprobe
|
|
||||||
destroy_kprobe(&pts_kp);
|
destroy_kprobe(&pts_kp);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user