From f9826838259e2a5ed20237b35f55eb64cd223b47 Mon Sep 17 00:00:00 2001 From: weishu Date: Fri, 26 Apr 2024 13:25:10 +0800 Subject: [PATCH] kernel: refactor PR_REAL_REGS --- kernel/arch.h | 6 ++++++ kernel/core_hook.c | 6 +----- kernel/ksud.c | 12 ++---------- kernel/sucompat.c | 18 +++--------------- 4 files changed, 12 insertions(+), 30 deletions(-) diff --git a/kernel/arch.h b/kernel/arch.h index d6be6754..f671b51b 100644 --- a/kernel/arch.h +++ b/kernel/arch.h @@ -83,4 +83,10 @@ #define PT_REGS_SP(x) (__PT_REGS_CAST(x)->__PT_SP_REG) #define PT_REGS_IP(x) (__PT_REGS_CAST(x)->__PT_IP_REG) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 16, 0) +#define PT_REAL_REGS(regs) ((struct pt_regs *)PT_REGS_PARM1(regs)) +#else +#define PT_REAL_REGS(regs) ((regs)) +#endif + #endif diff --git a/kernel/core_hook.c b/kernel/core_hook.c index fef98df1..617c1bc8 100644 --- a/kernel/core_hook.c +++ b/kernel/core_hook.c @@ -542,11 +542,7 @@ int ksu_handle_setuid(struct cred *new, const struct cred *old) static int handler_pre(struct kprobe *p, struct pt_regs *regs) { -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 16, 0) - struct pt_regs *real_regs = (struct pt_regs *)PT_REGS_PARM1(regs); -#else - struct pt_regs *real_regs = regs; -#endif + struct pt_regs *real_regs = PT_REAL_REGS(regs); int option = (int)PT_REGS_PARM1(real_regs); unsigned long arg2 = (unsigned long)PT_REGS_PARM2(real_regs); unsigned long arg3 = (unsigned long)PT_REGS_PARM3(real_regs); diff --git a/kernel/ksud.c b/kernel/ksud.c index 20d7aa44..59171afa 100644 --- a/kernel/ksud.c +++ b/kernel/ksud.c @@ -474,11 +474,7 @@ static int execve_handler_pre(struct kprobe *p, struct pt_regs *regs) static int sys_execve_handler_pre(struct kprobe *p, struct pt_regs *regs) { -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 16, 0) - struct pt_regs *real_regs = (struct pt_regs *)PT_REGS_PARM1(regs); -#else - struct pt_regs *real_regs = regs; -#endif + struct pt_regs *real_regs = PT_REAL_REGS(regs); const char __user **filename_user = (const char **)&PT_REGS_PARM1(real_regs); const char __user *const __user *__argv = (const char __user *const __user *)PT_REGS_PARM2(real_regs); @@ -511,11 +507,7 @@ __maybe_unused static int vfs_read_handler_pre(struct kprobe *p, struct pt_regs static int sys_read_handler_pre(struct kprobe *p, struct pt_regs *regs) { -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 16, 0) - struct pt_regs *real_regs = (struct pt_regs *)PT_REGS_PARM1(regs); -#else - struct pt_regs *real_regs = regs; -#endif + struct pt_regs *real_regs = PT_REAL_REGS(regs); unsigned int fd = PT_REGS_PARM1(real_regs); char __user **buf_ptr = (char __user **)&PT_REGS_PARM2(real_regs); size_t count_ptr = (size_t *) &PT_REGS_PARM3(real_regs); diff --git a/kernel/sucompat.c b/kernel/sucompat.c index f4809d67..44f30982 100644 --- a/kernel/sucompat.c +++ b/kernel/sucompat.c @@ -178,11 +178,7 @@ __maybe_unused static int faccessat_handler_pre(struct kprobe *p, struct pt_regs static int sys_faccessat_handler_pre(struct kprobe *p, struct pt_regs *regs) { -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 16, 0) - struct pt_regs *real_regs = (struct pt_regs *)PT_REGS_PARM1(regs); -#else - struct pt_regs *real_regs = regs; -#endif + struct pt_regs *real_regs = PT_REAL_REGS(regs); int *dfd = (int *)&PT_REGS_PARM1(real_regs); const char __user **filename_user = (const char **)&PT_REGS_PARM2(real_regs); int *mode = (int *)&PT_REGS_PARM3(real_regs); @@ -207,11 +203,7 @@ __maybe_unused static int newfstatat_handler_pre(struct kprobe *p, struct pt_reg static int sys_newfstatat_handler_pre(struct kprobe *p, struct pt_regs *regs) { -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 16, 0) - struct pt_regs *real_regs = (struct pt_regs *)PT_REGS_PARM1(regs); -#else - struct pt_regs *real_regs = regs; -#endif + struct pt_regs *real_regs = PT_REAL_REGS(regs); int *dfd = (int *)&PT_REGS_PARM1(real_regs); const char __user **filename_user = (const char **)&PT_REGS_PARM2(real_regs); int *flags = (int *)&PT_REGS_SYSCALL_PARM4(real_regs); @@ -231,11 +223,7 @@ static int execve_handler_pre(struct kprobe *p, struct pt_regs *regs) static int sys_execve_handler_pre(struct kprobe *p, struct pt_regs *regs) { -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 16, 0) - struct pt_regs *real_regs = (struct pt_regs *)PT_REGS_PARM1(regs); -#else - struct pt_regs *real_regs = regs; -#endif + struct pt_regs *real_regs = PT_REAL_REGS(regs); const char __user **filename_user = (const char **)&PT_REGS_PARM1(real_regs); return ksu_handle_execve_sucompat(AT_FDCWD, filename_user, NULL, NULL, NULL);