Я использую kprobe для перехвата openat2 и открытия, а также использую printk для параметров, но получается что я не могу получить ожидаемый результат (поскольку открываю файл в /home/user/file.txt)
мой код:
Код: Выделить всё
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
/*
** module macros
*/
MODULE_LICENSE("GPL");
MODULE_AUTHOR("sena");
MODULE_DESCRIPTION("hook openat2");
demo_sys_call_ptr_t *get_syscall_table(void);
int AuditOpen(const char * pathname,int flags,int ret);
int AuditOpenat(int dfd, const char * pathname, int flags, int ret);
void netlink_release(void);
void netlink_init(void);
static int sys_read_kprobe_pre_handler(struct kprobe *p, struct pt_regs *regs)
{
char filename[256];
if (regs->si) {
if (strncpy_from_user(filename, (char __user *)regs->si, sizeof(filename)) > 0) {
filename[sizeof(filename) - 1] = '\0';
if(strstr("home", "filename")){
pr_info("openat syscall: filename: %s\n", filename);
}
} else {
pr_info("strncpy_from_user failed\n");
}
} else {
pr_info("regs->si is NULL\n");
}
return 0;
}
struct kprobe syscall_kprobe = {
.symbol_name = "do_sys_openat2",
.pre_handler = sys_read_kprobe_pre_handler,
};
static int __init audit_init(void)
{
int err;
err = register_kprobe(&syscall_kprobe);
if (err) {
pr_err("register_kprobe() failed: %d\n", err);
return err;
}
else{
pr_info("register_kprobe() init: %d\n", err);
}
netlink_init();
return 0;
}
static void __exit audit_exit(void)
{
unregister_kprobe(&syscall_kprobe);
pr_info("kprobe unregistered\n");
netlink_release();
}
module_init(audit_init);
module_exit(audit_exit);
Код: Выделить всё
[ 5336.037341] openat syscall: filename: /run/log/journal/3dfe2f456e1c418781ce6b6d5361db7d/system.journal
[ 5336.037362] openat syscall: filename: /run/log/journal/3dfe2f456e1c418781ce6b6d5361db7d/system.journal
[ 5336.037383] openat syscall: filename: /run/log/journal/3dfe2f456e1c418781ce6b6d5361db7d/system.journal
[ 5336.037403] openat syscall: filename: /run/log/journal/3dfe2f456e1c418781ce6b6d5361db7d/system.journal
я также пытался использовать следующее имя_символа:
__x64_sys_open, __x64_sys_openat, __x64_sys_openat2, do_sys_open, и нет журнала ядра
также я пытался перехватить sys_call_table, но sys_call_table, кажется, больше не существует используется при выполнении системных вызовов, но используется для трассировки.
моя версия ядра: 6.5.0-41-generic
моя система: Ubuntu22.04.4
Подробнее здесь: https://stackoverflow.com/questions/786 ... e-properly
Мобильная версия